]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use separate C statements for array creation expressions
authorJürg Billeter <j@bitron.ch>
Sun, 10 Oct 2010 08:59:23 +0000 (10:59 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 10 Oct 2010 09:34:20 +0000 (11:34 +0200)
codegen/valaccodearraymodule.vala
codegen/valadovaarraymodule.vala

index 40c4e9b9db57ecce6e56e391a20ab9955a17d7dc..000e483e6fe31cd9a14bf6cd1bbe26aede589c48 100644 (file)
@@ -27,12 +27,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
        int next_array_dup_id = 0;
        int next_array_add_id = 0;
 
-       void append_initializer_list (CCodeCommaExpression ce, CCodeExpression name_cnode, InitializerList initializer_list, int rank, ref int i) {
+       void append_initializer_list (CCodeExpression name_cnode, InitializerList initializer_list, int rank, ref int i) {
                foreach (Expression e in initializer_list.get_initializers ()) {
                        if (rank > 1) {
-                               append_initializer_list (ce, name_cnode, (InitializerList) e, rank - 1, ref i);
+                               append_initializer_list (name_cnode, (InitializerList) e, rank - 1, ref i);
                        } else {
-                               ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
+                               ccode.add_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
                                i++;
                        }
                }
@@ -43,18 +43,15 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                if (array_type != null && array_type.fixed_length) {
                        // no heap allocation for fixed-length arrays
 
-                       var ce = new CCodeCommaExpression ();
                        var temp_var = get_temp_variable (array_type, true, expr);
                        var name_cnode = get_variable_cexpression (temp_var.name);
                        int i = 0;
 
                        emit_temp_var (temp_var);
 
-                       append_initializer_list (ce, name_cnode, expr.initializer_list, expr.rank, ref i);
+                       append_initializer_list (name_cnode, expr.initializer_list, expr.rank, ref i);
 
-                       ce.append_expression (name_cnode);
-
-                       set_cvalue (expr, ce);
+                       set_cvalue (expr, name_cnode);
 
                        return;
                }
@@ -110,24 +107,19 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        gnew.add_argument (csizeof);
                }
 
-               if (expr.initializer_list != null) {
-                       var ce = new CCodeCommaExpression ();
-                       var temp_var = get_temp_variable (expr.value_type, true, expr);
-                       var name_cnode = get_variable_cexpression (temp_var.name);
-                       int i = 0;
-                       
-                       emit_temp_var (temp_var);
-                       
-                       ce.append_expression (new CCodeAssignment (name_cnode, gnew));
+               var temp_var = get_temp_variable (expr.value_type, true, expr);
+               var name_cnode = get_variable_cexpression (temp_var.name);
+               int i = 0;
 
-                       append_initializer_list (ce, name_cnode, expr.initializer_list, expr.rank, ref i);
-                       
-                       ce.append_expression (name_cnode);
-                       
-                       set_cvalue (expr, ce);
-               } else {
-                       set_cvalue (expr, gnew);
+               emit_temp_var (temp_var);
+
+               ccode.add_expression (new CCodeAssignment (name_cnode, gnew));
+
+               if (expr.initializer_list != null) {
+                       append_initializer_list (name_cnode, expr.initializer_list, expr.rank, ref i);
                }
+
+               set_cvalue (expr, name_cnode);
        }
 
        public override string get_array_length_cname (string array_cname, int dim) {
index ff9fd60c812c81bb60cdb4d58c59fb91f2badf62..aa91761cf7b58599ae5813d7868660233e13d9c5 100644 (file)
@@ -21,9 +21,9 @@
  */
 
 public class Vala.DovaArrayModule : DovaMethodCallModule {
-       void append_initializer_list (CCodeCommaExpression ce, CCodeExpression name_cnode, InitializerList initializer_list, ref int i) {
+       void append_initializer_list (CCodeExpression name_cnode, InitializerList initializer_list, ref int i) {
                foreach (Expression e in initializer_list.get_initializers ()) {
-                       ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
+                       ccode.add_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), get_cvalue (e)));
                        i++;
                }
        }
@@ -33,18 +33,15 @@ public class Vala.DovaArrayModule : DovaMethodCallModule {
                if (array_type != null && array_type.fixed_length) {
                        // no heap allocation for fixed-length arrays
 
-                       var ce = new CCodeCommaExpression ();
                        var temp_var = get_temp_variable (array_type, true, expr);
                        var name_cnode = new CCodeIdentifier (temp_var.name);
                        int i = 0;
 
                        emit_temp_var (temp_var);
 
-                       append_initializer_list (ce, name_cnode, expr.initializer_list, ref i);
+                       append_initializer_list (name_cnode, expr.initializer_list, ref i);
 
-                       ce.append_expression (name_cnode);
-
-                       set_cvalue (expr, ce);
+                       set_cvalue (expr, name_cnode);
 
                        return;
                }
@@ -57,7 +54,14 @@ public class Vala.DovaArrayModule : DovaMethodCallModule {
                // length of new array
                array_new.add_argument (get_cvalue (expr.get_sizes ().get (0)));
 
-               set_cvalue (expr, array_new);
+               var temp_var = get_temp_variable (expr.value_type, true, expr);
+               var name_cnode = get_variable_cexpression (temp_var.name);
+
+               emit_temp_var (temp_var);
+
+               ccode.add_expression (new CCodeAssignment (name_cnode, array_new));
+
+               set_cvalue (expr, name_cnode);
        }
 
        public override void visit_element_access (ElementAccess expr) {