mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen,checker: support simple voidptr casts in consts, without delaying the initialisation to _vinit (#15996)
This commit is contained in:
parent
272b3cf8c3
commit
754c387d1b
|
@ -4,6 +4,8 @@ pub const version = 1
|
||||||
|
|
||||||
pub const dl_ext = get_shared_library_extension()
|
pub const dl_ext = get_shared_library_extension()
|
||||||
|
|
||||||
|
pub const rtld_next = voidptr(-1)
|
||||||
|
|
||||||
// get_shared_library_extension returns the platform dependent shared library extension
|
// get_shared_library_extension returns the platform dependent shared library extension
|
||||||
// i.e. .dll on windows, .so on most unixes, .dylib on macos.
|
// i.e. .dll on windows, .so on most unixes, .dylib on macos.
|
||||||
[inline]
|
[inline]
|
||||||
|
|
|
@ -38,5 +38,9 @@ pub fn sym(handle voidptr, symbol string) voidptr {
|
||||||
// that occurred from a call to one of the `dl` functions, since the last
|
// that occurred from a call to one of the `dl` functions, since the last
|
||||||
// call to dlerror()
|
// call to dlerror()
|
||||||
pub fn dlerror() string {
|
pub fn dlerror() string {
|
||||||
return unsafe { cstring_to_vstring(C.dlerror()) }
|
sptr := C.dlerror()
|
||||||
|
if sptr == unsafe { nil } {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
return unsafe { cstring_to_vstring(sptr) }
|
||||||
}
|
}
|
||||||
|
|
14
vlib/dl/rtld_next_test.v
Normal file
14
vlib/dl/rtld_next_test.v
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import dl
|
||||||
|
|
||||||
|
type RealOpen = fn (charptr, int, int) int
|
||||||
|
|
||||||
|
fn test_rtld_next() {
|
||||||
|
$if windows {
|
||||||
|
println('skipping test_rtld_next on windows')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
real_open := RealOpen((dl.sym(dl.rtld_next, 'open')))
|
||||||
|
println(ptr_str(real_open))
|
||||||
|
assert real_open != unsafe { nil }
|
||||||
|
assert dl.dlerror() == ''
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ pub type ComptTimeConstValue = EmptyExpr
|
||||||
| u32
|
| u32
|
||||||
| u64
|
| u64
|
||||||
| u8
|
| u8
|
||||||
|
| voidptr
|
||||||
|
|
||||||
pub fn empty_comptime_const_expr() ComptTimeConstValue {
|
pub fn empty_comptime_const_expr() ComptTimeConstValue {
|
||||||
return EmptyExpr(0)
|
return EmptyExpr(0)
|
||||||
|
@ -42,6 +43,17 @@ pub fn (val ComptTimeConstValue) int() ?int {
|
||||||
return none
|
return none
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (val ComptTimeConstValue) voidptr() ?voidptr {
|
||||||
|
match val {
|
||||||
|
i8, i16, int, i64 { return voidptr(i64(val)) }
|
||||||
|
u8, u16, u32, u64 { return voidptr(u64(val)) }
|
||||||
|
rune { return voidptr(u64(val)) }
|
||||||
|
voidptr { return val }
|
||||||
|
string, EmptyExpr, f32, f64 {}
|
||||||
|
}
|
||||||
|
return none
|
||||||
|
}
|
||||||
|
|
||||||
pub fn (val ComptTimeConstValue) i64() ?i64 {
|
pub fn (val ComptTimeConstValue) i64() ?i64 {
|
||||||
match val {
|
match val {
|
||||||
i8 {
|
i8 {
|
||||||
|
@ -88,6 +100,9 @@ pub fn (val ComptTimeConstValue) i64() ?i64 {
|
||||||
rune {
|
rune {
|
||||||
return int(val)
|
return int(val)
|
||||||
}
|
}
|
||||||
|
voidptr {
|
||||||
|
return i64(val)
|
||||||
|
}
|
||||||
EmptyExpr {}
|
EmptyExpr {}
|
||||||
}
|
}
|
||||||
return none
|
return none
|
||||||
|
@ -164,6 +179,9 @@ pub fn (val ComptTimeConstValue) u64() ?u64 {
|
||||||
string {
|
string {
|
||||||
return val.u64()
|
return val.u64()
|
||||||
}
|
}
|
||||||
|
voidptr {
|
||||||
|
return u64(val)
|
||||||
|
}
|
||||||
rune {}
|
rune {}
|
||||||
EmptyExpr {}
|
EmptyExpr {}
|
||||||
}
|
}
|
||||||
|
@ -210,6 +228,7 @@ pub fn (val ComptTimeConstValue) f64() ?f64 {
|
||||||
string {
|
string {
|
||||||
return val.f64()
|
return val.f64()
|
||||||
}
|
}
|
||||||
|
voidptr {}
|
||||||
rune {}
|
rune {}
|
||||||
EmptyExpr {}
|
EmptyExpr {}
|
||||||
}
|
}
|
||||||
|
@ -254,6 +273,9 @@ pub fn (val ComptTimeConstValue) string() ?string {
|
||||||
string {
|
string {
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
voidptr {
|
||||||
|
return ptr_str(val)
|
||||||
|
}
|
||||||
EmptyExpr {}
|
EmptyExpr {}
|
||||||
}
|
}
|
||||||
return none
|
return none
|
||||||
|
|
|
@ -224,6 +224,10 @@ fn (mut c Checker) eval_comptime_const_expr(expr ast.Expr, nlevel int) ?ast.Comp
|
||||||
if expr.typ == ast.f64_type {
|
if expr.typ == ast.f64_type {
|
||||||
return cast_expr_value.f64() or { return none }
|
return cast_expr_value.f64() or { return none }
|
||||||
}
|
}
|
||||||
|
if expr.typ == ast.voidptr_type {
|
||||||
|
ptrvalue := cast_expr_value.voidptr() or { return none }
|
||||||
|
return ast.ComptTimeConstValue(ptrvalue)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ast.InfixExpr {
|
ast.InfixExpr {
|
||||||
left := c.eval_comptime_const_expr(expr.left, nlevel + 1)?
|
left := c.eval_comptime_const_expr(expr.left, nlevel + 1)?
|
||||||
|
|
|
@ -4716,6 +4716,9 @@ fn (mut g Gen) const_decl_precomputed(mod string, name string, field_name string
|
||||||
g.cleanups[mod].writeln('\tstring_free(&$cname);')
|
g.cleanups[mod].writeln('\tstring_free(&$cname);')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
voidptr {
|
||||||
|
g.const_decl_write_precomputed(mod, styp, cname, field_name, '(voidptr)(0x$ct_value)')
|
||||||
|
}
|
||||||
ast.EmptyExpr {
|
ast.EmptyExpr {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user