]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use separate C statements for object creation expressions
authorJürg Billeter <j@bitron.ch>
Sun, 10 Oct 2010 07:52:06 +0000 (09:52 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 10 Oct 2010 08:45:24 +0000 (10:45 +0200)
codegen/valaccodebasemodule.vala
codegen/valadovabasemodule.vala

index 7a29f1f14ee12e746b064d207afb18e0b0449395..5adc2a31eb88c60e5241485d8993fe73024831da 100644 (file)
@@ -4226,8 +4226,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                var local = expr.parent_node as LocalVariable;
                if (local != null && has_simple_struct_initializer (local)) {
-                       // no comma expression necessary
+                       // no temporary variable necessary
                        set_cvalue (expr, creation_expr);
+                       return;
                } else if (instance != null) {
                        var ccomma = new CCodeCommaExpression ();
 
@@ -4287,9 +4288,17 @@ public class Vala.CCodeBaseModule : CodeGenerator {
 
                        ccomma.append_expression (instance);
 
-                       set_cvalue (expr, ccomma);
-               } else if (creation_expr != null) {
-                       set_cvalue (expr, creation_expr);
+                       creation_expr = ccomma;
+               }
+
+               if (creation_expr != null) {
+                       var temp_var = get_temp_variable (expr.value_type);
+                       var temp_ref = get_variable_cexpression (temp_var.name);
+
+                       emit_temp_var (temp_var);
+
+                       ccode.add_expression (new CCodeAssignment (temp_ref, creation_expr));
+                       set_cvalue (expr, temp_ref);
                }
        }
 
index 7eb81b68a69e0c772306dfc615bdf7572b0e031b..2c66c8c100639cf2242a837f632586d1eee953b1 100644 (file)
@@ -1706,9 +1706,17 @@ public class Vala.DovaBaseModule : CodeGenerator {
 
                        ccomma.append_expression (instance);
 
-                       set_cvalue (expr, ccomma);
-               } else if (creation_expr != null) {
-                       set_cvalue (expr, creation_expr);
+                       creation_expr = ccomma;
+               }
+
+               if (creation_expr != null) {
+                       var temp_var = get_temp_variable (expr.value_type);
+                       var temp_ref = get_variable_cexpression (temp_var.name);
+
+                       emit_temp_var (temp_var);
+
+                       ccode.add_expression (new CCodeAssignment (temp_ref, creation_expr));
+                       set_cvalue (expr, temp_ref);
                }
        }