]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use separate C statements for method calls
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 20:53:32 +0000 (22:53 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 10 Oct 2010 08:45:23 +0000 (10:45 +0200)
codegen/valaccodebasemodule.vala
codegen/valaccodemethodcallmodule.vala
codegen/valadovabasemodule.vala
codegen/valadovamethodcallmodule.vala

index 3e66d69e4d7586f02263f76f542548e6fed0323c..06ad8f301b8bbbf53b07a8a7973d04529fa84f04 100644 (file)
@@ -3112,7 +3112,9 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                        return;
                }
 
-               ccode.add_expression (get_cvalue (stmt.expression));
+               if (get_cvalue (stmt.expression) != null) {
+                       ccode.add_expression (get_cvalue (stmt.expression));
+               }
 
                /* free temporary objects and handle errors */
 
index 5e318c16606067ec1d1b5aa4d176dac019a396bf..0b5e879c4268b4faffe2db3d0211077cf729f69a 100644 (file)
@@ -740,9 +740,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                }
 
                if (m != null && m.binding == MemberBinding.INSTANCE && m.returns_modified_pointer) {
-                       set_cvalue (expr, new CCodeAssignment (instance, ccall_expr));
-               } else {
-                       set_cvalue (expr, ccall_expr);
+                       ccall_expr = new CCodeAssignment (instance, ccall_expr);
                }
 
                if (expr.is_yield_expression) {
@@ -783,11 +781,25 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                        var ccomma = new CCodeCommaExpression ();
                        ccomma.append_expression (new CCodeAssignment (temp_ref, new_size));
-                       ccomma.append_expression (get_cvalue (expr));
+                       ccomma.append_expression (ccall_expr);
                        ccomma.append_expression (new CCodeConditionalExpression (ccheck, czero, new CCodeConstant ("NULL")));
                        ccomma.append_expression (new CCodeAssignment (get_array_length_cexpression (ma.inner, 1), temp_ref));
 
                        set_cvalue (expr, ccomma);
+
+                       return;
+               }
+
+               if (expr.parent_node is ExpressionStatement) {
+                       ccode.add_expression (ccall_expr);
+               } else {
+                       var temp_var = get_temp_variable (itype.get_return_type ());
+                       var temp_ref = get_variable_cexpression (temp_var.name);
+
+                       emit_temp_var (temp_var);
+
+                       ccode.add_expression (new CCodeAssignment (temp_ref, ccall_expr));
+                       set_cvalue (expr, temp_ref);
                }
        }
 
index 567b0ba0088acd3947f7d76e1b7687b4cc66379b..60e364c54937ef45c2c318d0321aa873a97258ca 100644 (file)
@@ -1187,7 +1187,9 @@ public class Vala.DovaBaseModule : CodeGenerator {
                        return;
                }
 
-               ccode.add_expression (get_cvalue (stmt.expression));
+               if (get_cvalue (stmt.expression) != null) {
+                       ccode.add_expression (get_cvalue (stmt.expression));
+               }
                /* free temporary objects and handle errors */
 
                foreach (LocalVariable local in temp_ref_vars) {
index 852185eda146e44b5a464ac20db9393a514cf08e..37a4427fa89b14d22058daba3c2481550398d64c 100644 (file)
@@ -218,7 +218,17 @@ public class Vala.DovaMethodCallModule : DovaAssignmentModule {
                        ccall_expr = ccomma;
                }
 
-               set_cvalue (expr, ccall_expr);
+               if (expr.parent_node is ExpressionStatement) {
+                       ccode.add_expression (ccall_expr);
+               } else {
+                       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, ccall_expr));
+                       set_cvalue (expr, temp_ref);
+               }
        }
 }