forked from pool/yaml-cpp
- Add patch to fix wrong node behaviour in 0.5.2 bnc#954749: * fix-node-regression.patch OBS-URL: https://build.opensuse.org/request/show/344175 OBS-URL: https://build.opensuse.org/package/show/devel:libraries:c_c++/yaml-cpp?expand=0&rev=11
120 lines
3.6 KiB
Diff
120 lines
3.6 KiB
Diff
From b426fafff6238dda8d86fa668f585cba732dd272 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Hamilton <jtrhamilton@gmail.com>
|
|
Date: Mon, 1 Jun 2015 13:33:59 -0700
|
|
Subject: [PATCH] Fix some Node::operator[] regressions from 0.5.1
|
|
|
|
"const Node Node::operator[](const Key& key) const" changed from
|
|
returning new empty node if the key was missing in 0.5.1 to returning
|
|
a shared 'zombie' node in 0.5.2 to resolve a memory leak.
|
|
|
|
(Specifically 1025f76df1b32b6ec3571ca928d7797a768a3341 was where this
|
|
was introduced)
|
|
|
|
This caused some regressions where this 'zombie' object threw exceptions
|
|
in some functions where the 'empty' object would not.
|
|
|
|
This change fixes the Node::as(fallback) method (to return the
|
|
'fallback' instead of throwing an exception) and the
|
|
Node::begin()/Node::end() methods to return default-constructed
|
|
iterators (so begin() == end() in such cases) instead of another
|
|
exception.
|
|
---
|
|
include/yaml-cpp/node/impl.h | 10 +++++-----
|
|
test/node/node_test.cpp | 32 ++++++++++++++++++++++++++++++++
|
|
2 files changed, 37 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h
|
|
index 26cccbd..69db1b7 100644
|
|
--- a/include/yaml-cpp/node/impl.h
|
|
+++ b/include/yaml-cpp/node/impl.h
|
|
@@ -149,7 +149,7 @@ inline const T Node::as() const {
|
|
template <typename T, typename S>
|
|
inline const T Node::as(const S& fallback) const {
|
|
if (!m_isValid)
|
|
- throw InvalidNode();
|
|
+ return fallback;
|
|
return as_if<T, S>(*this)(fallback);
|
|
}
|
|
|
|
@@ -282,26 +282,26 @@ inline std::size_t Node::size() const {
|
|
|
|
inline const_iterator Node::begin() const {
|
|
if (!m_isValid)
|
|
- throw InvalidNode();
|
|
+ return const_iterator();
|
|
return m_pNode ? const_iterator(m_pNode->begin(), m_pMemory)
|
|
: const_iterator();
|
|
}
|
|
|
|
inline iterator Node::begin() {
|
|
if (!m_isValid)
|
|
- throw InvalidNode();
|
|
+ return iterator();
|
|
return m_pNode ? iterator(m_pNode->begin(), m_pMemory) : iterator();
|
|
}
|
|
|
|
inline const_iterator Node::end() const {
|
|
if (!m_isValid)
|
|
- throw InvalidNode();
|
|
+ return const_iterator();
|
|
return m_pNode ? const_iterator(m_pNode->end(), m_pMemory) : const_iterator();
|
|
}
|
|
|
|
inline iterator Node::end() {
|
|
if (!m_isValid)
|
|
- throw InvalidNode();
|
|
+ return iterator();
|
|
return m_pNode ? iterator(m_pNode->end(), m_pMemory) : iterator();
|
|
}
|
|
|
|
diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp
|
|
index 03ad782..b00c69d 100644
|
|
--- a/test/node/node_test.cpp
|
|
+++ b/test/node/node_test.cpp
|
|
@@ -80,6 +80,12 @@ TEST(NodeTest, MapWithUndefinedValues) {
|
|
EXPECT_EQ(2, node.size());
|
|
}
|
|
|
|
+TEST(NodeTest, UndefinedConstNodeWithFallback) {
|
|
+ Node node;
|
|
+ const Node& cn = node;
|
|
+ EXPECT_EQ(cn["undefined"].as<int>(3), 3);
|
|
+}
|
|
+
|
|
TEST(NodeTest, MapIteratorWithUndefinedValues) {
|
|
Node node;
|
|
node["key"] = "value";
|
|
@@ -91,6 +97,32 @@ TEST(NodeTest, MapIteratorWithUndefinedValues) {
|
|
EXPECT_EQ(1, count);
|
|
}
|
|
|
|
+TEST(NodeTest, ConstIteratorOnConstUndefinedNode) {
|
|
+ Node node;
|
|
+ const Node& cn = node;
|
|
+ const Node& undefinedCn = cn["undefined"];
|
|
+
|
|
+ std::size_t count = 0;
|
|
+ for (const_iterator it = undefinedCn.begin(); it != undefinedCn.end(); ++it) {
|
|
+ count++;
|
|
+ }
|
|
+ EXPECT_EQ(0, count);
|
|
+}
|
|
+
|
|
+TEST(NodeTest, IteratorOnConstUndefinedNode) {
|
|
+ Node node;
|
|
+ const Node& cn = node;
|
|
+ const Node& undefinedCn = cn["undefined"];
|
|
+
|
|
+ Node& nonConstUndefinedNode = const_cast<Node&>(undefinedCn);
|
|
+
|
|
+ std::size_t count = 0;
|
|
+ for (iterator it = nonConstUndefinedNode.begin(); it != nonConstUndefinedNode.end(); ++it) {
|
|
+ count++;
|
|
+ }
|
|
+ EXPECT_EQ(0, count);
|
|
+}
|
|
+
|
|
TEST(NodeTest, SimpleSubkeys) {
|
|
Node node;
|
|
node["device"]["udid"] = "12345";
|