Commit fddc991b authored by Jesse Beder's avatar Jesse Beder
Browse files

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

parent 3337df7c
...@@ -41,7 +41,7 @@ namespace YAML ...@@ -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();
} }
...@@ -79,16 +79,19 @@ namespace YAML ...@@ -79,16 +79,19 @@ namespace YAML
detail::node& NodeBuilder::Push(anchor_t anchor) detail::node& NodeBuilder::Push(anchor_t anchor)
{ {
const bool needsKey = (!m_stack.empty() && m_stack.back()->type() == NodeType::Map && m_keys.size() < m_mapDepth);
detail::node& node = m_pMemory->create_node(); detail::node& node = m_pMemory->create_node();
m_stack.push_back(&node);
RegisterAnchor(anchor, 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);
m_stack.push_back(&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 ...@@ -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();
......
...@@ -36,6 +36,7 @@ namespace YAML ...@@ -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 ...@@ -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;
}; };
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment