From 04540faa544df0abda85d8cca8fce8321d4e13da Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Wed, 25 Jul 2007 16:22:40 +0000 Subject: [PATCH] ensure that index expression in element access doesn't get evaluated more 2007-07-25 Juerg Billeter * gobject/valacodegeneratorassignment.vala: ensure that index expression in element access doesn't get evaluated more than once svn path=/trunk/; revision=385 --- ChangeLog | 5 +++++ gobject/valacodegeneratorassignment.vala | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9541aa259..25c97df9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-07-25 Jürg Billeter + + * gobject/valacodegeneratorassignment.vala: ensure that index expression + in element access doesn't get evaluated more than once + 2007-07-25 Jürg Billeter * ccode/valaccodefunction.vala: add void to function declarations diff --git a/gobject/valacodegeneratorassignment.vala b/gobject/valacodegeneratorassignment.vala index dfb9d3175..260773d98 100644 --- a/gobject/valacodegeneratorassignment.vala +++ b/gobject/valacodegeneratorassignment.vala @@ -258,6 +258,24 @@ public class Vala.CodeGenerator { } a.ccodenode = new CCodeAssignment ((CCodeExpression) a.left.ccodenode, rhs, cop); + + if (unref_old && a.left.ccodenode is CCodeElementAccess) { + // ensure that index expression in element access doesn't get evaluated more than once + // except when it's a simple expression + var cea = (CCodeElementAccess) a.left.ccodenode; + if (!(cea.index is CCodeConstant || cea.index is CCodeIdentifier)) { + var index_temp_decl = get_temp_variable_declarator (int_type); + temp_vars.prepend (index_temp_decl); + + var ccomma = new CCodeCommaExpression (); + ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (index_temp_decl.name), cea.index)); + ccomma.append_expression ((CCodeExpression) a.ccodenode); + + cea.index = new CCodeIdentifier (index_temp_decl.name); + + a.ccodenode = ccomma; + } + } } } -- 2.47.3