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