ci: fix MSVC build (delay const string initialiastion to _vinit)
							parent
							
								
									8ea576783b
								
							
						
					
					
						commit
						83b0a80ff4
					
				|  | @ -174,3 +174,24 @@ pub fn (val ComptTimeConstValue) byte() ?byte { | |||
| 	} | ||||
| 	return none | ||||
| } | ||||
| 
 | ||||
| pub fn (obj ConstField) comptime_expr_value() ?ComptTimeConstValue { | ||||
| 	if obj.comptime_expr_value !is EmptyExpr { | ||||
| 		return obj.comptime_expr_value | ||||
| 	} | ||||
| 	return none | ||||
| } | ||||
| 
 | ||||
| pub fn (obj ConstField) is_simple_define_const() bool { | ||||
| 	return match obj.expr { | ||||
| 		CharLiteral, FloatLiteral, IntegerLiteral { true } | ||||
| 		else { false } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| pub fn (obj ScopeObject) is_simple_define_const() bool { | ||||
| 	if obj is ConstField { | ||||
| 		return obj.is_simple_define_const() | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  |  | |||
|  | @ -1838,7 +1838,7 @@ fn (mut g Gen) call_cfn_for_casting_expr(fname string, expr ast.Expr, exp_is_ptr | |||
| 	g.write('${fname}(') | ||||
| 	if !got_is_ptr { | ||||
| 		if !expr.is_lvalue() | ||||
| 			|| (expr is ast.Ident && is_simple_define_const((expr as ast.Ident).obj)) { | ||||
| 			|| (expr is ast.Ident && (expr as ast.Ident).obj.is_simple_define_const()) { | ||||
| 			g.write('ADDR($got_styp, (') | ||||
| 			rparen_n += 2 | ||||
| 		} else { | ||||
|  | @ -4878,12 +4878,12 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) { | |||
| 				} | ||||
| 			} | ||||
| 			else { | ||||
| 				if ct_value := comptime_expr_value(field) { | ||||
| 				if ct_value := field.comptime_expr_value() { | ||||
| 					if g.const_decl_precomputed(field.mod, name, ct_value, field.typ) { | ||||
| 						continue | ||||
| 					} | ||||
| 				} | ||||
| 				if is_simple_define_const(field) { | ||||
| 				if field.is_simple_define_const() { | ||||
| 					// "Simple" expressions are not going to need multiple statements,
 | ||||
| 					// only the ones which are inited later, so it's safe to use expr_string
 | ||||
| 					g.const_decl_simple_define(name, g.expr_string(field_expr)) | ||||
|  | @ -4895,25 +4895,6 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn comptime_expr_value(obj ast.ScopeObject) ?ast.ComptTimeConstValue { | ||||
| 	if obj is ast.ConstField { | ||||
| 		if obj.comptime_expr_value !is ast.EmptyExpr { | ||||
| 			return obj.comptime_expr_value | ||||
| 		} | ||||
| 	} | ||||
| 	return none | ||||
| } | ||||
| 
 | ||||
| fn is_simple_define_const(obj ast.ScopeObject) bool { | ||||
| 	if obj is ast.ConstField { | ||||
| 		return match obj.expr { | ||||
| 			ast.CharLiteral, ast.FloatLiteral, ast.IntegerLiteral { true } | ||||
| 			else { false } | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.ComptTimeConstValue, typ ast.Type) bool { | ||||
| 	mut styp := g.typ(typ) | ||||
| 	cname := '_const_$name' | ||||
|  | @ -4953,7 +4934,15 @@ fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.Comp | |||
| 		} | ||||
| 		string { | ||||
| 			escaped_val := util.smart_quote(ct_value, false) | ||||
| 			g.const_decl_write_precomputed(styp, cname, '_SLIT("$escaped_val")') | ||||
| 			// g.const_decl_write_precomputed(styp, cname, '_SLIT("$escaped_val")')
 | ||||
| 			// TODO: ^ the above for strings, cause:
 | ||||
| 			// `error C2099: initializer is not a constant` errors in MSVC,
 | ||||
| 			// so fall back to the delayed initialisation scheme:
 | ||||
| 			g.definitions.writeln('$styp $cname; // inited later') | ||||
| 			g.inits[mod].writeln('\t$cname = _SLIT("$escaped_val");') | ||||
| 			if g.is_autofree { | ||||
| 				g.cleanups[mod].writeln('\tstring_free(&$cname);') | ||||
| 			} | ||||
| 		} | ||||
| 		ast.EmptyExpr { | ||||
| 			return false | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue