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_npanics    int | ||||
| 	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] | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ const ( | |||
| 		'big_endian', | ||||
| 	] | ||||
| 	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', | ||||
| 		'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop'] | ||||
| 	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 } | ||||
| 					'test' { return !c.pref.is_test } | ||||
| 					'glibc' { return false } // TODO
 | ||||
| 					'threads' { return c.table.gostmts == 0 } | ||||
| 					'prealloc' { return !c.pref.prealloc } | ||||
| 					'no_bounds_checking' { return cond.name !in c.pref.compile_defines_all } | ||||
| 					'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('') | ||||
| 	} | ||||
| 	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, | ||||
| 		.boehm_leak, | ||||
| 	] { | ||||
|  |  | |||
|  | @ -606,6 +606,9 @@ fn (mut g Gen) comp_if_to_ifdef(name string, is_comptime_optional bool) ?string | |||
| 			return '__cplusplus' | ||||
| 		} | ||||
| 		// other:
 | ||||
| 		'threads' { | ||||
| 			return '__VTHREADS__' | ||||
| 		} | ||||
| 		'gcboehm' { | ||||
| 			return '_VGCBOEHM' | ||||
| 		} | ||||
|  |  | |||
|  | @ -520,6 +520,7 @@ fn (mut p Parser) go_expr() ast.GoExpr { | |||
| 	} | ||||
| 	pos := spos.extend(p.prev_tok.position()) | ||||
| 	p.register_auto_import('sync.threads') | ||||
| 	p.table.gostmts++ | ||||
| 	return ast.GoExpr{ | ||||
| 		call_expr: call_expr | ||||
| 		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