1540d2a8bSDimitry Andric// -*- C++ -*-
2540d2a8bSDimitry Andric//===----------------------------------------------------------------------===//
3540d2a8bSDimitry Andric//
4540d2a8bSDimitry Andric//                     The LLVM Compiler Infrastructure
5540d2a8bSDimitry Andric//
6540d2a8bSDimitry Andric// This file is dual licensed under the MIT and the University of Illinois Open
7540d2a8bSDimitry Andric// Source Licenses. See LICENSE.TXT for details.
8540d2a8bSDimitry Andric//
9540d2a8bSDimitry Andric//===----------------------------------------------------------------------===//
10540d2a8bSDimitry Andric
11540d2a8bSDimitry Andric#include <cstdio>
12540d2a8bSDimitry Andric
13540d2a8bSDimitry Andricnamespace std {
14540d2a8bSDimitry Andric
15540d2a8bSDimitry Andric_LIBCPP_SAFE_STATIC static std::terminate_handler  __terminate_handler;
16540d2a8bSDimitry Andric_LIBCPP_SAFE_STATIC static std::unexpected_handler __unexpected_handler;
17540d2a8bSDimitry Andric
18540d2a8bSDimitry Andric
19540d2a8bSDimitry Andric// libcxxrt provides implementations of these functions itself.
20540d2a8bSDimitry Andricunexpected_handler
21540d2a8bSDimitry Andricset_unexpected(unexpected_handler func) _NOEXCEPT
22540d2a8bSDimitry Andric{
23b2c7081bSDimitry Andric  return __libcpp_atomic_exchange(&__unexpected_handler, func);
24540d2a8bSDimitry Andric}
25540d2a8bSDimitry Andric
26540d2a8bSDimitry Andricunexpected_handler
27540d2a8bSDimitry Andricget_unexpected() _NOEXCEPT
28540d2a8bSDimitry Andric{
29b2c7081bSDimitry Andric  return __libcpp_atomic_load(&__unexpected_handler);
30540d2a8bSDimitry Andric
31540d2a8bSDimitry Andric}
32540d2a8bSDimitry Andric
33540d2a8bSDimitry Andric_LIBCPP_NORETURN
34540d2a8bSDimitry Andricvoid unexpected()
35540d2a8bSDimitry Andric{
36540d2a8bSDimitry Andric    (*get_unexpected())();
37540d2a8bSDimitry Andric    // unexpected handler should not return
38540d2a8bSDimitry Andric    terminate();
39540d2a8bSDimitry Andric}
40540d2a8bSDimitry Andric
41540d2a8bSDimitry Andricterminate_handler
42540d2a8bSDimitry Andricset_terminate(terminate_handler func) _NOEXCEPT
43540d2a8bSDimitry Andric{
44b2c7081bSDimitry Andric  return __libcpp_atomic_exchange(&__terminate_handler, func);
45540d2a8bSDimitry Andric}
46540d2a8bSDimitry Andric
47540d2a8bSDimitry Andricterminate_handler
48540d2a8bSDimitry Andricget_terminate() _NOEXCEPT
49540d2a8bSDimitry Andric{
50b2c7081bSDimitry Andric  return __libcpp_atomic_load(&__terminate_handler);
51540d2a8bSDimitry Andric}
52540d2a8bSDimitry Andric
53540d2a8bSDimitry Andric#ifndef __EMSCRIPTEN__ // We provide this in JS
54540d2a8bSDimitry Andric_LIBCPP_NORETURN
55540d2a8bSDimitry Andricvoid
56540d2a8bSDimitry Andricterminate() _NOEXCEPT
57540d2a8bSDimitry Andric{
58540d2a8bSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
59540d2a8bSDimitry Andric    try
60540d2a8bSDimitry Andric    {
61540d2a8bSDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
62540d2a8bSDimitry Andric        (*get_terminate())();
63540d2a8bSDimitry Andric        // handler should not return
64540d2a8bSDimitry Andric        fprintf(stderr, "terminate_handler unexpectedly returned\n");
65540d2a8bSDimitry Andric        ::abort();
66540d2a8bSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
67540d2a8bSDimitry Andric    }
68540d2a8bSDimitry Andric    catch (...)
69540d2a8bSDimitry Andric    {
70540d2a8bSDimitry Andric        // handler should not throw exception
71540d2a8bSDimitry Andric        fprintf(stderr, "terminate_handler unexpectedly threw an exception\n");
72540d2a8bSDimitry Andric        ::abort();
73540d2a8bSDimitry Andric    }
74540d2a8bSDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
75540d2a8bSDimitry Andric}
76540d2a8bSDimitry Andric#endif // !__EMSCRIPTEN__
77540d2a8bSDimitry Andric
78540d2a8bSDimitry Andric#if !defined(__EMSCRIPTEN__)
79540d2a8bSDimitry Andricbool uncaught_exception() _NOEXCEPT { return uncaught_exceptions() > 0; }
80540d2a8bSDimitry Andric
81540d2a8bSDimitry Andricint uncaught_exceptions() _NOEXCEPT
82540d2a8bSDimitry Andric{
83540d2a8bSDimitry Andric#warning uncaught_exception not yet implemented
84540d2a8bSDimitry Andric  fprintf(stderr, "uncaught_exceptions not yet implemented\n");
85540d2a8bSDimitry Andric  ::abort();
86540d2a8bSDimitry Andric}
87540d2a8bSDimitry Andric#endif // !__EMSCRIPTEN__
88540d2a8bSDimitry Andric
89540d2a8bSDimitry Andric
90540d2a8bSDimitry Andricexception::~exception() _NOEXCEPT
91540d2a8bSDimitry Andric{
92540d2a8bSDimitry Andric}
93540d2a8bSDimitry Andric
94540d2a8bSDimitry Andricconst char* exception::what() const _NOEXCEPT
95540d2a8bSDimitry Andric{
96540d2a8bSDimitry Andric  return "std::exception";
97540d2a8bSDimitry Andric}
98540d2a8bSDimitry Andric
99540d2a8bSDimitry Andricbad_exception::~bad_exception() _NOEXCEPT
100540d2a8bSDimitry Andric{
101540d2a8bSDimitry Andric}
102540d2a8bSDimitry Andric
103540d2a8bSDimitry Andricconst char* bad_exception::what() const _NOEXCEPT
104540d2a8bSDimitry Andric{
105540d2a8bSDimitry Andric  return "std::bad_exception";
106540d2a8bSDimitry Andric}
107540d2a8bSDimitry Andric
108540d2a8bSDimitry Andric
109540d2a8bSDimitry Andricbad_alloc::bad_alloc() _NOEXCEPT
110540d2a8bSDimitry Andric{
111540d2a8bSDimitry Andric}
112540d2a8bSDimitry Andric
113540d2a8bSDimitry Andricbad_alloc::~bad_alloc() _NOEXCEPT
114540d2a8bSDimitry Andric{
115540d2a8bSDimitry Andric}
116540d2a8bSDimitry Andric
117540d2a8bSDimitry Andricconst char*
118540d2a8bSDimitry Andricbad_alloc::what() const _NOEXCEPT
119540d2a8bSDimitry Andric{
120540d2a8bSDimitry Andric    return "std::bad_alloc";
121540d2a8bSDimitry Andric}
122540d2a8bSDimitry Andric
123540d2a8bSDimitry Andricbad_array_new_length::bad_array_new_length() _NOEXCEPT
124540d2a8bSDimitry Andric{
125540d2a8bSDimitry Andric}
126540d2a8bSDimitry Andric
127540d2a8bSDimitry Andricbad_array_new_length::~bad_array_new_length() _NOEXCEPT
128540d2a8bSDimitry Andric{
129540d2a8bSDimitry Andric}
130540d2a8bSDimitry Andric
131540d2a8bSDimitry Andricconst char*
132540d2a8bSDimitry Andricbad_array_new_length::what() const _NOEXCEPT
133540d2a8bSDimitry Andric{
134540d2a8bSDimitry Andric    return "bad_array_new_length";
135540d2a8bSDimitry Andric}
136540d2a8bSDimitry Andric
137540d2a8bSDimitry Andricbad_cast::bad_cast() _NOEXCEPT
138540d2a8bSDimitry Andric{
139540d2a8bSDimitry Andric}
140540d2a8bSDimitry Andric
141540d2a8bSDimitry Andricbad_typeid::bad_typeid() _NOEXCEPT
142540d2a8bSDimitry Andric{
143540d2a8bSDimitry Andric}
144540d2a8bSDimitry Andric
145540d2a8bSDimitry Andricbad_cast::~bad_cast() _NOEXCEPT
146540d2a8bSDimitry Andric{
147540d2a8bSDimitry Andric}
148540d2a8bSDimitry Andric
149540d2a8bSDimitry Andricconst char*
150540d2a8bSDimitry Andricbad_cast::what() const _NOEXCEPT
151540d2a8bSDimitry Andric{
152540d2a8bSDimitry Andric  return "std::bad_cast";
153540d2a8bSDimitry Andric}
154540d2a8bSDimitry Andric
155540d2a8bSDimitry Andricbad_typeid::~bad_typeid() _NOEXCEPT
156540d2a8bSDimitry Andric{
157540d2a8bSDimitry Andric}
158540d2a8bSDimitry Andric
159540d2a8bSDimitry Andricconst char*
160540d2a8bSDimitry Andricbad_typeid::what() const _NOEXCEPT
161540d2a8bSDimitry Andric{
162540d2a8bSDimitry Andric  return "std::bad_typeid";
163540d2a8bSDimitry Andric}
164540d2a8bSDimitry Andric
165540d2a8bSDimitry Andric} // namespace std
166