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