File indexing completed on 2025-01-30 09:35:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #ifndef BOOST_CORE_UNCAUGHT_EXCEPTIONS_HPP_INCLUDED_
0020 #define BOOST_CORE_UNCAUGHT_EXCEPTIONS_HPP_INCLUDED_
0021
0022 #include <exception>
0023 #include <boost/config.hpp>
0024
0025 #if defined(BOOST_HAS_PRAGMA_ONCE)
0026 #pragma once
0027 #endif
0028
0029 #if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411)
0030 #if defined(__APPLE__)
0031 #include <Availability.h>
0032
0033
0034
0035
0036
0037
0038 #if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200) || \
0039 (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000)
0040 #define BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS
0041 #endif
0042 #else
0043 #define BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS
0044 #endif
0045
0046 #elif (defined(_MSC_VER) && _MSC_VER >= 1900)
0047 #define BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS
0048 #endif
0049
0050 #if !defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS)
0051
0052
0053 #if defined(__has_include) && (!defined(BOOST_GCC) || (__GNUC__ >= 5))
0054 # if __has_include(<cxxabi.h>)
0055 # define BOOST_CORE_HAS_CXXABI_H
0056 # endif
0057 #elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
0058 # define BOOST_CORE_HAS_CXXABI_H
0059 #endif
0060
0061 #if defined(BOOST_CORE_HAS_CXXABI_H)
0062
0063
0064
0065 #if !( \
0066 (defined(__MINGW32__) && (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 405)) || \
0067 defined(__ibmxl__) \
0068 )
0069 #include <cxxabi.h>
0070 #include <cstring>
0071 #define BOOST_CORE_HAS_CXA_GET_GLOBALS
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082 #if !defined(__FreeBSD__) && \
0083 ( \
0084 (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) || \
0085 defined(__OpenBSD__) || \
0086 (defined(__QNXNTO__) && !defined(__GLIBCXX__) && !defined(__GLIBCPP__)) || \
0087 defined(_LIBCPPABI_VERSION) \
0088 )
0089 namespace __cxxabiv1 {
0090 struct __cxa_eh_globals;
0091 #if defined(__OpenBSD__)
0092 extern "C" __cxa_eh_globals* __cxa_get_globals();
0093 #else
0094 extern "C" __cxa_eh_globals* __cxa_get_globals() BOOST_NOEXCEPT_OR_NOTHROW __attribute__((__const__));
0095 #endif
0096 }
0097 #endif
0098 #endif
0099 #endif
0100
0101 #if defined(_MSC_VER) && _MSC_VER >= 1400
0102 #include <cstring>
0103 #define BOOST_CORE_HAS_GETPTD
0104 namespace boost {
0105 namespace core {
0106 namespace detail {
0107 extern "C" void* _getptd();
0108 }
0109 }
0110 }
0111 #endif
0112
0113 #endif
0114
0115 #if !defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS) && !defined(BOOST_CORE_HAS_CXA_GET_GLOBALS) && !defined(BOOST_CORE_HAS_GETPTD)
0116
0117 #define BOOST_CORE_UNCAUGHT_EXCEPTIONS_EMULATED
0118 #endif
0119
0120 namespace boost {
0121
0122 namespace core {
0123
0124
0125 inline unsigned int uncaught_exceptions() BOOST_NOEXCEPT
0126 {
0127 #if defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS)
0128
0129 return static_cast< unsigned int >(std::uncaught_exceptions());
0130 #elif defined(BOOST_CORE_HAS_CXA_GET_GLOBALS)
0131
0132 unsigned int count;
0133 std::memcpy(&count, reinterpret_cast< const unsigned char* >(::abi::__cxa_get_globals()) + sizeof(void*), sizeof(count));
0134 return count;
0135 #elif defined(BOOST_CORE_HAS_GETPTD)
0136
0137 unsigned int count;
0138 std::memcpy(&count, static_cast< const unsigned char* >(boost::core::detail::_getptd()) + (sizeof(void*) == 8u ? 0x100 : 0x90), sizeof(count));
0139 return count;
0140 #else
0141
0142 return static_cast< unsigned int >(std::uncaught_exception());
0143 #endif
0144 }
0145
0146 }
0147
0148 }
0149
0150 #undef BOOST_CORE_HAS_CXXABI_H
0151 #undef BOOST_CORE_HAS_CXA_GET_GLOBALS
0152 #undef BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS
0153 #undef BOOST_CORE_HAS_GETPTD
0154
0155 #endif