brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 33dbd40 Raw
178 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___CXX03___EXCEPTION_EXCEPTION_PTR_H10#define _LIBCPP___CXX03___EXCEPTION_EXCEPTION_PTR_H11 12#include <__cxx03/__config>13#include <__cxx03/__exception/operations.h>14#include <__cxx03/__memory/addressof.h>15#include <__cxx03/__memory/construct_at.h>16#include <__cxx03/__type_traits/decay.h>17#include <__cxx03/cstddef>18#include <__cxx03/cstdlib>19#include <__cxx03/new>20#include <__cxx03/typeinfo>21 22#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)23#  pragma GCC system_header24#endif25 26#ifndef _LIBCPP_ABI_MICROSOFT27 28#  if _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION29 30namespace __cxxabiv1 {31 32extern "C" {33_LIBCPP_OVERRIDABLE_FUNC_VIS void* __cxa_allocate_exception(size_t) throw();34_LIBCPP_OVERRIDABLE_FUNC_VIS void __cxa_free_exception(void*) throw();35 36struct __cxa_exception;37_LIBCPP_OVERRIDABLE_FUNC_VIS __cxa_exception* __cxa_init_primary_exception(38    void*,39    std::type_info*,40#    if defined(_WIN32)41    void(__thiscall*)(void*)) throw();42#    elif defined(__wasm__)43    // In Wasm, a destructor returns its argument44    void* (*)(void*)) throw();45#    else46    void (*)(void*)) throw();47#    endif48}49 50} // namespace __cxxabiv151 52#  endif53 54#endif55 56namespace std { // purposefully not using versioning namespace57 58#ifndef _LIBCPP_ABI_MICROSOFT59 60class _LIBCPP_EXPORTED_FROM_ABI exception_ptr {61  void* __ptr_;62 63  static exception_ptr __from_native_exception_pointer(void*) _NOEXCEPT;64 65  template <class _Ep>66  friend _LIBCPP_HIDE_FROM_ABI exception_ptr make_exception_ptr(_Ep) _NOEXCEPT;67 68public:69  // exception_ptr is basically a COW string.70  using __trivially_relocatable = exception_ptr;71 72  _LIBCPP_HIDE_FROM_ABI exception_ptr() _NOEXCEPT : __ptr_() {}73  _LIBCPP_HIDE_FROM_ABI exception_ptr(nullptr_t) _NOEXCEPT : __ptr_() {}74 75  exception_ptr(const exception_ptr&) _NOEXCEPT;76  exception_ptr& operator=(const exception_ptr&) _NOEXCEPT;77  ~exception_ptr() _NOEXCEPT;78 79  _LIBCPP_HIDE_FROM_ABI explicit operator bool() const _NOEXCEPT { return __ptr_ != nullptr; }80 81  friend _LIBCPP_HIDE_FROM_ABI bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT {82    return __x.__ptr_ == __y.__ptr_;83  }84 85  friend _LIBCPP_HIDE_FROM_ABI bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT {86    return !(__x == __y);87  }88 89  friend _LIBCPP_EXPORTED_FROM_ABI exception_ptr current_exception() _NOEXCEPT;90  friend _LIBCPP_EXPORTED_FROM_ABI void rethrow_exception(exception_ptr);91};92 93template <class _Ep>94_LIBCPP_HIDE_FROM_ABI exception_ptr make_exception_ptr(_Ep __e) _NOEXCEPT {95#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS96#    if _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION && __cplusplus >= 201103L97  using _Ep2 = __decay_t<_Ep>;98 99  void* __ex = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ep));100#      ifdef __wasm__101  // In Wasm, a destructor returns its argument102  (void)__cxxabiv1::__cxa_init_primary_exception(103      __ex, const_cast<std::type_info*>(&typeid(_Ep)), [](void* __p) -> void* {104#      else105  (void)__cxxabiv1::__cxa_init_primary_exception(__ex, const_cast<std::type_info*>(&typeid(_Ep)), [](void* __p) {106#      endif107        std::__destroy_at(static_cast<_Ep2*>(__p));108#      ifdef __wasm__109        return __p;110#      endif111      });112 113  try {114    ::new (__ex) _Ep2(__e);115    return exception_ptr::__from_native_exception_pointer(__ex);116  } catch (...) {117    __cxxabiv1::__cxa_free_exception(__ex);118    return current_exception();119  }120#    else121  try {122    throw __e;123  } catch (...) {124    return current_exception();125  }126#    endif127#  else128  ((void)__e);129  std::abort();130#  endif131}132 133#else // _LIBCPP_ABI_MICROSOFT134 135class _LIBCPP_EXPORTED_FROM_ABI exception_ptr {136  _LIBCPP_DIAGNOSTIC_PUSH137  _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wunused-private-field")138  void* __ptr1_;139  void* __ptr2_;140  _LIBCPP_DIAGNOSTIC_POP141 142public:143  exception_ptr() _NOEXCEPT;144  exception_ptr(nullptr_t) _NOEXCEPT;145  exception_ptr(const exception_ptr& __other) _NOEXCEPT;146  exception_ptr& operator=(const exception_ptr& __other) _NOEXCEPT;147  exception_ptr& operator=(nullptr_t) _NOEXCEPT;148  ~exception_ptr() _NOEXCEPT;149  explicit operator bool() const _NOEXCEPT;150};151 152_LIBCPP_EXPORTED_FROM_ABI bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT;153 154inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT {155  return !(__x == __y);156}157 158_LIBCPP_EXPORTED_FROM_ABI void swap(exception_ptr&, exception_ptr&) _NOEXCEPT;159 160_LIBCPP_EXPORTED_FROM_ABI exception_ptr __copy_exception_ptr(void* __except, const void* __ptr);161_LIBCPP_EXPORTED_FROM_ABI exception_ptr current_exception() _NOEXCEPT;162_LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void rethrow_exception(exception_ptr);163 164// This is a built-in template function which automagically extracts the required165// information.166template <class _E>167void* __GetExceptionInfo(_E);168 169template <class _Ep>170_LIBCPP_HIDE_FROM_ABI exception_ptr make_exception_ptr(_Ep __e) _NOEXCEPT {171  return __copy_exception_ptr(std::addressof(__e), __GetExceptionInfo(__e));172}173 174#endif // _LIBCPP_ABI_MICROSOFT175} // namespace std176 177#endif // _LIBCPP___CXX03___EXCEPTION_EXCEPTION_PTR_H178