]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix side-effects in array element assignments
authorJürg Billeter <j@bitron.ch>
Sun, 17 Oct 2010 11:59:31 +0000 (13:59 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 17 Oct 2010 12:01:52 +0000 (14:01 +0200)
Make sure to not evaluate the index multiple times.

Fixes bug 632322.

tests/Makefile.am
tests/basic-types/bug632322.vala [new file with mode: 0644]
vala/valaassignment.vala

index 08bf293351ecaf32d32309555ab56308a7c86bec..66b8c8f31879e221ab3d546222ea8217ec745d9e 100644 (file)
@@ -23,6 +23,7 @@ TESTS = \
        basic-types/bug595751.vala \
        basic-types/bug596637.vala \
        basic-types/bug596785.vala \
+       basic-types/bug632322.vala \
        namespaces.vala \
        methods/lambda.vala \
        methods/closures.vala \
diff --git a/tests/basic-types/bug632322.vala b/tests/basic-types/bug632322.vala
new file mode 100644 (file)
index 0000000..6116b96
--- /dev/null
@@ -0,0 +1,6 @@
+void main () {
+       int[] foo = new int[42];
+       int i = 1;
+       foo[i = i - 1] = 23;
+       assert (i == 0);
+}
index e136884283c6b715d21091881b0479273498f8f8..fbed65c66135c06c1d807b31d7f671b664ec4e40 100644 (file)
@@ -464,13 +464,17 @@ public class Vala.Assignment : Expression {
                                ma.inner.emit (codegen);
                        }
                } else if (ea != null) {
-                       ea.container.emit (codegen);
-
-                       foreach (var index in ea.get_indices ()) {
-                               index.emit (codegen);
-                       }
+                       // always process full lvalue
+                       // current codegen depends on it
+                       // should be removed when moving codegen from
+                       // visit_assignment to emit_store_element
+                       ea.emit (codegen);
                } else if (pi != null) {
-                       pi.inner.emit (codegen);
+                       // always process full lvalue
+                       // current codegen depends on it
+                       // should be removed when moving codegen from
+                       // visit_assignment to emit_store_indirectZ
+                       pi.emit (codegen);
                }
 
                right.emit (codegen);