v: support for `$if threads {}, depending on whether `go ` was used at all (#10227)
parent
6cdc7646b8
commit
2b62dca000
|
@ -29,6 +29,8 @@ pub mut:
|
||||||
panic_userdata voidptr = voidptr(0) // can be used to pass arbitrary data to panic_handler;
|
panic_userdata voidptr = voidptr(0) // can be used to pass arbitrary data to panic_handler;
|
||||||
panic_npanics int
|
panic_npanics int
|
||||||
cur_fn &FnDecl = 0 // previously stored in Checker.cur_fn and Gen.cur_fn
|
cur_fn &FnDecl = 0 // previously stored in Checker.cur_fn and Gen.cur_fn
|
||||||
|
gostmts int // how many `go` statements there were in the parsed files.
|
||||||
|
// When table.gostmts > 0, __VTHREADS__ is defined, which can be checked with `$if threads {`
|
||||||
}
|
}
|
||||||
|
|
||||||
[unsafe]
|
[unsafe]
|
||||||
|
|
|
@ -28,7 +28,7 @@ const (
|
||||||
'big_endian',
|
'big_endian',
|
||||||
]
|
]
|
||||||
valid_comp_if_other = ['js', 'debug', 'prod', 'test', 'glibc', 'prealloc',
|
valid_comp_if_other = ['js', 'debug', 'prod', 'test', 'glibc', 'prealloc',
|
||||||
'no_bounds_checking', 'freestanding']
|
'no_bounds_checking', 'freestanding', 'threads']
|
||||||
array_builtin_methods = ['filter', 'clone', 'repeat', 'reverse', 'map', 'slice', 'sort',
|
array_builtin_methods = ['filter', 'clone', 'repeat', 'reverse', 'map', 'slice', 'sort',
|
||||||
'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop']
|
'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop']
|
||||||
vroot_is_deprecated_message = '@VROOT is deprecated, use @VMODROOT or @VEXEROOT instead'
|
vroot_is_deprecated_message = '@VROOT is deprecated, use @VMODROOT or @VEXEROOT instead'
|
||||||
|
@ -6157,6 +6157,7 @@ fn (mut c Checker) comp_if_branch(cond ast.Expr, pos token.Position) bool {
|
||||||
'prod' { return !c.pref.is_prod }
|
'prod' { return !c.pref.is_prod }
|
||||||
'test' { return !c.pref.is_test }
|
'test' { return !c.pref.is_test }
|
||||||
'glibc' { return false } // TODO
|
'glibc' { return false } // TODO
|
||||||
|
'threads' { return c.table.gostmts == 0 }
|
||||||
'prealloc' { return !c.pref.prealloc }
|
'prealloc' { return !c.pref.prealloc }
|
||||||
'no_bounds_checking' { return cond.name !in c.pref.compile_defines_all }
|
'no_bounds_checking' { return cond.name !in c.pref.compile_defines_all }
|
||||||
'freestanding' { return !c.pref.is_bare || c.pref.output_cross_c }
|
'freestanding' { return !c.pref.is_bare || c.pref.output_cross_c }
|
||||||
|
|
|
@ -441,6 +441,9 @@ pub fn (mut g Gen) init() {
|
||||||
}
|
}
|
||||||
g.comptime_defines.writeln('')
|
g.comptime_defines.writeln('')
|
||||||
}
|
}
|
||||||
|
if g.table.gostmts > 0 {
|
||||||
|
g.comptime_defines.writeln('#define __VTHREADS__ (1)')
|
||||||
|
}
|
||||||
if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm,
|
if g.pref.gc_mode in [.boehm_full, .boehm_incr, .boehm_full_opt, .boehm_incr_opt, .boehm,
|
||||||
.boehm_leak,
|
.boehm_leak,
|
||||||
] {
|
] {
|
||||||
|
|
|
@ -606,6 +606,9 @@ fn (mut g Gen) comp_if_to_ifdef(name string, is_comptime_optional bool) ?string
|
||||||
return '__cplusplus'
|
return '__cplusplus'
|
||||||
}
|
}
|
||||||
// other:
|
// other:
|
||||||
|
'threads' {
|
||||||
|
return '__VTHREADS__'
|
||||||
|
}
|
||||||
'gcboehm' {
|
'gcboehm' {
|
||||||
return '_VGCBOEHM'
|
return '_VGCBOEHM'
|
||||||
}
|
}
|
||||||
|
|
|
@ -520,6 +520,7 @@ fn (mut p Parser) go_expr() ast.GoExpr {
|
||||||
}
|
}
|
||||||
pos := spos.extend(p.prev_tok.position())
|
pos := spos.extend(p.prev_tok.position())
|
||||||
p.register_auto_import('sync.threads')
|
p.register_auto_import('sync.threads')
|
||||||
|
p.table.gostmts++
|
||||||
return ast.GoExpr{
|
return ast.GoExpr{
|
||||||
call_expr: call_expr
|
call_expr: call_expr
|
||||||
pos: pos
|
pos: pos
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
fn abc() {
|
||||||
|
// go fn() {}()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_if_threads() {
|
||||||
|
$if threads {
|
||||||
|
assert false
|
||||||
|
} $else {
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fn abc() {
|
||||||
|
go fn () {}()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_if_threads() {
|
||||||
|
$if threads {
|
||||||
|
assert true
|
||||||
|
} $else {
|
||||||
|
assert false
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue