]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use separate C statements for postfix expressions
authorJürg Billeter <j@bitron.ch>
Tue, 21 Dec 2010 16:05:56 +0000 (17:05 +0100)
committerJürg Billeter <j@bitron.ch>
Tue, 21 Dec 2010 17:53:51 +0000 (18:53 +0100)
codegen/valaccodebasemodule.vala

index 1373345f0a8b8ad039cb1662dcb5b99b4f4413ed..abd7d0e1405f2c8d95d70edb1b0e585cb01dc146 100644 (file)
@@ -3727,10 +3727,25 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        set_cvalue (expr, get_variable_cexpression (temp_decl.name));
                        return;
                }
-       
-               var op = expr.increment ? CCodeUnaryOperator.POSTFIX_INCREMENT : CCodeUnaryOperator.POSTFIX_DECREMENT;
-       
-               set_cvalue (expr, new CCodeUnaryExpression (op, get_cvalue (expr.inner)));
+
+               if (expr.parent_node is ExpressionStatement) {
+                       var op = expr.increment ? CCodeUnaryOperator.POSTFIX_INCREMENT : CCodeUnaryOperator.POSTFIX_DECREMENT;
+
+                       ccode.add_expression (new CCodeUnaryExpression (op, get_cvalue (expr.inner)));
+               } else {
+                       // assign current value to temp variable
+                       var temp_decl = get_temp_variable (expr.inner.value_type, true, expr, false);
+                       emit_temp_var (temp_decl);
+                       ccode.add_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), get_cvalue (expr.inner)));
+
+                       // increment/decrement variable
+                       var op = expr.increment ? CCodeBinaryOperator.PLUS : CCodeBinaryOperator.MINUS;
+                       var cexpr = new CCodeBinaryExpression (op, get_variable_cexpression (temp_decl.name), new CCodeConstant ("1"));
+                       ccode.add_expression (new CCodeAssignment (get_cvalue (expr.inner), cexpr));
+
+                       // return previous value
+                       set_cvalue (expr, get_variable_cexpression (temp_decl.name));
+               }
        }
        
        private MemberAccess? find_property_access (Expression expr) {