]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Only move initializer to declaration when reordering is safe
authorJürg Billeter <j@bitron.ch>
Sun, 27 Sep 2009 08:03:24 +0000 (10:03 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 27 Sep 2009 08:49:45 +0000 (10:49 +0200)
In general it is not safe to move non-constant initializer lists
to the variable declaration at the beginning of the block.

ccode/valaccodevariabledeclarator.vala
codegen/valaccodebasemodule.vala
codegen/valadbusclientmodule.vala
codegen/valadbusmodule.vala

index fdb9dfab86bc71961c7dd2d795ed6e32b1a73e78..cf3a9c228f7d903344cf25244f9538cede22b6f3 100644 (file)
@@ -41,12 +41,25 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator {
         */
        public string? declarator_suffix { get; set; }
 
+       /**
+        * Initializer only used to zero memory, safe to initialize as part
+        * of declaration at beginning of block instead of separate assignment.
+        */
+       public bool init0 { get; set; }
+
        public CCodeVariableDeclarator (string name, CCodeExpression? initializer = null, string? declarator_suffix = null) {
                this.name = name;
                this.initializer = initializer;
                this.declarator_suffix = declarator_suffix;
        }
 
+       public CCodeVariableDeclarator.zero (string name, CCodeExpression initializer, string? declarator_suffix = null) {
+               this.name = name;
+               this.initializer = initializer;
+               this.declarator_suffix = declarator_suffix;
+               this.init0 = true;
+       }
+
        public override void write (CCodeWriter writer) {
                writer.write_string (name);
                if (declarator_suffix != null) {
@@ -65,15 +78,14 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator {
                        writer.write_string (declarator_suffix);
                }
 
-               // initializer lists can't be moved to a separate statement
-               if (initializer is CCodeInitializerList) {
+               if (init0) {
                        writer.write_string (" = ");
                        initializer.write (writer);
                }
        }
 
        public override void write_initialization (CCodeWriter writer) {
-               if (initializer != null && !(initializer is CCodeInitializerList)) {
+               if (initializer != null && !init0) {
                        writer.write_indent (line);
 
                        writer.write_string (name);
index d20c8fac0a7d0f6817136133d7a533835014bfeb..96835b299a2a38c1933496a5a5c5b564aad4e319 100644 (file)
@@ -2091,6 +2091,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                        // initialization not necessary for variables stored in closure
                        if (cvar.initializer == null) {
                                cvar.initializer = default_value_for_type (local.variable_type, true);
+                               cvar.init0 = true;
                        }
                }
 
@@ -2724,9 +2725,11 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                        clist.append (new CCodeConstant ("0"));
 
                                        vardecl.initializer = clist;
+                                       vardecl.init0 = true;
                                } else if (local.variable_type.is_reference_type_or_type_parameter () ||
                                       local.variable_type.nullable) {
                                        vardecl.initializer = new CCodeConstant ("NULL");
+                                       vardecl.init0 = true;
                                }
                        
                                cfrag.append (cdecl);
index 0de4e179d6f505b140b21fadf0f7221d41c63668..23158536b957c0513262fb81908c2d2d997ed01b 100644 (file)
@@ -293,7 +293,7 @@ internal class Vala.DBusClientModule : DBusModule {
                                        cvalinit.append (new CCodeConstant ("0"));
 
                                        var cval_decl = new CCodeDeclaration ("GValue");
-                                       cval_decl.add_declarator (new CCodeVariableDeclarator (val_name, cvalinit));
+                                       cval_decl.add_declarator (new CCodeVariableDeclarator.zero (val_name, cvalinit));
                                        block.add_statement (cval_decl);
 
                                        var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (val_name));
@@ -624,7 +624,7 @@ internal class Vala.DBusClientModule : DBusModule {
                cvalinit.append (new CCodeConstant ("0"));
 
                var cval_decl = new CCodeDeclaration ("GValue");
-               cval_decl.add_declarator (new CCodeVariableDeclarator ("gvalue", cvalinit));
+               cval_decl.add_declarator (new CCodeVariableDeclarator.zero ("gvalue", cvalinit));
                block.add_statement (cval_decl);
 
                var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue"));
@@ -679,7 +679,7 @@ internal class Vala.DBusClientModule : DBusModule {
                cvalinit.append (new CCodeConstant ("0"));
 
                var cval_decl = new CCodeDeclaration ("GValue");
-               cval_decl.add_declarator (new CCodeVariableDeclarator ("gvalue", cvalinit));
+               cval_decl.add_declarator (new CCodeVariableDeclarator.zero ("gvalue", cvalinit));
                block.add_statement (cval_decl);
 
                var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("gvalue"));
index 1fbd47374c74c7d9c486c67b5ffaa757e31d235c..ac6007d1bcc93ebc0414bb45f52d4daaa7d1a3c0 100644 (file)
@@ -373,7 +373,7 @@ internal class Vala.DBusModule : GAsyncModule {
                cvalinit.append (new CCodeConstant ("0"));
 
                var cdecl = new CCodeDeclaration ("GValue");
-               cdecl.add_declarator (new CCodeVariableDeclarator (temp_name, cvalinit));
+               cdecl.add_declarator (new CCodeVariableDeclarator.zero (temp_name, cvalinit));
                fragment.append (cdecl);
 
                cdecl = new CCodeDeclaration ("DBusMessageIter");