cgen: fix c2v consts in .o files
							parent
							
								
									c4b424717c
								
							
						
					
					
						commit
						80c94ea73e
					
				| 
						 | 
				
			
			@ -1840,7 +1840,8 @@ fn (mut g Gen) stmt(node ast.Stmt) {
 | 
			
		|||
		}
 | 
			
		||||
		ast.Module {
 | 
			
		||||
			// g.is_builtin_mod = node.name == 'builtin'
 | 
			
		||||
			g.is_builtin_mod = node.name in ['builtin', 'strconv', 'strings', 'dlmalloc']
 | 
			
		||||
			// g.is_builtin_mod = node.name in ['builtin', 'strconv', 'strings', 'dlmalloc']
 | 
			
		||||
			g.is_builtin_mod = util.module_is_builtin(node.name)
 | 
			
		||||
			// g.cur_mod = node.name
 | 
			
		||||
			g.cur_mod = node
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -3651,11 +3652,23 @@ fn (mut g Gen) ident(node ast.Ident) {
 | 
			
		|||
		g.write(util.no_dots(node.name[2..]))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	mut name := c_name(node.name)
 | 
			
		||||
	if node.kind == .constant { // && !node.name.starts_with('g_') {
 | 
			
		||||
		if g.pref.translated && !g.is_builtin_mod
 | 
			
		||||
			&& !util.module_is_builtin(node.name.all_before_last('.')) {
 | 
			
		||||
			// Don't prepend "_const" to translated C consts,
 | 
			
		||||
			// but only in user code, continue prepending "_const" to builtin consts.
 | 
			
		||||
			mut x := util.no_dots(node.name)
 | 
			
		||||
			if x.starts_with('main__') {
 | 
			
		||||
				x = x['main__'.len..]
 | 
			
		||||
			}
 | 
			
		||||
			g.write(x)
 | 
			
		||||
			return
 | 
			
		||||
		} else {
 | 
			
		||||
			// TODO globals hack
 | 
			
		||||
			g.write('_const_')
 | 
			
		||||
		}
 | 
			
		||||
	mut name := c_name(node.name)
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: temporary, remove this
 | 
			
		||||
	node_info := node.info
 | 
			
		||||
	mut is_auto_heap := false
 | 
			
		||||
| 
						 | 
				
			
			@ -4120,6 +4133,12 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		name := c_name(field.name)
 | 
			
		||||
		const_name := if node.attrs.contains('export') && !g.is_builtin_mod {
 | 
			
		||||
			// TODO this only works for the first const in the group for now
 | 
			
		||||
			node.attrs[0].arg
 | 
			
		||||
		} else {
 | 
			
		||||
			'_const_' + name
 | 
			
		||||
		}
 | 
			
		||||
		field_expr := field.expr
 | 
			
		||||
		match field.expr {
 | 
			
		||||
			ast.ArrayInit {
 | 
			
		||||
| 
						 | 
				
			
			@ -4127,19 +4146,19 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) {
 | 
			
		|||
					styp := g.typ(field.expr.typ)
 | 
			
		||||
					if g.pref.build_mode != .build_module {
 | 
			
		||||
						val := g.expr_string(field.expr)
 | 
			
		||||
						g.definitions.writeln('$styp _const_$name = $val; // fixed array const')
 | 
			
		||||
						g.definitions.writeln('$styp $const_name = $val; // fixed array const')
 | 
			
		||||
					} else {
 | 
			
		||||
						g.definitions.writeln('$styp _const_$name; // fixed array const')
 | 
			
		||||
						g.definitions.writeln('$styp $const_name; // fixed array const')
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					g.const_decl_init_later(field.mod, name, field.expr, field.typ, false)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			ast.StringLiteral {
 | 
			
		||||
				g.definitions.writeln('string _const_$name; // a string literal, inited later')
 | 
			
		||||
				g.definitions.writeln('string $const_name; // a string literal, inited later')
 | 
			
		||||
				if g.pref.build_mode != .build_module {
 | 
			
		||||
					val := g.expr_string(field.expr)
 | 
			
		||||
					g.stringliterals.writeln('\t_const_$name = $val;')
 | 
			
		||||
					g.stringliterals.writeln('\t$const_name = $val;')
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			ast.CallExpr {
 | 
			
		||||
| 
						 | 
				
			
			@ -4183,7 +4202,7 @@ fn (mut g Gen) const_decl(node ast.ConstDecl) {
 | 
			
		|||
 | 
			
		||||
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'
 | 
			
		||||
	cname := if g.pref.translated && !g.is_builtin_mod { name } else { '_const_$name' }
 | 
			
		||||
	$if trace_const_precomputed ? {
 | 
			
		||||
		eprintln('> styp: $styp | cname: $cname | ct_value: $ct_value | $ct_value.type_name()')
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -4252,7 +4271,7 @@ fn (mut g Gen) const_decl_precomputed(mod string, name string, ct_value ast.Comp
 | 
			
		|||
			// 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.definitions.writeln('$styp $cname; // str inited later')
 | 
			
		||||
			g.init.writeln('\t$cname = _SLIT("$escaped_val");')
 | 
			
		||||
			if g.is_autofree {
 | 
			
		||||
				g.cleanups[mod].writeln('\tstring_free(&$cname);')
 | 
			
		||||
| 
						 | 
				
			
			@ -4282,7 +4301,7 @@ fn (mut g Gen) const_decl_init_later(mod string, name string, expr ast.Expr, typ
 | 
			
		|||
	// Initialize more complex consts in `void _vinit/2{}`
 | 
			
		||||
	// (C doesn't allow init expressions that can't be resolved at compile time).
 | 
			
		||||
	mut styp := g.typ(typ)
 | 
			
		||||
	cname := '_const_$name'
 | 
			
		||||
	cname := if g.pref.translated && !g.is_builtin_mod { name } else { '_const_$name' }
 | 
			
		||||
	g.definitions.writeln('$styp $cname; // inited later')
 | 
			
		||||
	if cname == '_const_os__args' {
 | 
			
		||||
		if g.pref.os == .windows {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,10 @@ const (
 | 
			
		|||
	]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
pub fn module_is_builtin(mod string) bool {
 | 
			
		||||
	return mod in util.builtin_module_parts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn tabs(n int) string {
 | 
			
		||||
	return if n < util.const_tabs.len { util.const_tabs[n] } else { '\t'.repeat(n) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue