1// -*- C++ -*- 2//===----------------------------------------------------------------------===// 3// 4// The LLVM Compiler Infrastructure 5// 6// This file is dual licensed under the MIT and the University of Illinois Open 7// Source Licenses. See LICENSE.TXT for details. 8// 9//===----------------------------------------------------------------------===// 10 11#ifndef HAVE_DEPENDENT_EH_ABI 12#error this header may only be used with libc++abi or libcxxrt 13#endif 14 15namespace std { 16 17exception_ptr::~exception_ptr() _NOEXCEPT { 18 __cxa_decrement_exception_refcount(__ptr_); 19} 20 21exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT 22 : __ptr_(other.__ptr_) 23{ 24 __cxa_increment_exception_refcount(__ptr_); 25} 26 27exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT 28{ 29 if (__ptr_ != other.__ptr_) 30 { 31 __cxa_increment_exception_refcount(other.__ptr_); 32 __cxa_decrement_exception_refcount(__ptr_); 33 __ptr_ = other.__ptr_; 34 } 35 return *this; 36} 37 38nested_exception::nested_exception() _NOEXCEPT 39 : __ptr_(current_exception()) 40{ 41} 42 43nested_exception::~nested_exception() _NOEXCEPT 44{ 45} 46 47_LIBCPP_NORETURN 48void 49nested_exception::rethrow_nested() const 50{ 51 if (__ptr_ == nullptr) 52 terminate(); 53 rethrow_exception(__ptr_); 54} 55 56exception_ptr current_exception() _NOEXCEPT 57{ 58 // be nicer if there was a constructor that took a ptr, then 59 // this whole function would be just: 60 // return exception_ptr(__cxa_current_primary_exception()); 61 exception_ptr ptr; 62 ptr.__ptr_ = __cxa_current_primary_exception(); 63 return ptr; 64} 65 66_LIBCPP_NORETURN 67void rethrow_exception(exception_ptr p) 68{ 69 __cxa_rethrow_primary_exception(p.__ptr_); 70 // if p.__ptr_ is NULL, above returns so we terminate 71 terminate(); 72} 73 74} // namespace std 75