Fixed NodeBuilder bug when an alias was in a map - we weren't pushing that guy as a key

This commit is contained in:
Jesse Beder 2011-09-12 14:24:27 -05:00
parent 3337df7ca2
commit fddc991b60
2 changed files with 15 additions and 10 deletions

View File

@ -41,7 +41,7 @@ namespace YAML
void NodeBuilder::OnAlias(const Mark& /*mark*/, anchor_t anchor)
{
detail::node& node = *m_anchors[anchor];
m_stack.push_back(&node);
Push(node);
Pop();
}
@ -78,17 +78,20 @@ namespace YAML
}
detail::node& NodeBuilder::Push(anchor_t anchor)
{
detail::node& node = m_pMemory->create_node();
RegisterAnchor(anchor, node);
Push(node);
return node;
}
void NodeBuilder::Push(detail::node& node)
{
const bool needsKey = (!m_stack.empty() && m_stack.back()->type() == NodeType::Map && m_keys.size() < m_mapDepth);
detail::node& node = m_pMemory->create_node();
m_stack.push_back(&node);
RegisterAnchor(anchor, node);
if(needsKey)
m_keys.push_back(Key(&node, false));
return node;
m_keys.push_back(PushedKey(&node, false));
}
void NodeBuilder::Pop()
@ -108,7 +111,8 @@ namespace YAML
if(collection.type() == NodeType::Sequence) {
collection.append(node, m_pMemory);
} else if(collection.type() == NodeType::Map) {
Key& key = m_keys.back();
assert(!m_keys.empty());
PushedKey& key = m_keys.back();
if(key.second) {
collection.insert(*key.first, node, m_pMemory);
m_keys.pop_back();

View File

@ -36,6 +36,7 @@ namespace YAML
private:
detail::node& Push(anchor_t anchor);
void Push(detail::node& node);
void Pop();
void RegisterAnchor(anchor_t anchor, detail::node& node);
@ -47,8 +48,8 @@ namespace YAML
Nodes m_stack;
Nodes m_anchors;
typedef std::pair<detail::node *, bool> Key;
std::vector<Key> m_keys;
typedef std::pair<detail::node *, bool> PushedKey;
std::vector<PushedKey> m_keys;
std::size_t m_mapDepth;
};
}