use extern appropriately for static fields, based on patch by Daniel
authorJuerg Billeter <j@bitron.ch>
Sat, 22 Mar 2008 22:03:19 +0000 (22:03 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 22 Mar 2008 22:03:19 +0000 (22:03 +0000)
2008-03-22  Juerg 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

svn path=/trunk/; revision=1150

ChangeLog
ccode/valaccodedeclaration.vala
gobject/valaccodegenerator.vala

index cda8b31..e7ae469 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 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
 
index b2ebc79..21c87d3 100644 (file)
@@ -1,6 +1,6 @@
 /* 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
@@ -58,6 +58,9 @@ public class Vala.CCodeDeclaration : CCodeStatement {
                        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 (" ");
                
@@ -80,6 +83,16 @@ public class Vala.CCodeDeclaration : CCodeStatement {
                }
        }
 
+       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
index ce81bbb..f9f33e4 100644 (file)
@@ -517,18 +517,21 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                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) {