X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FExceptionWrapper.cpp;h=f2fa016437558dc3be01c13a29e970f272b087af;hp=c1440a57a40a9f67d84d8301ba4babd081560be6;hb=35054c8b8eefa0abaded33ff4150d195c9bf0e80;hpb=19e3e9fe724a363e342e92a5b08378900d6ab539 diff --git a/folly/ExceptionWrapper.cpp b/folly/ExceptionWrapper.cpp index c1440a57..f2fa0164 100644 --- a/folly/ExceptionWrapper.cpp +++ b/folly/ExceptionWrapper.cpp @@ -21,9 +21,32 @@ namespace folly { -constexpr exception_wrapper::VTable const exception_wrapper::uninit_; -constexpr exception_wrapper::VTable const exception_wrapper::ExceptionPtr::ops_; -constexpr exception_wrapper::VTable const exception_wrapper::SharedPtr::ops_; +exception_wrapper::VTable const exception_wrapper::uninit_{ + &noop_, + &noop_, + &noop_, + &noop_, + &uninit_type_, + &noop_, + &noop_}; + +exception_wrapper::VTable const exception_wrapper::ExceptionPtr::ops_{ + copy_, + move_, + delete_, + throw_, + type_, + get_exception_, + get_exception_ptr_}; + +exception_wrapper::VTable const exception_wrapper::SharedPtr::ops_{ + copy_, + move_, + delete_, + throw_, + type_, + get_exception_, + get_exception_ptr_}; namespace { std::exception const* get_std_exception_(std::exception_ptr eptr) noexcept { @@ -35,6 +58,20 @@ std::exception const* get_std_exception_(std::exception_ptr eptr) noexcept { return nullptr; } } +} // namespace + +exception_wrapper exception_wrapper::from_exception_ptr( + std::exception_ptr const& ptr) noexcept { + if (!ptr) { + return exception_wrapper(); + } + try { + std::rethrow_exception(ptr); + } catch (std::exception& e) { + return exception_wrapper(std::current_exception(), e); + } catch (...) { + return exception_wrapper(std::current_exception()); + } } exception_wrapper::exception_wrapper(std::exception_ptr ptr) noexcept @@ -53,11 +90,11 @@ exception_wrapper::exception_wrapper(std::exception_ptr ptr) noexcept } } -[[noreturn]] void exception_wrapper::onNoExceptionError() { +[[noreturn]] void exception_wrapper::onNoExceptionError( + char const* const name) { std::ios_base::Init ioinit_; // ensure std::cerr is alive - std::cerr - << "Cannot use `throwException` with an empty folly::exception_wrapper" - << std::endl; + std::cerr << "Cannot use `" << name + << "` with an empty folly::exception_wrapper" << std::endl; std::terminate(); } @@ -65,4 +102,4 @@ fbstring exceptionStr(exception_wrapper const& ew) { return ew.what(); } -} // folly +} // namespace folly