2008-03-22 Jürg Billeter <j@bitron.ch>
+ * ccode/valaccodedeclaration.vala, gobject/valaccodegenerator.vala:
+ use extern appropriately for static fields,
+ based on patch by Daniel Silverstone, fixes bug 523768
+
+2008-03-22 Jürg Billeter <j@bitron.ch>
+
* vala/parser.y: fix source reference of fields,
patch by Daniel Silverstone, fixes bug 523761
/* valaccodedeclaration.vala
*
- * Copyright (C) 2006-2007 Jürg Billeter
+ * Copyright (C) 2006-2008 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
if ((modifiers & CCodeModifiers.STATIC) != 0) {
writer.write_string ("static ");
}
+ if ((modifiers & CCodeModifiers.EXTERN) != 0 && !has_initializer ()) {
+ writer.write_string ("extern ");
+ }
writer.write_string (type_name);
writer.write_string (" ");
}
}
+ private bool has_initializer () {
+ foreach (CCodeDeclarator decl in declarators) {
+ var var_decl = decl as CCodeVariableDeclarator;
+ if (var_decl != null && var_decl.initializer == null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public override void write_declaration (CCodeWriter! writer) {
if ((modifiers & (CCodeModifiers.STATIC | CCodeModifiers.EXTERN)) != 0) {
// no separate declaration for static variables
cdecl.modifiers = CCodeModifiers.EXTERN;
header_type_member_declaration.append (cdecl);
+ var var_decl = new CCodeVariableDeclarator (f.get_cname ());
+ var_decl.initializer = default_value_for_type (f.type_reference);
+
if (f.initializer != null) {
var init = (CCodeExpression) f.initializer.ccodenode;
if (is_constant_ccode_expression (init)) {
- var cinit_decl = new CCodeDeclaration (field_ctype);
- var var_decl = new CCodeVariableDeclarator (f.get_cname ());
var_decl.initializer = init;
- cinit_decl.add_declarator (var_decl);
- cinit_decl.modifiers = CCodeModifiers.EXTERN;
- source_type_member_declaration.append (cinit_decl);
}
}
+ var var_def = new CCodeDeclaration (field_ctype);
+ var_def.add_declarator (var_decl);
+ var_def.modifiers = CCodeModifiers.EXTERN;
+ source_type_member_declaration.append (var_def);
+
lhs = new CCodeIdentifier (f.get_cname ());
}
} else if (f.access == SymbolAccessibility.PRIVATE) {