diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index 0cf2a62..fb47659 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -5,7 +5,10 @@ # Distributed under the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -alias boost_exception ; -lib boost_exception : ../src/clone_current_exception_msvc.cpp : msvc ; +project boost/exception + : source-location ../src + : requirements static + ; +lib boost_exception : clone_current_exception_non_intrusive.cpp ; boost-install boost_exception ; diff --git a/include/boost/exception/detail/clone_current_exception.hpp b/include/boost/exception/detail/clone_current_exception.hpp index 28e3377..cc201b9 100644 --- a/include/boost/exception/detail/clone_current_exception.hpp +++ b/include/boost/exception/detail/clone_current_exception.hpp @@ -7,7 +7,7 @@ #define UUID_81522C0EB56511DFAB613DB0DFD72085 #ifdef BOOST_NO_EXCEPTIONS -#error This header requires exception handling to be enabled. +# error This header requires exception handling to be enabled. #endif namespace @@ -16,6 +16,12 @@ boost namespace exception_detail { + class clone_base; + +#ifdef BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR + int clone_current_exception_non_intrusive( clone_base const * & cloned ); +#endif + namespace clone_current_exception_result { @@ -25,15 +31,12 @@ boost int const not_supported=3; } - class clone_base; - int clone_current_exception_msvc_x86( clone_base const * & cloned ); - inline int clone_current_exception( clone_base const * & cloned ) { -#if defined(BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR) && defined(_MSC_VER) && defined(_M_IX86) && !defined(_M_X64) - return clone_current_exception_msvc_x86(cloned); +#ifdef BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR + return clone_current_exception_non_intrusive(cloned); #else return clone_current_exception_result::not_supported; #endif diff --git a/include/boost/exception/detail/exception_ptr.hpp b/include/boost/exception/detail/exception_ptr.hpp index b1731ee..b6ccf7e 100644 --- a/include/boost/exception/detail/exception_ptr.hpp +++ b/include/boost/exception/detail/exception_ptr.hpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace boost @@ -455,6 +456,8 @@ boost { BOOST_ASSERT(p); p.ptr_->rethrow(); + BOOST_ASSERT(0); + std::abort(); } inline diff --git a/include/boost/exception/exception.hpp b/include/boost/exception/exception.hpp index 6e9d405..9cdfd5c 100644 --- a/include/boost/exception/exception.hpp +++ b/include/boost/exception/exception.hpp @@ -132,7 +132,17 @@ boost } }; +#if defined(__GNUC__) +# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) +# pragma GCC visibility push (default) +# endif +#endif class exception; +#if defined(__GNUC__) +# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) +# pragma GCC visibility pop +# endif +#endif template class shared_ptr; diff --git a/src/clone_current_exception_msvc.cpp b/src/clone_current_exception_non_intrusive.cpp similarity index 91% rename from src/clone_current_exception_msvc.cpp rename to src/clone_current_exception_non_intrusive.cpp index 5dda846..1710cd7 100644 --- a/src/clone_current_exception_msvc.cpp +++ b/src/clone_current_exception_non_intrusive.cpp @@ -10,9 +10,13 @@ #error This file requires exception handling to be enabled. #endif -#if defined(_MSC_VER) && defined(_M_IX86) && !defined(_M_X64) - #include + +#if defined(BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR) && defined(_MSC_VER) && defined(_M_IX86) && !defined(_M_X64) + +//Non-intrusive cloning support implemented below, only for MSVC versions mentioned above. +//Thanks Anthony Williams! + #include #include #ifndef BOOST_NO_RTTI @@ -269,7 +273,7 @@ boost exception_detail { int - clone_current_exception_msvc_x86( clone_base const * & cloned ) + clone_current_exception_non_intrusive( clone_base const * & cloned ) { BOOST_ASSERT(!cloned); int result = clone_current_exception_result::not_supported; @@ -292,4 +296,25 @@ boost } } +#else + +//On all other compilers, return clone_current_exception_result::not_supported. +//On such platforms, only the intrusive enable_current_exception() cloning will work. + +#include + +namespace +boost + { + namespace + exception_detail + { + int + clone_current_exception_non_intrusive( clone_base const * & ) + { + return clone_current_exception_result::not_supported; + } + } + } + #endif diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index b989171..a53b472 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -8,12 +8,10 @@ import testing ; project - : requirements - static - on - /boost//exception - BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR - ; + : requirements + static + on + ; #to_string @@ -42,6 +40,7 @@ run refcount_ptr_test.cpp ; run current_exception_cast_test.cpp ; run no_exceptions_test.cpp : : : off ; run errinfos_test.cpp ; +run exception_ptr_test.cpp/BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR /boost/exception /boost//thread : : : multi : non_intrusive_exception_ptr_test ; run exception_ptr_test.cpp /boost//thread : : : multi ; compile-fail exception_fail.cpp ;