diff options
Diffstat (limited to 'libcxx/src/exception.cpp')
-rw-r--r-- | libcxx/src/exception.cpp | 52 |
1 files changed, 25 insertions, 27 deletions
diff --git a/libcxx/src/exception.cpp b/libcxx/src/exception.cpp index ac3a24165e7..92234b21d0f 100644 --- a/libcxx/src/exception.cpp +++ b/libcxx/src/exception.cpp @@ -32,51 +32,54 @@ static std::unexpected_handler __unexpected_handler; #endif // __APPLE__ +namespace std +{ + #if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) // libcxxrt provides implementations of these functions itself. -std::unexpected_handler -std::set_unexpected(std::unexpected_handler func) _NOEXCEPT +unexpected_handler +set_unexpected(unexpected_handler func) _NOEXCEPT { return __sync_lock_test_and_set(&__unexpected_handler, func); } -std::unexpected_handler -std::get_unexpected() _NOEXCEPT +unexpected_handler +get_unexpected() _NOEXCEPT { - return __sync_fetch_and_add(&__unexpected_handler, (std::unexpected_handler)0); + return __sync_fetch_and_add(&__unexpected_handler, (unexpected_handler)0); } _ATTRIBUTE(noreturn) void -std::unexpected() +unexpected() { - (*std::get_unexpected())(); + (*get_unexpected())(); // unexpected handler should not return - std::terminate(); + terminate(); } -std::terminate_handler -std::set_terminate(std::terminate_handler func) _NOEXCEPT +terminate_handler +set_terminate(terminate_handler func) _NOEXCEPT { return __sync_lock_test_and_set(&__terminate_handler, func); } -std::terminate_handler -std::get_terminate() _NOEXCEPT +terminate_handler +get_terminate() _NOEXCEPT { - return __sync_fetch_and_add(&__terminate_handler, (std::terminate_handler)0); + return __sync_fetch_and_add(&__terminate_handler, (terminate_handler)0); } _ATTRIBUTE(noreturn) void -std::terminate() _NOEXCEPT +terminate() _NOEXCEPT { #ifndef _LIBCPP_NO_EXCEPTIONS try { #endif // _LIBCPP_NO_EXCEPTIONS - (*std::get_terminate())(); + (*get_terminate())(); // handler should not return ::abort (); #ifndef _LIBCPP_NO_EXCEPTIONS @@ -90,23 +93,17 @@ std::terminate() _NOEXCEPT } #endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) -bool std::uncaught_exception() _NOEXCEPT +#ifndef LIBCXXRT +bool uncaught_exception() _NOEXCEPT { #if __APPLE__ // on Darwin, there is a helper function so __cxa_get_globals is private return __cxa_uncaught_exception(); -#elif LIBCXXRT - __cxa_eh_globals * globals = __cxa_get_globals(); - return (globals->uncaughtExceptions != 0); -#else // __APPLE__ #warning uncaught_exception not yet implemented ::abort(); #endif // __APPLE__ } -namespace std -{ - #ifndef _LIBCPPABI_VERSION exception::~exception() _NOEXCEPT @@ -128,6 +125,7 @@ const char* bad_exception::what() const _NOEXCEPT } #endif // _LIBCPPABI_VERSION +#endif //LIBCXXRT exception_ptr::~exception_ptr() _NOEXCEPT { @@ -184,15 +182,14 @@ nested_exception::rethrow_nested() const rethrow_exception(__ptr_); } -} // std -std::exception_ptr std::current_exception() _NOEXCEPT +exception_ptr current_exception() _NOEXCEPT { #if HAVE_DEPENDENT_EH_ABI // be nicer if there was a constructor that took a ptr, then // this whole function would be just: // return exception_ptr(__cxa_current_primary_exception()); - std::exception_ptr ptr; + exception_ptr ptr; ptr.__ptr_ = __cxa_current_primary_exception(); return ptr; #else // __APPLE__ @@ -202,7 +199,7 @@ std::exception_ptr std::current_exception() _NOEXCEPT } _ATTRIBUTE(noreturn) -void std::rethrow_exception(exception_ptr p) +void rethrow_exception(exception_ptr p) { #if HAVE_DEPENDENT_EH_ABI __cxa_rethrow_primary_exception(p.__ptr_); @@ -213,3 +210,4 @@ void std::rethrow_exception(exception_ptr p) ::abort(); #endif // __APPLE__ } +} // std |