From: Jürg Billeter Date: Sat, 9 Oct 2010 21:07:50 +0000 (+0200) Subject: codegen: Use separate C statements for assignments X-Git-Tag: 0.11.1~161 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b1f712c2d1c8d6c04c3ac790fd65ebaa483dc17;p=thirdparty%2Fvala.git codegen: Use separate C statements for assignments --- diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala index 525c8f6d9..7570b05d8 100644 --- a/codegen/valaccodeassignmentmodule.vala +++ b/codegen/valaccodeassignmentmodule.vala @@ -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) { diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 06ad8f301..2b6984707 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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 (); diff --git a/codegen/valadovaassignmentmodule.vala b/codegen/valadovaassignmentmodule.vala index 2e9480ddf..5a057c66d 100644 --- a/codegen/valadovaassignmentmodule.vala +++ b/codegen/valadovaassignmentmodule.vala @@ -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) { diff --git a/codegen/valadovabasemodule.vala b/codegen/valadovabasemodule.vala index 60e364c54..72e147fc8 100644 --- a/codegen/valadovabasemodule.vala +++ b/codegen/valadovabasemodule.vala @@ -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 ();