From: Luca Bruno Date: Sat, 16 Jul 2011 20:09:39 +0000 (+0200) Subject: codegen: Use temporary variables in array element access X-Git-Tag: 0.13.2~140 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=29426b0482ca7b2593bf7f19ea83fa91e6beb5b4;p=thirdparty%2Fvala.git codegen: Use temporary variables in array element access Fixes bug 654753. --- diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 5946f586d..9a2afddef 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 6e06f7252..e52789039 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 9f750c5c1..eac0891a1 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 000000000..3f8e13f82 --- /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); +}