Skip to content

Commit 48a9377

Browse files
committed
Merge pull request #4 from rchristie/master
Fix iterating while modifying unparsed nodes vector.
2 parents 2ef0e6a + ba9dc47 commit 48a9377

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

core/src/FieldmlDOM.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,8 +1434,9 @@ static int parseObjectNode( xmlNodePtr objectNode, ParseState &state )
14341434
}
14351435

14361436
// Work around of the current bug that data resource need to be defined beofre parameter evaluator uses it
1437-
static int parseDataNode( xmlNodePtr objectNode, ParseState &state )
1437+
static int parseDataNode( xmlNodePtr objectNode, ParseState &state , bool& isParsed)
14381438
{
1439+
isParsed = false;
14391440
if( FmlUtil::contains( state.parseStack, objectNode ) )
14401441
{
14411442
const char *name = getStringAttribute( objectNode, NAME_ATTRIB );
@@ -1453,10 +1454,7 @@ static int parseDataNode( xmlNodePtr objectNode, ParseState &state )
14531454

14541455
state.parseStack.pop_back();
14551456

1456-
vector<xmlNodePtr>::iterator loc = find( state.unparsedNodes.begin(), state.unparsedNodes.end(), objectNode );
1457-
1458-
state.unparsedNodes.erase( loc );
1459-
1457+
isParsed = !err;
14601458
}
14611459

14621460
return err;
@@ -1490,11 +1488,21 @@ static int parseDoc( xmlDocPtr doc, ParseState &state )
14901488

14911489
// To be improved: Required the following "for" loop to loop through all the top level elements and
14921490
// parse the data resources before anything using them.
1493-
for( vector<xmlNodePtr>::iterator j = state.unparsedNodes.begin(); j != state.unparsedNodes.end();)
1494-
{
1495-
xmlNodePtr temp_node = *j;
1496-
j++;
1497-
parseDataNode( temp_node, state );
1491+
for( unsigned int index = 0; index < state.unparsedNodes.size(); )
1492+
{
1493+
bool isParsed = false;
1494+
xmlNodePtr objectNode = state.unparsedNodes[index];
1495+
parseDataNode( objectNode, state, isParsed );
1496+
if (isParsed)
1497+
{
1498+
// remove from unparsedNodes
1499+
vector<xmlNodePtr>::iterator loc = find( state.unparsedNodes.begin(), state.unparsedNodes.end(), objectNode );
1500+
state.unparsedNodes.erase( loc );
1501+
}
1502+
else
1503+
{
1504+
++index;
1505+
}
14981506
}
14991507

15001508
while( state.unparsedNodes.size() != 0 )

0 commit comments

Comments
 (0)