diff options
author | Mark Spruiell <mes@zeroc.com> | 2004-01-26 22:47:09 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2004-01-26 22:47:09 +0000 |
commit | f7f8873c0e40f01e55fa2939474837cc3d783a0e (patch) | |
tree | 68293064fdd5e5347518e593fce638419ba4b278 | |
parent | allow insertion/removal in sequences (diff) | |
download | ice-f7f8873c0e40f01e55fa2939474837cc3d783a0e.tar.bz2 ice-f7f8873c0e40f01e55fa2939474837cc3d783a0e.tar.xz ice-f7f8873c0e40f01e55fa2939474837cc3d783a0e.zip |
<iterate> fix
-rw-r--r-- | cpp/src/FreezeScript/DumpDescriptors.cpp | 10 | ||||
-rw-r--r-- | cpp/src/FreezeScript/Transformer.cpp | 10 |
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; } } } |