1 // Written in the D programming language.
2
3 /**
4 * Interface to C++ <exception>
5 *
6 * Copyright: Copyright (c) 2016 D Language Foundation
7 * License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
8 * Authors: $(HTTP digitalmars.com, Walter Bright)
9 * Manu Evans
10 * Source: $(DRUNTIMESRC core/stdcpp/_exception.d)
11 */
12
13 module core.stdcpp.exception;
14
15 import core.stdcpp.xutility : __cplusplus, CppStdRevision;
16 import core.attribute : weak;
17
18 version (CppRuntime_Gcc)
19 version = GenericBaseException;
20 version (CppRuntime_Clang)
21 version = GenericBaseException;
22 version (CppRuntime_Sun)
23 version = GenericBaseException;
24
25 extern (C++, "std"):
26 @nogc:
27
28 ///
29 alias terminate_handler = void function() nothrow;
30 ///
31 terminate_handler set_terminate(terminate_handler f) nothrow;
32 ///
33 terminate_handler get_terminate() nothrow;
34 ///
35 void terminate() nothrow;
36
37 static if (__cplusplus < CppStdRevision.cpp17)
38 {
39 ///
40 alias unexpected_handler = void function();
41 ///
42 deprecated unexpected_handler set_unexpected(unexpected_handler f) nothrow;
43 ///
44 deprecated unexpected_handler get_unexpected() nothrow;
45 ///
46 deprecated void unexpected();
47 }
48
49 static if (__cplusplus < CppStdRevision.cpp17)
50 {
51 ///
52 bool uncaught_exception() nothrow;
53 }
54 else static if (__cplusplus == CppStdRevision.cpp17)
55 {
56 ///
57 deprecated bool uncaught_exception() nothrow;
58 }
59 static if (__cplusplus >= CppStdRevision.cpp17)
60 {
61 ///
62 int uncaught_exceptions() nothrow;
63 }
64
version(GenericBaseException)65 version (GenericBaseException)
66 {
67 ///
68 class exception
69 {
70 @nogc:
71 ///
72 extern(D) this() nothrow {}
73 ///
74 @weak ~this() nothrow {} // HACK: this should extern, but then we have link errors!
75
76 ///
77 @weak const(char)* what() const nothrow { return "unknown"; } // HACK: this should extern, but then we have link errors!
78
79 protected:
80 extern(D) this(const(char)*, int = 1) nothrow { this(); } // compat with MS derived classes
81 }
82 }
version(CppRuntime_DigitalMars)83 else version (CppRuntime_DigitalMars)
84 {
85 ///
86 class exception
87 {
88 @nogc:
89 ///
90 extern(D) this() nothrow {}
91 //virtual ~this();
92 void dtor() { } // reserve slot in vtbl[]
93
94 ///
95 const(char)* what() const nothrow;
96
97 protected:
98 this(const(char)*, int = 1) nothrow { this(); } // compat with MS derived classes
99 }
100 }
version(CppRuntime_Microsoft)101 else version (CppRuntime_Microsoft)
102 {
103 ///
104 class exception
105 {
106 @nogc:
107 ///
108 extern(D) this(const(char)* message = "unknown", int = 1) nothrow { msg = message; }
109 ///
110 @weak ~this() nothrow {}
111
112 ///
113 @weak const(char)* what() const nothrow { return msg != null ? msg : "unknown exception"; }
114
115 // TODO: do we want this? exceptions are classes... ref types.
116 // final ref exception opAssign(ref const(exception) e) nothrow { msg = e.msg; return this; }
117
118 protected:
119 @weak void _Doraise() const { assert(0); }
120
121 protected:
122 const(char)* msg;
123 }
124
125 }
126 else
127 static assert(0, "Missing std::exception binding for this platform");
128
129 ///
130 class bad_exception : exception
131 {
132 @nogc:
133 ///
134 extern(D) this(const(char)* message = "bad exception") nothrow { super(message); }
135
version(GenericBaseException)136 version (GenericBaseException)
137 {
138 ///
139 @weak override const(char)* what() const nothrow { return "bad exception"; }
140 }
141 }
142