]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
ensure that index expression in element access doesn't get evaluated more
authorJuerg Billeter <j@bitron.ch>
Wed, 25 Jul 2007 16:22:40 +0000 (16:22 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Wed, 25 Jul 2007 16:22:40 +0000 (16:22 +0000)
2007-07-25  Juerg Billeter  <j@bitron.ch>

* gobject/valacodegeneratorassignment.vala: ensure that index expression
  in element access doesn't get evaluated more than once

svn path=/trunk/; revision=385

ChangeLog
gobject/valacodegeneratorassignment.vala

index 9541aa259a4423b1aafd7b258641052b5b443052..25c97df9abac66fc7d6d5c754237604faf3e0bce 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-25  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valacodegeneratorassignment.vala: ensure that index expression
+         in element access doesn't get evaluated more than once
+
 2007-07-25  Jürg Billeter  <j@bitron.ch>
 
        * ccode/valaccodefunction.vala: add void to function declarations
index dfb9d31753e4f77f2a390d7ed0af56dd1c67370a..260773d98d44ec34b04345d55359232e70b294e4 100644 (file)
@@ -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;
+                               }
+                       }
                }
        }