Fixed leak when adding duplicate keys (and actually changed the behavior - now we take the first instance, not the last)

This commit is contained in:
jbeder
2009-12-02 01:01:45 +00:00
parent 8f0f0d62a7
commit f4b81e7349
2 changed files with 17 additions and 10 deletions

View File

@@ -17,7 +17,7 @@ namespace YAML
for(node_map::const_iterator it=data.begin();it!=data.end();++it) {
std::auto_ptr<Node> pKey = it->first->Clone();
std::auto_ptr<Node> pValue = it->second->Clone();
m_data[pKey.release()] = pValue.release();
AddEntry(pKey, pValue);
}
}
@@ -104,8 +104,7 @@ namespace YAML
pValue->Parse(pScanner, state);
}
// assign the map with the actual pointers
m_data[pKey.release()] = pValue.release();
AddEntry(pKey, pValue);
}
state.PopCollectionType(ParserState::BLOCK_MAP);
@@ -149,8 +148,7 @@ namespace YAML
else if(nextToken.type != Token::FLOW_MAP_END)
throw ParserException(nextToken.mark, ErrorMsg::END_OF_MAP_FLOW);
// assign the map with the actual pointers
m_data[pKey.release()] = pValue.release();
AddEntry(pKey, pValue);
}
state.PopCollectionType(ParserState::FLOW_MAP);
@@ -173,8 +171,7 @@ namespace YAML
pValue->Parse(pScanner, state);
}
// assign the map with the actual pointers
m_data[pKey.release()] = pValue.release();
AddEntry(pKey, pValue);
state.PopCollectionType(ParserState::COMPACT_MAP);
}
@@ -189,11 +186,19 @@ namespace YAML
pScanner->pop();
pValue->Parse(pScanner, state);
// assign the map with the actual pointers
m_data[pKey.release()] = pValue.release();
AddEntry(pKey, pValue);
state.PopCollectionType(ParserState::COMPACT_MAP);
}
void Map::AddEntry(std::auto_ptr<Node> pKey, std::auto_ptr<Node> pValue)
{
node_map::const_iterator it = m_data.find(pKey.get());
if(it != m_data.end())
return;
m_data[pKey.release()] = pValue.release();
}
void Map::Write(Emitter& out) const
{
out << BeginMap;

View File

@@ -44,6 +44,8 @@ namespace YAML
void ParseCompact(Scanner *pScanner, ParserState& state);
void ParseCompactWithNoKey(Scanner *pScanner, ParserState& state);
void AddEntry(std::auto_ptr<Node> pKey, std::auto_ptr<Node> pValue);
private:
node_map m_data;
};