]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use temporary variables in array element access
authorLuca Bruno <lucabru@src.gnome.org>
Sat, 16 Jul 2011 20:09:39 +0000 (22:09 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Sat, 16 Jul 2011 20:30:40 +0000 (22:30 +0200)
Fixes bug 654753.

codegen/valaccodearraymodule.vala
codegen/valagsignalmodule.vala
tests/Makefile.am
tests/structs/bug654753.vala [new file with mode: 0644]

index 5946f586d09f8be77753993d774993ff8d04406c..9a2afddefce241bdf5086fe582d1b9b9fe1938a7 100644 (file)
@@ -178,6 +178,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        }
                        set_cvalue (expr, new CCodeElementAccess (ccontainer, cindex));
                }
+
+               expr.target_value.value_type = expr.value_type.copy ();
+               if (!expr.lvalue) {
+                       expr.target_value = store_temp_value (expr.target_value, expr);
+               }
+               ((GLibValue) expr.target_value).lvalue = true;
        }
 
        public override void visit_slice_expression (SliceExpression expr) {
index 6e06f7252351b9e5a34e18ad0e93a944dfd6d61d..e5278903941442940de8b242a2982750017448bd 100644 (file)
@@ -427,20 +427,24 @@ public class Vala.GSignalModule : GObjectModule {
        }
 
        public override void visit_element_access (ElementAccess expr) {
-               if (expr.container is MemberAccess && expr.container.symbol_reference is Signal && expr.parent_node is MethodCall) {
-                       // detailed signal emission
-                       var sig = (Signal) expr.symbol_reference;
-                       var ma = (MemberAccess) expr.container;
-
-                       var detail_expr = expr.get_indices ().get (0);
-                       var signal_name_cexpr = get_signal_name_cexpression (sig, detail_expr, expr);
+               if (expr.container is MemberAccess && expr.container.symbol_reference is Signal) {
+                       if (expr.parent_node is MethodCall) {
+                               // detailed signal emission
+                               var sig = (Signal) expr.symbol_reference;
+                               var ma = (MemberAccess) expr.container;
+
+                               var detail_expr = expr.get_indices ().get (0);
+                               var signal_name_cexpr = get_signal_name_cexpression (sig, detail_expr, expr);
                        
-                       var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
-                       ccall.add_argument (get_cvalue (ma.inner));
-                       if (signal_name_cexpr != null) {
-                               ccall.add_argument (signal_name_cexpr);
+                               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
+                               ccall.add_argument (get_cvalue (ma.inner));
+                               if (signal_name_cexpr != null) {
+                                       ccall.add_argument (signal_name_cexpr);
+                               }
+                               set_cvalue (expr, ccall);
+                       } else {
+                               // signal connect or disconnect
                        }
-                       set_cvalue (expr, ccall);
                } else {
                        base.visit_element_access (expr);
                }
index 9f750c5c1cf4fe42873f8a07ec0a36a1555446ae..eac0891a172c2afd010c102ae6c5832800fdc755 100644 (file)
@@ -68,6 +68,7 @@ TESTS = \
        structs/bug623092.vala \
        structs/bug651441.vala \
        structs/bug654646.vala \
+       structs/bug654753.vala \
        delegates/delegates.vala \
        delegates/bug539166.vala \
        delegates/bug595610.vala \
diff --git a/tests/structs/bug654753.vala b/tests/structs/bug654753.vala
new file mode 100644 (file)
index 0000000..3f8e13f
--- /dev/null
@@ -0,0 +1,15 @@
+struct Foo {
+       int baz;
+
+       public void bar (Foo f) {
+               baz = 10;
+               f.baz = 20;
+       }
+}
+
+void main() {
+       Foo[] array = new Foo[2];
+       array[0].bar (array[1]);
+       assert (array[0].baz == 10);
+       assert (array[1].baz == 0);
+}