summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2004-01-26 22:47:09 +0000
committerMark Spruiell <mes@zeroc.com>2004-01-26 22:47:09 +0000
commitf7f8873c0e40f01e55fa2939474837cc3d783a0e (patch)
tree68293064fdd5e5347518e593fce638419ba4b278
parentallow insertion/removal in sequences (diff)
downloadice-f7f8873c0e40f01e55fa2939474837cc3d783a0e.tar.bz2
ice-f7f8873c0e40f01e55fa2939474837cc3d783a0e.tar.xz
ice-f7f8873c0e40f01e55fa2939474837cc3d783a0e.zip
<iterate> fix
-rw-r--r--cpp/src/FreezeScript/DumpDescriptors.cpp10
-rw-r--r--cpp/src/FreezeScript/Transformer.cpp10
2 files changed, 14 insertions, 6 deletions
diff --git a/cpp/src/FreezeScript/DumpDescriptors.cpp b/cpp/src/FreezeScript/DumpDescriptors.cpp
index 242997c628e..4a308c7de64 100644
--- a/cpp/src/FreezeScript/DumpDescriptors.cpp
+++ b/cpp/src/FreezeScript/DumpDescriptors.cpp
@@ -1129,14 +1129,18 @@ FreezeScript::IterateDescriptor::execute(const SymbolTablePtr& sym, ExecuteInfo*
index = "i";
}
+ //
+ // NOTE: Don't use iterator to traverse vector because child descriptors might remove elements.
+ //
DataList& l = seq->getElements();
- Ice::Long i = 0;
- for(DataList::iterator p = l.begin(); p != l.end(); ++p, ++i)
+ DataList::size_type i = 0;
+ while(i < l.size())
{
SymbolTablePtr elemSym = sym->createChild();
- elemSym->add(element, *p);
+ elemSym->add(element, l[i]);
elemSym->add(index, _factory->createInteger(i, true));
ExecutableContainerDescriptor::execute(elemSym, info);
+ ++i;
}
}
}
diff --git a/cpp/src/FreezeScript/Transformer.cpp b/cpp/src/FreezeScript/Transformer.cpp
index db9a7aabdc6..98e7ddf8401 100644
--- a/cpp/src/FreezeScript/Transformer.cpp
+++ b/cpp/src/FreezeScript/Transformer.cpp
@@ -1689,14 +1689,18 @@ FreezeScript::IterateDescriptor::execute(const SymbolTablePtr& sym)
index = "i";
}
+ //
+ // NOTE: Don't use iterator to traverse vector because child descriptors might remove elements.
+ //
DataList& l = seq->getElements();
- Ice::Long i = 0;
- for(DataList::iterator p = l.begin(); p != l.end(); ++p, ++i)
+ DataList::size_type i = 0;
+ while(i < l.size())
{
SymbolTablePtr elemSym = sym->createChild();
- elemSym->add(element, *p);
+ elemSym->add(element, l[i]);
elemSym->add(index, _info->factory->createInteger(i, true));
ExecutableContainerDescriptor::execute(elemSym);
+ ++i;
}
}
}