From: Rico Tzschichholz Date: Thu, 13 Aug 2020 17:05:49 +0000 (+0200) Subject: vala: Move transformation of unary increment/decrement to codegen X-Git-Tag: 0.40.24~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=667d1a38aaff2fceaa0497ec2ca31805cad55eab;p=thirdparty%2Fvala.git vala: Move transformation of unary increment/decrement to codegen In preparation for https://gitlab.gnome.org/GNOME/vala/issues/1061 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 666cd6e44..46fb30773 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5226,6 +5226,28 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { return; } + if (expr.operator == UnaryOperator.INCREMENT || expr.operator == UnaryOperator.DECREMENT) { + // increment/decrement variable + var op = expr.operator == UnaryOperator.INCREMENT ? CCodeBinaryOperator.PLUS : CCodeBinaryOperator.MINUS; + var cexpr = new CCodeBinaryExpression (op, get_cvalue_ (expr.inner.target_value), new CCodeConstant ("1")); + ccode.add_assignment (get_cvalue (expr.inner), cexpr); + + // assign new value to temp variable + var temp_value = store_temp_value (expr.inner.target_value, expr); + + MemberAccess ma = find_property_access (expr.inner); + if (ma != null) { + // property postfix expression + var prop = (Property) ma.symbol_reference; + + store_property (prop, ma.inner, temp_value); + } + + // return new value + expr.target_value = temp_value; + return; + } + CCodeUnaryOperator op; if (expr.operator == UnaryOperator.PLUS) { op = CCodeUnaryOperator.PLUS; diff --git a/vala/valaunaryexpression.vala b/vala/valaunaryexpression.vala index 139881364..c06352901 100644 --- a/vala/valaunaryexpression.vala +++ b/vala/valaunaryexpression.vala @@ -219,15 +219,7 @@ public class Vala.UnaryExpression : Expression { return false; } - var old_value = new MemberAccess (ma.inner, ma.member_name, inner.source_reference); - var bin = new BinaryExpression (operator == UnaryOperator.INCREMENT ? BinaryOperator.PLUS : BinaryOperator.MINUS, old_value, new IntegerLiteral ("1"), source_reference); - - var assignment = new Assignment (ma, bin, AssignmentOperator.SIMPLE, source_reference); - assignment.target_type = target_type; - context.analyzer.replaced_nodes.add (this); - parent_node.replace_expression (this, assignment); - assignment.check (context); - return true; + value_type = inner.value_type; } else if (operator == UnaryOperator.REF || operator == UnaryOperator.OUT) { var ea = inner as ElementAccess; if (inner.symbol_reference is Field || inner.symbol_reference is Parameter || inner.symbol_reference is LocalVariable ||