diff --git a/src/nodebuilder.cpp b/src/nodebuilder.cpp index dcddd05..a1daf8e 100644 --- a/src/nodebuilder.cpp +++ b/src/nodebuilder.cpp @@ -70,6 +70,7 @@ void NodeBuilder::OnMapStart(const Mark& mark, const std::string& tag, node.set_tag(tag); node.set_style(style); m_mapDepth++; + m_mergeDicts.emplace_back(); } void MergeMapCollection(detail::node& map_to, detail::node& map_from, @@ -86,11 +87,12 @@ void MergeMapCollection(detail::node& map_to, detail::node& map_from, void NodeBuilder::OnMapEnd() { assert(m_mapDepth > 0); detail::node& collection = *m_stack.back(); - for (detail::node* n : m_mergeDicts) { + auto& toMerge = *m_mergeDicts.rbegin(); + for (detail::node* n : toMerge) { MergeMapCollection(collection, *n, m_pMemory); } - m_mergeDicts.clear(); m_mapDepth--; + m_mergeDicts.pop_back(); Pop(); } @@ -135,13 +137,13 @@ void NodeBuilder::Pop() { ((nk.tag() == "tag:yaml.org,2002:merge" && nk.scalar() == "<<") || (nk.tag() == "?" && nk.scalar() == "<<"))) { if (node.type() == NodeType::Map) { - m_mergeDicts.emplace_back(&node); + m_mergeDicts.rbegin()->emplace_back(&node); m_keys.pop_back(); } else if (node.type() == NodeType::Sequence) { for (auto i = node.begin(); i != node.end(); i++) { auto v = *i; if ((*v).type() == NodeType::Map) { - m_mergeDicts.emplace_back(&(*v)); + m_mergeDicts.rbegin()->emplace_back(&(*v)); } else { throw ParserException( node.mark(), diff --git a/src/nodebuilder.h b/src/nodebuilder.h index c8f2804..b053d58 100644 --- a/src/nodebuilder.h +++ b/src/nodebuilder.h @@ -67,7 +67,7 @@ class NodeBuilder : public EventHandler { using PushedKey = std::pair; std::vector m_keys; - Nodes m_mergeDicts; + std::vector m_mergeDicts; std::size_t m_mapDepth; }; } // namespace YAML diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index b670b64..aa81faa 100644 --- a/test/integration/load_node_test.cpp +++ b/test/integration/load_node_test.cpp @@ -188,7 +188,7 @@ TEST(LoadNodeTest, MergeKeyB) { Node node = Load( "{x: &foo {a : 1,b : 1,c : 1}, y: &bar {d: 2, e : 2, f : 2, a : 2}, z: " "&stuff { << : *foo, b : 3}, w: { << : [*stuff, *bar], c: 4 }, v: { '<<' " - ": *foo } , u : {!!merge << : *bar} }"); + ": *foo } , u : {!!merge << : *bar}, t: {!!merge << : *bar, h: 3} }"); EXPECT_EQ(NodeType::Map, node["z"].Type()); EXPECT_EQ(NodeType::Map, node["w"].Type()); EXPECT_FALSE(node["z"]["<<"]); @@ -208,6 +208,10 @@ TEST(LoadNodeTest, MergeKeyB) { EXPECT_FALSE(node["u"]["<<"]); EXPECT_EQ(2, node["u"]["d"].as()); + + EXPECT_FALSE(node["t"]["<<"]); + EXPECT_EQ(2, node["t"]["d"].as()); + EXPECT_EQ(3, node["t"]["h"].as()); } TEST(LoadNodeTest, ForceInsertIntoMap) {