mirror of
https://github.com/boostorg/exception.git
synced 2025-07-30 20:47:18 +02:00
Revert "Don't double-rethrow std::exception_ptr (#53)"
This reverts commit ea70868a45
.
This commit is contained in:
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user