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

View File

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