annotate src/share/vm/utilities/exceptions.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents d17383603741
children aefb345d3f5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1011
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1011
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1011
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
25 #ifndef SHARE_VM_UTILITIES_EXCEPTIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
26 #define SHARE_VM_UTILITIES_EXCEPTIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
28 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
29 #include "oops/oopsHierarchy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
30 #include "utilities/sizes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
31
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // This file provides the basic support for exception handling in the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Note: We do not use C++ exceptions to avoid compiler dependencies and
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // unpredictable performance.
a61af66fc99e Initial load
duke
parents:
diff changeset
35 //
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // Scheme: Exceptions are stored with the thread. There is never more
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // than one pending exception per thread. All functions that can throw
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // an exception carry a THREAD argument (usually the last argument and
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // declared with the TRAPS macro). Throwing an exception means setting
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // a pending exception in the thread. Upon return from a function that
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // can throw an exception, we must check if an exception is pending.
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // The CHECK macros do this in a convenient way. Carrying around the
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // thread provides also convenient access to it (e.g. for Handle
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // creation, w/o the need for recomputation).
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Forward declarations to be independent of the include structure.
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // This allows us to have exceptions.hpp included in top.hpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class Thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class Handle;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
53 class Symbol;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class JavaCallArguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // The ThreadShadow class is a helper class to access the _pending_exception
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // field of the Thread class w/o having access to the Thread's interface (for
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // include hierachy reasons).
a61af66fc99e Initial load
duke
parents:
diff changeset
59
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4825
diff changeset
60 class ThreadShadow: public CHeapObj<mtThread> {
3939
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3272
diff changeset
61 friend class VMStructs;
f6f3bb0ee072 7088955: add C2 IR support to the SA
never
parents: 3272
diff changeset
62
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
64 oop _pending_exception; // Thread has gc actions.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 const char* _exception_file; // file information for exception (debugging only)
a61af66fc99e Initial load
duke
parents:
diff changeset
66 int _exception_line; // line information for exception (debugging only)
a61af66fc99e Initial load
duke
parents:
diff changeset
67 friend void check_ThreadShadow(); // checks _pending_exception offset
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // The following virtual exists only to force creation of a vtable.
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // We need ThreadShadow to have a vtable, even in product builds,
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // so that its layout will start at an offset of zero relative to Thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Some C++ compilers are so "clever" that they put the ThreadShadow
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // base class at offset 4 in Thread (after Thread's vtable), if they
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // notice that Thread has a vtable but ThreadShadow does not.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 virtual void unused_initial_virtual() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
78 oop pending_exception() const { return _pending_exception; }
a61af66fc99e Initial load
duke
parents:
diff changeset
79 bool has_pending_exception() const { return _pending_exception != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
80 const char* exception_file() const { return _exception_file; }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 int exception_line() const { return _exception_line; }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Code generation support
a61af66fc99e Initial load
duke
parents:
diff changeset
84 static ByteSize pending_exception_offset() { return byte_offset_of(ThreadShadow, _pending_exception); }
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // use THROW whenever possible!
a61af66fc99e Initial load
duke
parents:
diff changeset
87 void set_pending_exception(oop exception, const char* file, int line);
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // use CLEAR_PENDING_EXCEPTION whenever possible!
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 ThreadShadow() : _pending_exception(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
93 _exception_file(NULL), _exception_line(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
94 };
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Exceptions is a helper class that encapsulates all operations
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // that require access to the thread interface and which are
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // relatively rare. The Exceptions operations should only be
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // used directly if the macros below are insufficient.
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 class Exceptions {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static bool special_exception(Thread *thread, const char* file, int line, Handle exception);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
104 static bool special_exception(Thread* thread, const char* file, int line, Symbol* name, const char* message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // this enum is defined to indicate whether it is safe to
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // ignore the encoding scheme of the original message string.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 safe_to_utf8 = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
110 unsafe_to_utf8 = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
111 } ExceptionMsgToUtf8Mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Throw exceptions: w/o message, w/ message & with formatted message.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 static void _throw_oop(Thread* thread, const char* file, int line, oop exception);
1011
fcb148c6b605 6889302: TraceExceptions output should include detail message
never
parents: 844
diff changeset
114 static void _throw(Thread* thread, const char* file, int line, Handle exception, const char* msg = NULL);
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
115
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
116 static void _throw_msg(Thread* thread, const char* file, int line, Symbol* name, const char* message);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
117 static void _throw_msg(Thread* thread, const char* file, int line, Symbol* name, const char* message,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
118 Handle loader, Handle protection_domain);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
119
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
120 static void _throw_msg_cause(Thread* thread, const char* file, int line, Symbol* name, const char* message, Handle h_cause);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
121 static void _throw_msg_cause(Thread* thread, const char* file, int line, Symbol* name, const char* message, Handle h_cause,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
122 Handle h_loader, Handle h_protection_domain);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
123
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
124 static void _throw_cause(Thread* thread, const char* file, int line, Symbol* name, Handle h_cause);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
125 static void _throw_cause(Thread* thread, const char* file, int line, Symbol* name, Handle h_cause,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
126 Handle h_loader, Handle h_protection_domain);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
127
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128 static void _throw_args(Thread* thread, const char* file, int line,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
129 Symbol* name, Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 JavaCallArguments* args);
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // There is no THROW... macro for this method. Caller should remember
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // to do a return after calling it.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
134 static void fthrow(Thread* thread, const char* file, int line, Symbol* name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Create and initialize a new exception
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
138 static Handle new_exception(Thread* thread, Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
139 Symbol* signature, JavaCallArguments* args,
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
140 Handle loader, Handle protection_domain);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
141
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
142 static Handle new_exception(Thread* thread, Symbol* name,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
143 Symbol* signature, JavaCallArguments* args,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
144 Handle cause,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
145 Handle loader, Handle protection_domain);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
147 static Handle new_exception(Thread* thread, Symbol* name,
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
148 Handle cause,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
149 Handle loader, Handle protection_domain,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
a61af66fc99e Initial load
duke
parents:
diff changeset
151
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
152 static Handle new_exception(Thread* thread, Symbol* name,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
153 const char* message, Handle cause,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
154 Handle loader, Handle protection_domain,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
155 ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
156
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
157 static Handle new_exception(Thread* thread, Symbol* name,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
158 const char* message,
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
159 ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160
3272
01147d8aac1d 7009923: JSR 292: VM crash in JavaThread::last_frame
coleenp
parents: 2426
diff changeset
161 static void throw_stack_overflow_exception(Thread* thread, const char* file, int line, methodHandle method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // for AbortVMOnException flag
1684
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1552
diff changeset
164 NOT_PRODUCT(static void debug_check_abort(Handle exception, const char* message = NULL);)
66c5dadb4d61 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 1552
diff changeset
165 NOT_PRODUCT(static void debug_check_abort(const char *value_string, const char* message = NULL);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166 };
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // The THREAD & TRAPS macros facilitate the declaration of functions that throw exceptions.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Convention: Use the TRAPS macro as the last argument of such a function; e.g.:
a61af66fc99e Initial load
duke
parents:
diff changeset
171 //
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // int this_function_may_trap(int x, float y, TRAPS)
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 #define THREAD __the_thread__
a61af66fc99e Initial load
duke
parents:
diff changeset
175 #define TRAPS Thread* THREAD
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // The CHECK... macros should be used to pass along a THREAD reference and to check for pending
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // exceptions. In special situations it is necessary to handle pending exceptions explicitly,
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // in these cases the PENDING_EXCEPTION helper macros should be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
181 //
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Macro naming conventions: Macros that end with _ require a result value to be returned. They
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // are for functions with non-void result type. The result value is usually ignored because of
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // the exception and is only needed for syntactic correctness. The _0 ending is a shortcut for
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // _(0) since this is a frequent case. Example:
a61af66fc99e Initial load
duke
parents:
diff changeset
186 //
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // int result = this_function_may_trap(x_arg, y_arg, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 //
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // CAUTION: make sure that the function call using a CHECK macro is not the only statement of a
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // conditional branch w/o enclosing {} braces, since the CHECK macros expand into several state-
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // ments!
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 #define PENDING_EXCEPTION (((ThreadShadow*)THREAD)->pending_exception())
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #define HAS_PENDING_EXCEPTION (((ThreadShadow*)THREAD)->has_pending_exception())
a61af66fc99e Initial load
duke
parents:
diff changeset
195 #define CLEAR_PENDING_EXCEPTION (((ThreadShadow*)THREAD)->clear_pending_exception())
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #define CHECK THREAD); if (HAS_PENDING_EXCEPTION) return ; (0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 #define CHECK_(result) THREAD); if (HAS_PENDING_EXCEPTION) return result; (0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 #define CHECK_0 CHECK_(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
200 #define CHECK_NH CHECK_(Handle())
a61af66fc99e Initial load
duke
parents:
diff changeset
201 #define CHECK_NULL CHECK_(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
202 #define CHECK_false CHECK_(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
203
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
204 #define CHECK_AND_CLEAR THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return; } (0
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
205 #define CHECK_AND_CLEAR_(result) THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return result; } (0
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
206 #define CHECK_AND_CLEAR_0 CHECK_AND_CLEAR_(0)
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
207 #define CHECK_AND_CLEAR_NH CHECK_AND_CLEAR_(Handle())
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
208 #define CHECK_AND_CLEAR_NULL CHECK_AND_CLEAR_(NULL)
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
209 #define CHECK_AND_CLEAR_false CHECK_AND_CLEAR_(false)
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 3939
diff changeset
210
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // The THROW... macros should be used to throw an exception. They require a THREAD variable to be
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // visible within the scope containing the THROW. Usually this is achieved by declaring the function
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // with a TRAPS argument.
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 #define THREAD_AND_LOCATION THREAD, __FILE__, __LINE__
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 #define THROW_OOP(e) \
a61af66fc99e Initial load
duke
parents:
diff changeset
218 { Exceptions::_throw_oop(THREAD_AND_LOCATION, e); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 #define THROW_HANDLE(e) \
a61af66fc99e Initial load
duke
parents:
diff changeset
221 { Exceptions::_throw(THREAD_AND_LOCATION, e); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 #define THROW(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
224 { Exceptions::_throw_msg(THREAD_AND_LOCATION, name, NULL); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #define THROW_MSG(name, message) \
a61af66fc99e Initial load
duke
parents:
diff changeset
227 { Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
229 #define THROW_CAUSE(name, cause) \
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
230 { Exceptions::_throw_cause(THREAD_AND_LOCATION, name, cause); return; }
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
231
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #define THROW_MSG_LOADER(name, message, loader, protection_domain) \
a61af66fc99e Initial load
duke
parents:
diff changeset
233 { Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message, loader, protection_domain); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 #define THROW_ARG(name, signature, args) \
a61af66fc99e Initial load
duke
parents:
diff changeset
236 { Exceptions::_throw_args(THREAD_AND_LOCATION, name, signature, args); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 #define THROW_OOP_(e, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
239 { Exceptions::_throw_oop(THREAD_AND_LOCATION, e); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 #define THROW_HANDLE_(e, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
242 { Exceptions::_throw(THREAD_AND_LOCATION, e); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 #define THROW_(name, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
245 { Exceptions::_throw_msg(THREAD_AND_LOCATION, name, NULL); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #define THROW_MSG_(name, message, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
248 { Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 #define THROW_MSG_LOADER_(name, message, loader, protection_domain, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
251 { Exceptions::_throw_msg(THREAD_AND_LOCATION, name, message, loader, protection_domain); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #define THROW_ARG_(name, signature, args, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
254 { Exceptions::_throw_args(THREAD_AND_LOCATION, name, signature, args); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
256 #define THROW_MSG_CAUSE(name, message, cause) \
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
257 { Exceptions::_throw_msg_cause(THREAD_AND_LOCATION, name, message, cause); return; }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
258
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 #define THROW_MSG_CAUSE_(name, message, cause, result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
260 { Exceptions::_throw_msg_cause(THREAD_AND_LOCATION, name, message, cause); return result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 #define THROW_OOP_0(e) THROW_OOP_(e, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
264 #define THROW_HANDLE_0(e) THROW_HANDLE_(e, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #define THROW_0(name) THROW_(name, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
266 #define THROW_MSG_0(name, message) THROW_MSG_(name, message, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #define THROW_WRAPPED_0(name, oop_to_wrap) THROW_WRAPPED_(name, oop_to_wrap, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
268 #define THROW_ARG_0(name, signature, arg) THROW_ARG_(name, signature, arg, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #define THROW_MSG_CAUSE_0(name, message, cause) THROW_MSG_CAUSE_(name, message, cause, 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
270
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
271 #define THROW_NULL(name) THROW_(name, NULL)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
272 #define THROW_MSG_NULL(name, message) THROW_MSG_(name, message, NULL)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
273
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // The CATCH macro checks that no exception has been thrown by a function; it is used at
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // call sites about which is statically known that the callee cannot throw an exception
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // even though it is declared with TRAPS.
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #define CATCH \
a61af66fc99e Initial load
duke
parents:
diff changeset
279 THREAD); if (HAS_PENDING_EXCEPTION) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
280 oop ex = PENDING_EXCEPTION; \
a61af66fc99e Initial load
duke
parents:
diff changeset
281 CLEAR_PENDING_EXCEPTION; \
a61af66fc99e Initial load
duke
parents:
diff changeset
282 ex->print(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
283 ShouldNotReachHere(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
284 } (0
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // ExceptionMark is a stack-allocated helper class for local exception handling.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // It is used with the EXCEPTION_MARK macro.
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 class ExceptionMark {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
291 Thread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
294 ExceptionMark(Thread*& thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 ~ExceptionMark();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 };
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // Use an EXCEPTION_MARK for 'local' exceptions. EXCEPTION_MARK makes sure that no
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // pending exception exists upon entering its scope and tests that no pending exception
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // exists when leaving the scope.
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // See also preserveException.hpp for PRESERVE_EXCEPTION_MARK macro,
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // which preserves pre-existing exceptions and does not allow new
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // exceptions.
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 #define EXCEPTION_MARK Thread* THREAD; ExceptionMark __em(THREAD);
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
309
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1684
diff changeset
310 #endif // SHARE_VM_UTILITIES_EXCEPTIONS_HPP