]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use separate C statements for assignments
authorJürg Billeter <j@bitron.ch>
Sat, 9 Oct 2010 21:07:50 +0000 (23:07 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 10 Oct 2010 08:45:23 +0000 (10:45 +0200)
codegen/valaccodeassignmentmodule.vala
codegen/valaccodebasemodule.vala
codegen/valadovaassignmentmodule.vala
codegen/valadovabasemodule.vala

index 525c8f6d911f74624ab26eb61c69a4e9776cf842..7570b05d80638fc77259aa5491face28e50d4f13 100644 (file)
@@ -28,7 +28,7 @@ using GLib;
  * The link between an assignment and generated code.
  */
 public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
-       CCodeExpression emit_property_assignment (Assignment assignment) {
+       CCodeExpression? emit_property_assignment (Assignment assignment) {
                var ma = assignment.left as MemberAccess;
 
                var prop = (Property) assignment.left.symbol_reference;
@@ -81,21 +81,17 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                        cexpr = new CCodeBinaryExpression (cop, (CCodeExpression) get_ccodenode (assignment.left), cexpr);
                }
                
-               var ccall = get_property_set_call (prop, ma, cexpr, assignment.right);
-               
+               ccode.add_expression (get_property_set_call (prop, ma, cexpr, assignment.right));
+
                // assignments are expressions, so return the current property value, except if we're sure that it can't be used
-               if (!(assignment.parent_node is ExpressionStatement)) {
-                       var ccomma = new CCodeCommaExpression ();
-                       ccomma.append_expression (ccall); // update property
-                       ccomma.append_expression ((CCodeExpression) get_ccodenode (ma)); // current property value
-                       
-                       return ccomma;
+               if (assignment.parent_node is ExpressionStatement) {
+                       return null;
                } else {
-                       return ccall;
+                       return get_ccodenode (ma); // current property value
                }
        }
 
-       CCodeExpression emit_simple_assignment (Assignment assignment) {
+       CCodeExpression? emit_simple_assignment (Assignment assignment) {
                CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
                CCodeCommaExpression outer_ccomma = null;
@@ -201,10 +197,16 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                        codenode = outer_ccomma;
                }
 
-               return codenode;
+               ccode.add_expression (codenode);
+
+               if (assignment.parent_node is ExpressionStatement) {
+                       return null;
+               } else {
+                       return lhs;
+               }
        }
 
-       CCodeExpression emit_fixed_length_array_assignment (Assignment assignment, ArrayType array_type) {
+       CCodeExpression? emit_fixed_length_array_assignment (Assignment assignment, ArrayType array_type) {
                CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
 
@@ -220,7 +222,13 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                ccopy.add_argument (rhs);
                ccopy.add_argument (size);
 
-               return ccopy;
+               ccode.add_expression (ccopy);
+
+               if (assignment.parent_node is ExpressionStatement) {
+                       return null;
+               } else {
+                       return lhs;
+               }
        }
 
        public override void visit_assignment (Assignment assignment) {
index 06ad8f301b8bbbf53b07a8a7973d04529fa84f04..2b6984707ab8431c84166c62ce955dd1b8ab8ae3 100644 (file)
@@ -5728,7 +5728,7 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                return glib_value.ccodenode;
        }
 
-       public void set_cvalue (Expression expr, CCodeExpression cvalue) {
+       public void set_cvalue (Expression expr, CCodeExpression? cvalue) {
                var glib_value = (GLibValue) expr.target_value;
                if (glib_value == null) {
                        glib_value = new GLibValue ();
index 2e9480ddf76c128d06f5a906464a2acf40d2d3ae..5a057c66d4cc894738ac0071a97c77296ac9a8dc 100644 (file)
@@ -24,7 +24,7 @@
  * The link between an assignment and generated code.
  */
 public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
-       CCodeExpression emit_property_assignment (Assignment assignment) {
+       CCodeExpression? emit_property_assignment (Assignment assignment) {
                var ma = assignment.left as MemberAccess;
 
                var prop = (Property) assignment.left.symbol_reference;
@@ -71,21 +71,17 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
                        cexpr = new CCodeBinaryExpression (cop, (CCodeExpression) get_ccodenode (assignment.left), cexpr);
                }
 
-               var ccall = get_property_set_call (prop, ma, cexpr, assignment.right);
+               ccode.add_expression (get_property_set_call (prop, ma, cexpr, assignment.right));
 
                // assignments are expressions, so return the current property value, except if we're sure that it can't be used
-               if (!(assignment.parent_node is ExpressionStatement)) {
-                       var ccomma = new CCodeCommaExpression ();
-                       ccomma.append_expression (ccall); // update property
-                       ccomma.append_expression ((CCodeExpression) get_ccodenode (ma)); // current property value
-
-                       return ccomma;
+               if (assignment.parent_node is ExpressionStatement) {
+                       return null;
                } else {
-                       return ccall;
+                       return get_ccodenode (ma); // current property value
                }
        }
 
-       CCodeExpression emit_simple_assignment (Assignment assignment) {
+       CCodeExpression? emit_simple_assignment (Assignment assignment) {
                CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
                CCodeCommaExpression outer_ccomma = null;
@@ -150,10 +146,16 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
                        codenode = outer_ccomma;
                }
 
-               return codenode;
+               ccode.add_expression (codenode);
+
+               if (assignment.parent_node is ExpressionStatement) {
+                       return null;
+               } else {
+                       return lhs;
+               }
        }
 
-       CCodeExpression emit_fixed_length_array_assignment (Assignment assignment, ArrayType array_type) {
+       CCodeExpression? emit_fixed_length_array_assignment (Assignment assignment, ArrayType array_type) {
                CCodeExpression rhs = get_cvalue (assignment.right);
                CCodeExpression lhs = (CCodeExpression) get_ccodenode (assignment.left);
 
@@ -167,7 +169,13 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
                ccopy.add_argument (rhs);
                ccopy.add_argument (size);
 
-               return ccopy;
+               ccode.add_expression (ccopy);
+
+               if (assignment.parent_node is ExpressionStatement) {
+                       return null;
+               } else {
+                       return lhs;
+               }
        }
 
        public override void visit_assignment (Assignment assignment) {
index 60e364c54937ef45c2c318d0321aa873a97258ca..72e147fc893da8ca0f3a535439194d11ef64179a 100644 (file)
@@ -2275,7 +2275,7 @@ public class Vala.DovaBaseModule : CodeGenerator {
                return dova_value.ccodenode;
        }
 
-       public void set_cvalue (Expression expr, CCodeExpression cvalue) {
+       public void set_cvalue (Expression expr, CCodeExpression? cvalue) {
                var dova_value = (DovaValue) expr.target_value;
                if (dova_value == null) {
                        dova_value = new DovaValue ();