From ff19fcfc79cbe705c212fe6f0b21af19cd4f316e Mon Sep 17 00:00:00 2001 From: Raffaele Sandrini Date: Sat, 24 Mar 2007 20:52:41 +0000 Subject: [PATCH] assign parent_node to children of this statement; include iterator and 2007-03-24 Raffaele Sandrini * vala/valaforstatement.vala: assign parent_node to children of this statement; include iterator and initializer in replacement of a child node (fixes segfault using prefix increment expression in the iterator of a for-statement) svn path=/trunk/; revision=266 --- vala/ChangeLog | 8 ++++++++ vala/vala/valaforstatement.vala | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/vala/ChangeLog b/vala/ChangeLog index b94605e..69af3d9 100644 --- a/vala/ChangeLog +++ b/vala/ChangeLog @@ -1,4 +1,12 @@ +2007-03-24 Raffaele Sandrini + + * vala/valaforstatement.vala: assign parent_node to children of this + statement; include iterator and initializer in replacement of a child + node (fixes segfault using prefix increment expression in the + iterator of a for-statement) + 2007-03-22 Raffaele Sandrini + * vala/valaflags.vala, vala/valaenum.vala, vala/valadatatype.vala, vala/valastruct.vala: add support for default values of types * vala/valacodegenerator.vala: use default values for initialization diff --git a/vala/vala/valaforstatement.vala b/vala/vala/valaforstatement.vala index 69d56f3..7e5b8ab 100644 --- a/vala/vala/valaforstatement.vala +++ b/vala/vala/valaforstatement.vala @@ -69,6 +69,7 @@ public class Vala.ForStatement : Statement { * @param init an initializer expression */ public void add_initializer (Expression! init) { + init.parent_node = this; initializer.append (init); } @@ -87,6 +88,7 @@ public class Vala.ForStatement : Statement { * @param iter an iterator expression */ public void add_iterator (Expression! iter) { + iter.parent_node = this; iterator.append (iter); } @@ -118,8 +120,29 @@ public class Vala.ForStatement : Statement { } public override void replace (CodeNode! old_node, CodeNode! new_node) { + weak List iter; + if (condition == old_node) { condition = (Expression) new_node; + return; + } + + for (iter = initializer; iter != null; iter = iter.next) { + if (iter.data == old_node) { + weak List silbling = iter.next; + initializer.delete_link (iter); + initializer.insert_before (silbling, new_node); + return; + } } + + for (iter = iterator; iter != null; iter = iter.next) { + if (iter.data == old_node) { + weak List silbling = iter.next; + iterator.delete_link (iter); + iterator.insert_before (silbling, new_node); + return; + } + } } } -- 2.7.4