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 rtld_next = voidptr(-1)
|
||||
|
||||
// get_shared_library_extension returns the platform dependent shared library extension
|
||||
// i.e. .dll on windows, .so on most unixes, .dylib on macos.
|
||||
[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
|
||||
// call to dlerror()
|
||||
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
|
||||
| u64
|
||||
| u8
|
||||
| voidptr
|
||||
|
||||
pub fn empty_comptime_const_expr() ComptTimeConstValue {
|
||||
return EmptyExpr(0)
|
||||
@ -42,6 +43,17 @@ pub fn (val ComptTimeConstValue) int() ?int {
|
||||
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 {
|
||||
match val {
|
||||
i8 {
|
||||
@ -88,6 +100,9 @@ pub fn (val ComptTimeConstValue) i64() ?i64 {
|
||||
rune {
|
||||
return int(val)
|
||||
}
|
||||
voidptr {
|
||||
return i64(val)
|
||||
}
|
||||
EmptyExpr {}
|
||||
}
|
||||
return none
|
||||
@ -164,6 +179,9 @@ pub fn (val ComptTimeConstValue) u64() ?u64 {
|
||||
string {
|
||||
return val.u64()
|
||||
}
|
||||
voidptr {
|
||||
return u64(val)
|
||||
}
|
||||
rune {}
|
||||
EmptyExpr {}
|
||||
}
|
||||
@ -210,6 +228,7 @@ pub fn (val ComptTimeConstValue) f64() ?f64 {
|
||||
string {
|
||||
return val.f64()
|
||||
}
|
||||
voidptr {}
|
||||
rune {}
|
||||
EmptyExpr {}
|
||||
}
|
||||
@ -254,6 +273,9 @@ pub fn (val ComptTimeConstValue) string() ?string {
|
||||
string {
|
||||
return val
|
||||
}
|
||||
voidptr {
|
||||
return ptr_str(val)
|
||||
}
|
||||
EmptyExpr {}
|
||||
}
|
||||
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 {
|
||||
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 {
|
||||
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);')
|
||||
}
|
||||
}
|
||||
voidptr {
|
||||
g.const_decl_write_precomputed(mod, styp, cname, field_name, '(voidptr)(0x$ct_value)')
|
||||
}
|
||||
ast.EmptyExpr {
|
||||
return false
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user