summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}
}
}