Revert "Don't double-rethrow std::exception_ptr (#53)"

This reverts commit ea70868a45.
This commit is contained in:
Emil Dotchevski
2023-08-06 15:20:29 -07:00
parent fe23c01a93
commit 11f102a987

View File

@ -44,48 +44,27 @@ boost
exception_detail exception_detail
{ {
#ifndef BOOST_NO_CXX11_HDR_EXCEPTION #ifndef BOOST_NO_CXX11_HDR_EXCEPTION
class struct
BOOST_SYMBOL_VISIBLE std_exception_ptr_wrapper:
std_exception_ptr_clone_impl: std::exception
public virtual clone_base
{ {
std::exception_ptr p_; std::exception_ptr p;
explicit std_exception_ptr_wrapper( std::exception_ptr const & ptr ) BOOST_NOEXCEPT:
public: p(ptr)
explicit std_exception_ptr_clone_impl( std::exception_ptr const & ptr ) BOOST_NOEXCEPT:
p_(ptr)
{ {
} }
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
~std_exception_ptr_clone_impl() BOOST_NOEXCEPT_OR_NOTHROW explicit std_exception_ptr_wrapper( std::exception_ptr && ptr ) BOOST_NOEXCEPT:
p(static_cast<std::exception_ptr &&>(ptr))
{ {
} }
#endif
private:
std_exception_ptr_clone_impl( std_exception_ptr_clone_impl const & x ):
p_(x.p_)
{
}
clone_base const*
clone() const
{
return new std_exception_ptr_clone_impl(*this);
}
void
rethrow() const
{
std::rethrow_exception(p_);
}
}; };
shared_ptr<exception_detail::clone_base const> shared_ptr<exception_detail::clone_base const>
inline inline
wrap_exception_ptr( std::exception_ptr const & e ) wrap_exception_ptr( std::exception_ptr const & e )
{ {
exception_detail::clone_base const & base = std_exception_ptr_clone_impl(e); exception_detail::clone_base const & base = boost::enable_current_exception(std_exception_ptr_wrapper(e));
return shared_ptr<exception_detail::clone_base const>(base.clone()); return shared_ptr<exception_detail::clone_base const>(base.clone());
} }
#endif #endif
@ -557,7 +536,20 @@ boost
rethrow_exception_( exception_ptr const & p ) rethrow_exception_( exception_ptr const & p )
{ {
BOOST_ASSERT(p); BOOST_ASSERT(p);
#if defined( BOOST_NO_CXX11_HDR_EXCEPTION ) || defined( BOOST_NO_EXCEPTIONS )
p.ptr_->rethrow(); p.ptr_->rethrow();
#else
try
{
p.ptr_->rethrow();
}
catch(
std_exception_ptr_wrapper const & wrp)
{
// if an std::exception_ptr was wrapped above then rethrow it
std::rethrow_exception(wrp.p);
}
#endif
} }
} }