From aaef5f134f3b34e7873b5faa1ff0ef92d84da423 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Wed, 23 Nov 2016 22:55:39 +0300 Subject: [PATCH] Fix minor issues that are seen by tests and appeared after refactoring --- include/boost/stacktrace/detail/backend.hpp | 1 + include/boost/stacktrace/detail/backend_common.ipp | 13 +++++++++++++ include/boost/stacktrace/detail/backend_noop.hpp | 4 ++++ include/boost/stacktrace/stacktrace.hpp | 5 ++--- test/test.cpp | 12 ++++++------ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/include/boost/stacktrace/detail/backend.hpp b/include/boost/stacktrace/detail/backend.hpp index 8312744..e915bfd 100644 --- a/include/boost/stacktrace/detail/backend.hpp +++ b/include/boost/stacktrace/detail/backend.hpp @@ -86,6 +86,7 @@ public: BOOST_STACKTRACE_FUNCTION bool operator==(const backend& rhs) const BOOST_NOEXCEPT; BOOST_STACKTRACE_FUNCTION backend(const backend& b, void* memory) BOOST_NOEXCEPT; + BOOST_STACKTRACE_FUNCTION backend& operator=(const backend& b) BOOST_NOEXCEPT; BOOST_STACKTRACE_FUNCTION ~backend() BOOST_NOEXCEPT; BOOST_STACKTRACE_FUNCTION std::size_t size() const BOOST_NOEXCEPT; }; diff --git a/include/boost/stacktrace/detail/backend_common.ipp b/include/boost/stacktrace/detail/backend_common.ipp index 7e138c2..3b76e72 100644 --- a/include/boost/stacktrace/detail/backend_common.ipp +++ b/include/boost/stacktrace/detail/backend_common.ipp @@ -22,6 +22,19 @@ backend::backend(const backend& b, void* memory) BOOST_NOEXCEPT ); } +backend& backend::operator=(const backend& b) BOOST_NOEXCEPT { + if (data_ == b.data_) { + return *this; + } + + reinterpret_cast(data_)->~backtrace_holder(); + new(data_) backtrace_holder( + b.impl() + ); + + return *this; +} + backend::~backend() BOOST_NOEXCEPT { reinterpret_cast(data_)->~backtrace_holder(); } diff --git a/include/boost/stacktrace/detail/backend_noop.hpp b/include/boost/stacktrace/detail/backend_noop.hpp index c0d636a..69661cf 100644 --- a/include/boost/stacktrace/detail/backend_noop.hpp +++ b/include/boost/stacktrace/detail/backend_noop.hpp @@ -46,6 +46,10 @@ backend::backend(const backend& b, void* memory) BOOST_NOEXCEPT : data_(memory) {} +backend& backend::operator=(const backend& b) BOOST_NOEXCEPT { + return *this; +} + backend::~backend() BOOST_NOEXCEPT {} std::size_t backend::size() const BOOST_NOEXCEPT { diff --git a/include/boost/stacktrace/stacktrace.hpp b/include/boost/stacktrace/stacktrace.hpp index b408216..510ba17 100644 --- a/include/boost/stacktrace/stacktrace.hpp +++ b/include/boost/stacktrace/stacktrace.hpp @@ -45,7 +45,7 @@ public: /// @brief Stores the current function call sequence inside the class. /// /// @b Complexity: O(N) where N is call seaquence length, O(1) for noop backend. - stacktrace() BOOST_NOEXCEPT + BOOST_FORCEINLINE stacktrace() BOOST_NOEXCEPT : impl_() , hash_code_() , back_(&impl_, sizeof(impl_), hash_code_) @@ -60,9 +60,8 @@ public: /// @b Complexity: O(1) stacktrace& operator=(const stacktrace& st) BOOST_NOEXCEPT { - back_.~backend(); hash_code_ = st.hash_code_; - new (&back_) boost::stacktrace::detail::backend(st.back_, &impl_); + back_ = back_; return *this; } diff --git a/test/test.cpp b/test/test.cpp index 363cb10..1e4814f 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -29,28 +29,28 @@ void test_deeply_nested_namespaces() { ss << return_from_nested_namespaces(); std::cout << ss.str() << '\n'; BOOST_TEST(ss.str().find("main") != std::string::npos); -std::cerr << "cerr 1\n"; + #if defined(BOOST_STACKTRACE_DYN_LINK) || !defined(BOOST_STACKTRACE_USE_BACKTRACE) BOOST_TEST(ss.str().find("get_backtrace_from_nested_namespaces") != std::string::npos); #endif -std::cerr << "cerr 2\n"; + stacktrace ns1 = return_from_nested_namespaces(); BOOST_TEST(ns1 != return_from_nested_namespaces()); // Different addresses in test_deeply_nested_namespaces() function std::cerr << "cerr 3\n"; } void test_nested() { -std::cerr << "cerr 4\n"; + std::pair res = foo2(15); -std::cerr << "cerr 5\n"; + std::stringstream ss1, ss2; -std::cerr << "cerr 6\n"; + ss1 << res.first; ss2 << res.second; std::cout << "'" << ss1.str() << "'\n\n" << ss2.str() << std::endl; BOOST_TEST(!ss1.str().empty()); BOOST_TEST(!ss2.str().empty()); -std::cerr << "cerr 7\n"; + BOOST_TEST(ss1.str().find(" 0# ") != std::string::npos); BOOST_TEST(ss2.str().find(" 0# ") != std::string::npos);