[vala] codegen: Use temporary variables in array element access



commit 29426b0482ca7b2593bf7f19ea83fa91e6beb5b4
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat Jul 16 22:09:39 2011 +0200

    codegen: Use temporary variables in array element access
    
    Fixes bug 654753.

 codegen/valaccodearraymodule.vala |    6 ++++++
 codegen/valagsignalmodule.vala    |   28 ++++++++++++++++------------
 tests/Makefile.am                 |    1 +
 tests/structs/bug654753.vala      |   15 +++++++++++++++
 4 files changed, 38 insertions(+), 12 deletions(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index 5946f58..9a2afdd 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -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) {
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala
index 6e06f72..e527890 100644
--- a/codegen/valagsignalmodule.vala
+++ b/codegen/valagsignalmodule.vala
@@ -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);
 		}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9f750c5..eac0891 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 0000000..3f8e13f
--- /dev/null
+++ b/tests/structs/bug654753.vala
@@ -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);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]