1
0
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:
Delyan Angelov 2022-10-08 13:14:26 +03:00 committed by GitHub
parent 272b3cf8c3
commit 754c387d1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 1 deletions

View File

@ -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]

View File

@ -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
View 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() == ''
}

View File

@ -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

View File

@ -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)?

View File

@ -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
}