[vala] codegen: Use temporary variables in array element access
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Use temporary variables in array element access
- Date: Sat, 16 Jul 2011 20:45:11 +0000 (UTC)
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]