From 6eb78f9f337754a296c6cffec4514680f46e025b Mon Sep 17 00:00:00 2001 From: beefcurtains Date: Thu, 11 Jun 2015 15:01:22 +0000 Subject: [PATCH] yaml-cpp: include patch from upstream git It was broken in some cases since 0.5.1 --- .../regression-fixes-from-upstream-git.patch | 112 ++++++++++++++++++ srcpkgs/yaml-cpp/template | 2 +- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/yaml-cpp/patches/regression-fixes-from-upstream-git.patch diff --git a/srcpkgs/yaml-cpp/patches/regression-fixes-from-upstream-git.patch b/srcpkgs/yaml-cpp/patches/regression-fixes-from-upstream-git.patch new file mode 100644 index 00000000000..ce18953cdf6 --- /dev/null +++ b/srcpkgs/yaml-cpp/patches/regression-fixes-from-upstream-git.patch @@ -0,0 +1,112 @@ +commit b426fafff6238dda8d86fa668f585cba732dd272 +Author: Jonathan Hamilton +Date: Mon Jun 1 13:33:59 2015 -0700 + + 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.orig ++++ include/yaml-cpp/node/impl.h +@@ -149,7 +149,7 @@ inline const T Node::as() const { + template + inline const T Node::as(const S& fallback) const { + if (!m_isValid) +- throw InvalidNode(); ++ return fallback; + return as_if(*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(); + } + +--- test/node/node_test.cpp.orig ++++ 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(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(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"; diff --git a/srcpkgs/yaml-cpp/template b/srcpkgs/yaml-cpp/template index f86c14081e7..d47b127f4db 100644 --- a/srcpkgs/yaml-cpp/template +++ b/srcpkgs/yaml-cpp/template @@ -1,7 +1,7 @@ # Template file for 'yaml-cpp' pkgname=yaml-cpp version=0.5.2 -revision=1 +revision=2 wrksrc=${pkgname}-release-${version} build_style=cmake configure_args="-DBUILD_SHARED_LIBS=ON"