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
 | 
						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}(')
 | 
						g.write('${fname}(')
 | 
				
			||||||
	if !got_is_ptr {
 | 
						if !got_is_ptr {
 | 
				
			||||||
		if !expr.is_lvalue()
 | 
							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, (')
 | 
								g.write('ADDR($got_styp, (')
 | 
				
			||||||
			rparen_n += 2
 | 
								rparen_n += 2
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
| 
						 | 
					@ -4878,12 +4878,12 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else {
 | 
								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) {
 | 
										if g.const_decl_precomputed(field.mod, name, ct_value, field.typ) {
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if is_simple_define_const(field) {
 | 
									if field.is_simple_define_const() {
 | 
				
			||||||
					// "Simple" expressions are not going to need multiple statements,
 | 
										// "Simple" expressions are not going to need multiple statements,
 | 
				
			||||||
					// only the ones which are inited later, so it's safe to use expr_string
 | 
										// 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))
 | 
										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 {
 | 
					fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.ComptTimeConstValue, typ ast.Type) bool {
 | 
				
			||||||
	mut styp := g.typ(typ)
 | 
						mut styp := g.typ(typ)
 | 
				
			||||||
	cname := '_const_$name'
 | 
						cname := '_const_$name'
 | 
				
			||||||
| 
						 | 
					@ -4953,7 +4934,15 @@ fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.Comp
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		string {
 | 
							string {
 | 
				
			||||||
			escaped_val := util.smart_quote(ct_value, false)
 | 
								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 {
 | 
							ast.EmptyExpr {
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue