Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/utilities/exceptions.hpp
40949 views
1
/*
2
* Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_UTILITIES_EXCEPTIONS_HPP
26
#define SHARE_UTILITIES_EXCEPTIONS_HPP
27
28
#include "memory/allocation.hpp"
29
#include "oops/oopsHierarchy.hpp"
30
#include "utilities/ostream.hpp"
31
#include "utilities/sizes.hpp"
32
33
// This file provides the basic support for exception handling in the VM.
34
// Note: We do not use C++ exceptions to avoid compiler dependencies and
35
// unpredictable performance.
36
//
37
// Scheme: Exceptions are stored with the thread. There is never more
38
// than one pending exception per thread. All functions that can throw
39
// an exception carry a THREAD argument (usually the last argument and
40
// declared with the TRAPS macro). Throwing an exception means setting
41
// a pending exception in the thread. Upon return from a function that
42
// can throw an exception, we must check if an exception is pending.
43
// The CHECK macros do this in a convenient way. Carrying around the
44
// thread provides also convenient access to it (e.g. for Handle
45
// creation, w/o the need for recomputation).
46
47
48
49
// Forward declarations to be independent of the include structure.
50
51
class JavaThread;
52
class Handle;
53
class Symbol;
54
class JavaCallArguments;
55
class methodHandle;
56
57
// The ThreadShadow class is a helper class to access the _pending_exception
58
// field of the Thread class w/o having access to the Thread's interface (for
59
// include hierachy reasons).
60
61
class ThreadShadow: public CHeapObj<mtThread> {
62
friend class VMStructs;
63
friend class JVMCIVMStructs;
64
65
protected:
66
oop _pending_exception; // Thread has gc actions.
67
const char* _exception_file; // file information for exception (debugging only)
68
int _exception_line; // line information for exception (debugging only)
69
friend void check_ThreadShadow(); // checks _pending_exception offset
70
71
// The following virtual exists only to force creation of a vtable.
72
// We need ThreadShadow to have a vtable, even in product builds,
73
// so that its layout will start at an offset of zero relative to Thread.
74
// Some C++ compilers are so "clever" that they put the ThreadShadow
75
// base class at offset 4 in Thread (after Thread's vtable), if they
76
// notice that Thread has a vtable but ThreadShadow does not.
77
virtual void unused_initial_virtual() { }
78
79
public:
80
oop pending_exception() const { return _pending_exception; }
81
bool has_pending_exception() const { return _pending_exception != NULL; }
82
const char* exception_file() const { return _exception_file; }
83
int exception_line() const { return _exception_line; }
84
85
// Code generation support
86
static ByteSize pending_exception_offset() { return byte_offset_of(ThreadShadow, _pending_exception); }
87
88
// use THROW whenever possible!
89
void set_pending_exception(oop exception, const char* file, int line);
90
91
// use CLEAR_PENDING_EXCEPTION whenever possible!
92
void clear_pending_exception();
93
94
// use CLEAR_PENDING_NONASYNC_EXCEPTION to clear probable nonasync exception.
95
void clear_pending_nonasync_exception();
96
97
ThreadShadow() : _pending_exception(NULL),
98
_exception_file(NULL), _exception_line(0) {}
99
};
100
101
102
// Exceptions is a helper class that encapsulates all operations
103
// that require access to the thread interface and which are
104
// relatively rare. The Exceptions operations should only be
105
// used directly if the macros below are insufficient.
106
107
class Exceptions {
108
static bool special_exception(JavaThread* thread, const char* file, int line, Handle exception);
109
static bool special_exception(JavaThread* thread, const char* file, int line, Symbol* name, const char* message);
110
111
// Count out of memory errors that are interesting in error diagnosis
112
static volatile int _out_of_memory_error_java_heap_errors;
113
static volatile int _out_of_memory_error_metaspace_errors;
114
static volatile int _out_of_memory_error_class_metaspace_errors;
115
116
// Count linkage errors
117
static volatile int _linkage_errors;
118
public:
119
// this enum is defined to indicate whether it is safe to
120
// ignore the encoding scheme of the original message string.
121
typedef enum {
122
safe_to_utf8 = 0,
123
unsafe_to_utf8 = 1
124
} ExceptionMsgToUtf8Mode;
125
// Throw exceptions: w/o message, w/ message & with formatted message.
126
static void _throw_oop(JavaThread* thread, const char* file, int line, oop exception);
127
static void _throw(JavaThread* thread, const char* file, int line, Handle exception, const char* msg = NULL);
128
129
static void _throw_msg(JavaThread* thread, const char* file, int line, Symbol* name, const char* message);
130
static void _throw_msg(JavaThread* thread, const char* file, int line, Symbol* name, const char* message,
131
Handle loader, Handle protection_domain);
132
133
static void _throw_msg_cause(JavaThread* thread, const char* file, int line, Symbol* name, const char* message, Handle h_cause);
134
static void _throw_msg_cause(JavaThread* thread, const char* file, int line, Symbol* name, const char* message, Handle h_cause,
135
Handle h_loader, Handle h_protection_domain);
136
137
static void _throw_cause(JavaThread* thread, const char* file, int line, Symbol* name, Handle h_cause);
138
static void _throw_cause(JavaThread* thread, const char* file, int line, Symbol* name, Handle h_cause,
139
Handle h_loader, Handle h_protection_domain);
140
141
static void _throw_args(JavaThread* thread, const char* file, int line,
142
Symbol* name, Symbol* signature,
143
JavaCallArguments* args);
144
145
// There is no THROW... macro for this method. Caller should remember
146
// to do a return after calling it.
147
static void fthrow(JavaThread* thread, const char* file, int line, Symbol* name,
148
const char* format, ...) ATTRIBUTE_PRINTF(5, 6);
149
150
// Create and initialize a new exception
151
static Handle new_exception(JavaThread* thread, Symbol* name,
152
Symbol* signature, JavaCallArguments* args,
153
Handle loader, Handle protection_domain);
154
155
static Handle new_exception(JavaThread* thread, Symbol* name,
156
Symbol* signature, JavaCallArguments* args,
157
Handle cause,
158
Handle loader, Handle protection_domain);
159
160
static Handle new_exception(JavaThread* thread, Symbol* name,
161
Handle cause,
162
Handle loader, Handle protection_domain,
163
ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
164
165
static Handle new_exception(JavaThread* thread, Symbol* name,
166
const char* message, Handle cause,
167
Handle loader, Handle protection_domain,
168
ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
169
170
static Handle new_exception(JavaThread* thread, Symbol* name,
171
const char* message,
172
ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
173
174
static void throw_stack_overflow_exception(JavaThread* thread, const char* file, int line, const methodHandle& method);
175
176
static void throw_unsafe_access_internal_error(JavaThread* thread, const char* file, int line, const char* message);
177
178
static void wrap_dynamic_exception(bool is_indy, JavaThread* thread);
179
180
// Exception counting for error files of interesting exceptions that may have
181
// caused a problem for the jvm
182
static volatile int _stack_overflow_errors;
183
184
static bool has_exception_counts();
185
static void count_out_of_memory_exceptions(Handle exception);
186
static void print_exception_counts_on_error(outputStream* st);
187
188
// for AbortVMOnException flag
189
static void debug_check_abort(Handle exception, const char* message = NULL);
190
static void debug_check_abort_helper(Handle exception, const char* message = NULL);
191
static void debug_check_abort(const char *value_string, const char* message = NULL);
192
193
// for logging exceptions
194
static void log_exception(Handle exception, const char* message);
195
};
196
197
198
// The THREAD & TRAPS macros facilitate the declaration of functions that throw exceptions.
199
// Convention: Use the TRAPS macro as the last argument of such a function; e.g.:
200
//
201
// int this_function_may_trap(int x, float y, TRAPS)
202
203
#define THREAD __the_thread__
204
#define TRAPS JavaThread* THREAD
205
206
207
// The CHECK... macros should be used to pass along a THREAD reference and to check for pending
208
// exceptions. In special situations it is necessary to handle pending exceptions explicitly,
209
// in these cases the PENDING_EXCEPTION helper macros should be used.
210
//
211
// Macro naming conventions: Macros that end with _ require a result value to be returned. They
212
// are for functions with non-void result type. The result value is usually ignored because of
213
// the exception and is only needed for syntactic correctness. The _0 ending is a shortcut for
214
// _(0) since this is a frequent case. Example:
215
//
216
// int result = this_function_may_trap(x_arg, y_arg, CHECK_0);
217
//
218
// CAUTION: make sure that the function call using a CHECK macro is not the only statement of a
219
// conditional branch w/o enclosing {} braces, since the CHECK macros expand into several state-
220
// ments! Also make sure it is not used on a function call that is part of a return statement!
221
222
#define PENDING_EXCEPTION (((ThreadShadow*)THREAD)->pending_exception())
223
#define HAS_PENDING_EXCEPTION (((ThreadShadow*)THREAD)->has_pending_exception())
224
#define CLEAR_PENDING_EXCEPTION (((ThreadShadow*)THREAD)->clear_pending_exception())
225
226
#define CHECK THREAD); if (HAS_PENDING_EXCEPTION) return ; (void)(0
227
#define CHECK_(result) THREAD); if (HAS_PENDING_EXCEPTION) return result; (void)(0
228
#define CHECK_0 CHECK_(0)
229
#define CHECK_NH CHECK_(Handle())
230
#define CHECK_NULL CHECK_(NULL)
231
#define CHECK_false CHECK_(false)
232
#define CHECK_JNI_ERR CHECK_(JNI_ERR)
233
234
// CAUTION: These macros clears all exceptions including async exceptions, use it with caution.
235
#define CHECK_AND_CLEAR THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return; } (void)(0
236
#define CHECK_AND_CLEAR_(result) THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return result; } (void)(0
237
#define CHECK_AND_CLEAR_0 CHECK_AND_CLEAR_(0)
238
#define CHECK_AND_CLEAR_NH CHECK_AND_CLEAR_(Handle())
239
#define CHECK_AND_CLEAR_NULL CHECK_AND_CLEAR_(NULL)
240
#define CHECK_AND_CLEAR_false CHECK_AND_CLEAR_(false)
241
242
// CAUTION: These macros clears all exceptions except probable async exceptions j.l.InternalError and j.l.ThreadDeath.
243
// So use it with caution.
244
#define CLEAR_PENDING_NONASYNC_EXCEPTION (((ThreadShadow*)THREAD)->clear_pending_nonasync_exception())
245
#define CHECK_AND_CLEAR_NONASYNC THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_NONASYNC_EXCEPTION; return; } (void)(0
246
#define CHECK_AND_CLEAR_NONASYNC_(result) THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_NONASYNC_EXCEPTION; return result; } (void)(0
247
#define CHECK_AND_CLEAR_NONASYNC_0 CHECK_AND_CLEAR_NONASYNC_(0)
248
#define CHECK_AND_CLEAR_NONASYNC_NH CHECK_AND_CLEAR_NONASYNC_(Handle())
249
#define CHECK_AND_CLEAR_NONASYNC_NULL CHECK_AND_CLEAR_NONASYNC_(NULL)
250
#define CHECK_AND_CLEAR_NONASYNC_false CHECK_AND_CLEAR_NONASYNC_(false)
251
252
// The THROW... macros should be used to throw an exception. They require a THREAD variable to be
253
// visible within the scope containing the THROW. Usually this is achieved by declaring the function
254
// with a TRAPS argument.
255
256
#define THREAD_AND_LOCATION THREAD, __FILE__, __LINE__
257
258
#define THROW_OOP(e) \
259
{ Exceptions::_throw_oop(THREAD_AND_LOCATION, e); return; }
260
261
#define THROW_HANDLE(e) \
262
{ Exceptions::_throw(THREAD_AND_LOCATION, e); return; }
263
264
#define THROW(name) \
265
{ Exceptions::_throw_msg(THREAD_AND_LOCATION, name, NULL); return; }
266
267
#define THROW_MSG(name, message) \
268
{ Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message); return; }
269
270
#define THROW_CAUSE(name, cause) \
271
{ Exceptions::_throw_cause(THREAD_AND_LOCATION, name, cause); return; }
272
273
#define THROW_MSG_LOADER(name, message, loader, protection_domain) \
274
{ Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message, loader, protection_domain); return; }
275
276
#define THROW_ARG(name, signature, args) \
277
{ Exceptions::_throw_args(THREAD_AND_LOCATION, name, signature, args); return; }
278
279
#define THROW_OOP_(e, result) \
280
{ Exceptions::_throw_oop(THREAD_AND_LOCATION, e); return result; }
281
282
#define THROW_HANDLE_(e, result) \
283
{ Exceptions::_throw(THREAD_AND_LOCATION, e); return result; }
284
285
#define THROW_(name, result) \
286
{ Exceptions::_throw_msg(THREAD_AND_LOCATION, name, NULL); return result; }
287
288
#define THROW_MSG_(name, message, result) \
289
{ Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message); return result; }
290
291
#define THROW_MSG_LOADER_(name, message, loader, protection_domain, result) \
292
{ Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message, loader, protection_domain); return result; }
293
294
#define THROW_ARG_(name, signature, args, result) \
295
{ Exceptions::_throw_args(THREAD_AND_LOCATION, name, signature, args); return result; }
296
297
#define THROW_MSG_CAUSE(name, message, cause) \
298
{ Exceptions::_throw_msg_cause(THREAD_AND_LOCATION, name, message, cause); return; }
299
300
#define THROW_MSG_CAUSE_(name, message, cause, result) \
301
{ Exceptions::_throw_msg_cause(THREAD_AND_LOCATION, name, message, cause); return result; }
302
303
304
#define THROW_OOP_0(e) THROW_OOP_(e, 0)
305
#define THROW_HANDLE_0(e) THROW_HANDLE_(e, 0)
306
#define THROW_0(name) THROW_(name, 0)
307
#define THROW_MSG_0(name, message) THROW_MSG_(name, message, 0)
308
#define THROW_WRAPPED_0(name, oop_to_wrap) THROW_WRAPPED_(name, oop_to_wrap, 0)
309
#define THROW_ARG_0(name, signature, arg) THROW_ARG_(name, signature, arg, 0)
310
#define THROW_MSG_CAUSE_0(name, message, cause) THROW_MSG_CAUSE_(name, message, cause, 0)
311
#define THROW_MSG_CAUSE_NULL(name, message, cause) THROW_MSG_CAUSE_(name, message, cause, NULL)
312
313
#define THROW_NULL(name) THROW_(name, NULL)
314
#define THROW_MSG_NULL(name, message) THROW_MSG_(name, message, NULL)
315
316
// The CATCH macro checks that no exception has been thrown by a function; it is used at
317
// call sites about which is statically known that the callee cannot throw an exception
318
// even though it is declared with TRAPS.
319
320
#define CATCH \
321
THREAD); if (HAS_PENDING_EXCEPTION) { \
322
oop ex = PENDING_EXCEPTION; \
323
CLEAR_PENDING_EXCEPTION; \
324
DEBUG_ONLY(ex->print();) \
325
assert(false, "CATCH"); \
326
} (void)(0
327
328
// ExceptionMark is a stack-allocated helper class for local exception handling.
329
// It is used with the EXCEPTION_MARK macro.
330
331
class ExceptionMark {
332
private:
333
JavaThread* _thread;
334
inline void check_no_pending_exception();
335
336
public:
337
ExceptionMark();
338
ExceptionMark(JavaThread* thread);
339
~ExceptionMark();
340
341
JavaThread* thread() {
342
return _thread;
343
}
344
};
345
346
// Use an EXCEPTION_MARK for 'local' exceptions. EXCEPTION_MARK makes sure that no
347
// pending exception exists upon entering its scope and tests that no pending exception
348
// exists when leaving the scope.
349
350
// See also preserveException.hpp for PreserveExceptionMark
351
// which preserves pre-existing exceptions and does not allow new
352
// exceptions.
353
354
#define EXCEPTION_MARK ExceptionMark __em; JavaThread* THREAD = __em.thread();
355
356
#endif // SHARE_UTILITIES_EXCEPTIONS_HPP
357
358