Skip to content

Commit 711d7c4

Browse files
authored
type_resolver: support $if T is $pointer { and $if T is $voidptr {, to make it easier to implement a pure V dump(), without cgen specific code (#24628)
1 parent da8d8fa commit 711d7c4

6 files changed

Lines changed: 58 additions & 1 deletion

File tree

‎vlib/v/ast/ast.v‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ pub enum ComptimeTypeKind {
162162
function
163163
option
164164
string
165+
pointer
166+
voidptr
165167
}
166168

167169
pub struct ComptimeType {
@@ -187,6 +189,8 @@ pub fn (cty ComptimeType) str() string {
187189
.function { '\$function' }
188190
.option { '\$option' }
189191
.string { '\$string' }
192+
.pointer { '\$pointer' }
193+
.voidptr { '\$voidptr' }
190194
}
191195
}
192196

‎vlib/v/fmt/fmt.v‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,8 @@ pub fn (mut f Fmt) expr(node_ ast.Expr) {
800800
.function { f.write('\$function') }
801801
.option { f.write('\$option') }
802802
.string { f.write('\$string') }
803+
.pointer { f.write('\$pointer') }
804+
.voidptr { f.write('\$voidptr') }
803805
}
804806
}
805807
}

‎vlib/v/gen/golang/golang.v‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,8 @@ pub fn (mut f Gen) expr(node_ ast.Expr) {
677677
.function { f.write('\$function') }
678678
.option { f.write('\$option') }
679679
.string { f.write('\$string') }
680+
.pointer { f.write('\$pointer') }
681+
.voidptr { f.write('\$voidptr') }
680682
}
681683
}
682684
}

‎vlib/v/parser/comptime.v‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import v.token
1010
const supported_comptime_calls = ['html', 'tmpl', 'env', 'embed_file', 'pkgconfig', 'compile_error',
1111
'compile_warn', 'd', 'res']
1212
const comptime_types = ['map', 'array', 'array_dynamic', 'array_fixed', 'int', 'float', 'struct',
13-
'interface', 'enum', 'sumtype', 'alias', 'function', 'option', 'string']
13+
'interface', 'enum', 'sumtype', 'alias', 'function', 'option', 'string', 'pointer', 'voidptr']
1414

1515
fn (mut p Parser) parse_comptime_type() ast.ComptimeType {
1616
pos := p.tok.pos()
@@ -63,6 +63,12 @@ fn (mut p Parser) parse_comptime_type() ast.ComptimeType {
6363
'string' {
6464
.string
6565
}
66+
'pointer' {
67+
.pointer
68+
}
69+
'voidptr' {
70+
.voidptr
71+
}
6672
else {
6773
.unknown
6874
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
fn g[T](x T, is_pointer bool, is_voidptr bool) {
2+
println('type: ${typeof[T]().name}, isreftype(T): ${isreftype(T)}')
3+
$if T is $pointer {
4+
println('T is \$pointer')
5+
assert is_pointer
6+
} $else {
7+
println('T is NOT a \$pointer')
8+
assert !is_pointer
9+
}
10+
$if T is $voidptr {
11+
println('T is \$voidptr')
12+
assert is_voidptr
13+
} $else {
14+
println('T is NOT a \$voidptr')
15+
assert !is_voidptr
16+
}
17+
println('--------------------------')
18+
}
19+
20+
struct Abc {}
21+
22+
fn test_is_pointer_and_is_voidptr() {
23+
unsafe {
24+
g(voidptr(123), true, true)
25+
g(&char(456), true, false)
26+
//
27+
g(int(1000), false, false)
28+
g(&int(1001), true, false)
29+
g(&&int(1002), true, false)
30+
g(&&&int(1003), true, false)
31+
//
32+
g(Abc{}, false, false)
33+
g(&Abc(10001), true, false)
34+
g(&&Abc(10002), true, false)
35+
g(&&&Abc(10003), true, false)
36+
}
37+
}

‎vlib/v/type_resolver/comptime_resolver.v‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,12 @@ pub fn (t &TypeResolver) is_comptime_type(x ast.Type, y ast.ComptimeType) bool {
249249
.string {
250250
return x_kind == .string
251251
}
252+
.voidptr {
253+
return x.is_voidptr()
254+
}
255+
.pointer {
256+
return x.is_any_kind_of_pointer()
257+
}
252258
.int {
253259
return x_kind in [.i8, .i16, .i32, .int, .i64, .u8, .u16, .u32, .u64, .usize, .isize,
254260
.int_literal]

0 commit comments

Comments
 (0)