From 7062572c8f38c7b15181bd352d5f606091d31317 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Sat, 31 May 2014 21:54:52 +0400 Subject: [PATCH 1/3] Re-implemented type name demangling. The new implementation does not depend on Boost.Units and is fully contained in Boost.Exception. --- .../boost/exception/detail/exception_ptr.hpp | 8 ++-- include/boost/exception/detail/type_info.hpp | 39 ++++++++++++++++--- .../exception/diagnostic_information.hpp | 8 ++-- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/include/boost/exception/detail/exception_ptr.hpp b/include/boost/exception/detail/exception_ptr.hpp index a15bfc4..f9329a0 100644 --- a/include/boost/exception/detail/exception_ptr.hpp +++ b/include/boost/exception/detail/exception_ptr.hpp @@ -21,9 +21,9 @@ #include #include #include -//#ifndef BOOST_NO_RTTI -//#include -//#endif +#ifndef BOOST_NO_RTTI +#include // exception_detail::demangle +#endif #include #include #include @@ -92,7 +92,7 @@ boost std::string to_string( original_exception_type const & x ) { - return /*units::detail::demangle*/(x.value()->name()); + return exception_detail::demangle(x.value()->name()); } #endif diff --git a/include/boost/exception/detail/type_info.hpp b/include/boost/exception/detail/type_info.hpp index 6e5942d..a66c747 100644 --- a/include/boost/exception/detail/type_info.hpp +++ b/include/boost/exception/detail/type_info.hpp @@ -15,14 +15,43 @@ #include #include #include -//#ifndef BOOST_NO_TYPEID -//#include -//#endif #include +#if defined(__GLIBCXX__) || defined(__GLIBCPP__) +#include +#include +#include +#define BOOST_EXCEPTION_HAS_CXXABI_H +#endif namespace boost { + namespace + exception_detail + { + inline + std::string + demangle(const char* name) + { +#ifdef BOOST_EXCEPTION_HAS_CXXABI_H + struct auto_free + { + explicit auto_free(char* ptr) : p(ptr) {} + ~auto_free() { free(p); } + char* p; + }; + + int status = 0; + size_t size = 0; + auto_free demangled(abi::__cxa_demangle(name, NULL, &size, &status)); + + if (demangled.p) + return demangled.p; +#endif + return name; + } + } + template inline std::string @@ -31,7 +60,7 @@ boost #ifdef BOOST_NO_TYPEID return BOOST_CURRENT_FUNCTION; #else - return /*units::detail::demangle*/(typeid(T*).name()); + return exception_detail::demangle(typeid(T*).name()); #endif } @@ -43,7 +72,7 @@ boost #ifdef BOOST_NO_TYPEID return BOOST_CURRENT_FUNCTION; #else - return /*units::detail::demangle*/(typeid(T).name()); + return exception_detail::demangle(typeid(T).name()); #endif } diff --git a/include/boost/exception/diagnostic_information.hpp b/include/boost/exception/diagnostic_information.hpp index 2f5cb88..181822a 100644 --- a/include/boost/exception/diagnostic_information.hpp +++ b/include/boost/exception/diagnostic_information.hpp @@ -16,9 +16,9 @@ #include #include #include -//#ifndef BOOST_NO_RTTI -//#include -//#endif +#ifndef BOOST_NO_RTTI +#include // exception_detail::demangle() +#endif #include #include #include @@ -151,7 +151,7 @@ boost #ifndef BOOST_NO_RTTI if ( verbose ) tmp << std::string("Dynamic exception type: ") << - /*units::detail::demangle*/((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se))).type_->name()) << '\n'; + exception_detail::demangle((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se))).type_->name()) << '\n'; #endif if( with_what && se && verbose ) tmp << "std::exception::what: " << wh << '\n'; From 8f097eb241169082bb85b6e89670d55a2a62bb37 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Sat, 31 May 2014 21:57:51 +0400 Subject: [PATCH 2/3] Comment fix. --- include/boost/exception/detail/exception_ptr.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/exception/detail/exception_ptr.hpp b/include/boost/exception/detail/exception_ptr.hpp index f9329a0..c57c38e 100644 --- a/include/boost/exception/detail/exception_ptr.hpp +++ b/include/boost/exception/detail/exception_ptr.hpp @@ -22,7 +22,7 @@ #include #include #ifndef BOOST_NO_RTTI -#include // exception_detail::demangle +#include // exception_detail::demangle() #endif #include #include From a129725e3e6c5a7de3de93a77f726dff6c0cab5f Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Thu, 5 Jun 2014 00:50:04 +0400 Subject: [PATCH 3/3] Switched from BOOST_ATTRIBUTE_NORETURN to BOOST_NORETURN. --- include/boost/exception/detail/exception_ptr.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/boost/exception/detail/exception_ptr.hpp b/include/boost/exception/detail/exception_ptr.hpp index c57c38e..9bbcc73 100644 --- a/include/boost/exception/detail/exception_ptr.hpp +++ b/include/boost/exception/detail/exception_ptr.hpp @@ -34,7 +34,7 @@ namespace boost { class exception_ptr; - BOOST_ATTRIBUTE_NORETURN void rethrow_exception( exception_ptr const & ); + BOOST_NORETURN void rethrow_exception( exception_ptr const & ); exception_ptr current_exception(); class @@ -454,7 +454,7 @@ boost return ret; } - BOOST_ATTRIBUTE_NORETURN + BOOST_NORETURN inline void rethrow_exception( exception_ptr const & p )