brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 75cb7c9 Raw
64 lines · plain
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-exception7//8//===----------------------------------------------------------------------===//9 10#include <cxxabi.h>11#include <exception>12 13namespace std {14 15exception_ptr::~exception_ptr() noexcept { abi::__cxa_decrement_exception_refcount(__ptr_); }16 17exception_ptr::exception_ptr(const exception_ptr& other) noexcept : __ptr_(other.__ptr_) {18  abi::__cxa_increment_exception_refcount(__ptr_);19}20 21exception_ptr& exception_ptr::operator=(const exception_ptr& other) noexcept {22  if (__ptr_ != other.__ptr_) {23    abi::__cxa_increment_exception_refcount(other.__ptr_);24    abi::__cxa_decrement_exception_refcount(__ptr_);25    __ptr_ = other.__ptr_;26  }27  return *this;28}29 30exception_ptr exception_ptr::__from_native_exception_pointer(void* __e) noexcept {31  exception_ptr ptr;32  ptr.__ptr_ = __e;33  abi::__cxa_increment_exception_refcount(ptr.__ptr_);34 35  return ptr;36}37 38nested_exception::nested_exception() noexcept : __ptr_(current_exception()) {}39 40nested_exception::~nested_exception() noexcept {}41 42void nested_exception::rethrow_nested() const {43  if (__ptr_ == nullptr)44    terminate();45  rethrow_exception(__ptr_);46}47 48exception_ptr current_exception() noexcept {49  // be nicer if there was a constructor that took a ptr, then50  // this whole function would be just:51  //    return exception_ptr(__cxa_current_primary_exception());52  exception_ptr ptr;53  ptr.__ptr_ = abi::__cxa_current_primary_exception();54  return ptr;55}56 57void rethrow_exception(exception_ptr p) {58  abi::__cxa_rethrow_primary_exception(p.__ptr_);59  // if p.__ptr_ is NULL, above returns so we terminate60  terminate();61}62 63} // namespace std64