Fix minor issues that are seen by tests and appeared after refactoring

This commit is contained in:
Antony Polukhin
2016-11-23 22:55:39 +03:00
parent 32be7aefe0
commit aaef5f134f
5 changed files with 26 additions and 9 deletions

View File

@@ -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;
};

View File

@@ -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<backtrace_holder*>(data_)->~backtrace_holder();
new(data_) backtrace_holder(
b.impl()
);
return *this;
}
backend::~backend() BOOST_NOEXCEPT {
reinterpret_cast<backtrace_holder*>(data_)->~backtrace_holder();
}

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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<stacktrace, stacktrace> 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);