@@ -434,7 +434,6 @@ fn (mut g Gen) global_decl(node ast.GlobalDecl) {
434434 g.inside_cinit = false
435435 g.inside_global_decl = false
436436 }
437- cextern := node.attrs.contains ('c_extern' )
438437 should_init := (! g.pref.use_cache && g.pref.build_mode != .build_module)
439438 || (g.pref.build_mode == .build_module && g.module_built == node.mod)
440439 mut attributes := ''
@@ -475,18 +474,23 @@ fn (mut g Gen) global_decl(node ast.GlobalDecl) {
475474 }
476475 mut def_builder := strings.new_builder (100 )
477476 mut init := ''
478- extern := if cextern { 'extern ' } else { '' }
477+ extern := if field.is_extern { 'extern ' } else { '' }
479478 modifier := if field.is_volatile { ' volatile ' } else { '' }
480- def_builder. write_string ( ' ${extern}${visibility_kw}${modifier}${styp} ${attributes}${ field.name} ' )
481- if cextern {
482- def_builder.writeln ('; // global 2' )
479+ final_c_name := field.name. all_after ( 'C. ' )
480+ if field.is_extern {
481+ def_builder.writeln ('${extern}${visibility_kw}${modifier}${styp} ${attributes}${final_c_name} ; // global 2' )
483482 g.global_const_defs[name] = GlobalConstDef{
484483 mod: node.mod
485484 def: def_builder.str ()
486485 order: - 1
487486 }
488487 continue
489488 }
489+ mut needs_ending_semicolon := false
490+ if field.language != .c || field.has_expr {
491+ def_builder.write_string ('${extern}${visibility_kw}${modifier}${styp} ${attributes}${final_c_name} ' )
492+ needs_ending_semicolon = true
493+ }
490494 if field.has_expr || cinit {
491495 // `__global x = unsafe { nil }` should still use the simple direct initialisation, `g_main_argv` needs it.
492496 mut is_simple_unsafe_expr := false
@@ -510,29 +514,34 @@ fn (mut g Gen) global_decl(node ast.GlobalDecl) {
510514 // More complex expressions need to be moved to `_vinit()`
511515 // e.g. `__global ( mygblobal = 'hello ' + world' )`
512516 if field.name in ['g_main_argc' , 'g_main_argv' ] {
513- init = '\t // skipping ${field.name } , it was initialised in main'
517+ init = '\t // skipping ${final_c_name } , it was initialised in main'
514518 } else {
515- init = '\t ${field.name } = ${g.expr_string(field.expr)} ; // global 3'
519+ init = '\t ${final_c_name } = ${g.expr_string(field.expr)} ; // global 3'
516520 }
517521 }
518- } else if ! g.pref.translated { // don't zero globals from C code
522+ } else if ! g.pref.translated && field.language == .v {
523+ // don't zero globals from C code
519524 g.type_default_vars.clear ()
520525 default_initializer := g.type_default (field.typ)
521526 if default_initializer == '{0}' && should_init {
522527 def_builder.write_string (' = {0}' )
523528 } else if default_initializer == '{E_STRUCT}' && should_init {
524- init = '\t memcpy(${field.name } , (${styp} ){${default_initializer} }, sizeof(${styp} )); // global 4'
529+ init = '\t memcpy(${final_c_name } , (${styp} ){${default_initializer} }, sizeof(${styp} )); // global 4'
525530 } else {
526531 if field.name ! in ['as_cast_type_indexes' , 'g_memory_block' , 'global_allocator' ] {
527532 decls := g.type_default_vars.str ()
528533 if decls != '' {
529534 init = '\t ${decls} '
530535 }
531- init + = '\t ${field.name } = *(${styp} *)&((${styp} []){${default_initializer} }[0]); // global 5'
536+ init + = '\t ${final_c_name } = *(${styp} *)&((${styp} []){${default_initializer} }[0]); // global 5'
532537 }
533538 }
539+ } else {
540+ def_builder.writeln ('/* skip C global: ${final_c_name} */' )
541+ }
542+ if needs_ending_semicolon {
543+ def_builder.writeln ('; // global 6' )
534544 }
535- def_builder.writeln ('; // global 6' )
536545 g.global_const_defs[name] = GlobalConstDef{
537546 mod: node.mod
538547 def: def_builder.str ()
0 commit comments