File: | jdk/src/hotspot/share/classfile/javaClasses.cpp |
Warning: | line 4212, column 18 Value stored to 'k' during its initialization is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* |
2 | * Copyright (c) 1997, 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 | #include "precompiled.hpp" |
26 | #include "jvm.h" |
27 | #include "cds/archiveBuilder.hpp" |
28 | #include "cds/heapShared.inline.hpp" |
29 | #include "cds/metaspaceShared.hpp" |
30 | #include "classfile/altHashing.hpp" |
31 | #include "classfile/classLoaderData.inline.hpp" |
32 | #include "classfile/javaClasses.inline.hpp" |
33 | #include "classfile/javaThreadStatus.hpp" |
34 | #include "classfile/moduleEntry.hpp" |
35 | #include "classfile/stringTable.hpp" |
36 | #include "classfile/symbolTable.hpp" |
37 | #include "classfile/systemDictionary.hpp" |
38 | #include "classfile/vmClasses.hpp" |
39 | #include "classfile/vmSymbols.hpp" |
40 | #include "code/debugInfo.hpp" |
41 | #include "code/dependencyContext.hpp" |
42 | #include "code/pcDesc.hpp" |
43 | #include "gc/shared/collectedHeap.inline.hpp" |
44 | #include "interpreter/interpreter.hpp" |
45 | #include "interpreter/linkResolver.hpp" |
46 | #include "logging/log.hpp" |
47 | #include "logging/logStream.hpp" |
48 | #include "memory/oopFactory.hpp" |
49 | #include "memory/resourceArea.hpp" |
50 | #include "memory/universe.hpp" |
51 | #include "oops/fieldStreams.inline.hpp" |
52 | #include "oops/instanceKlass.inline.hpp" |
53 | #include "oops/instanceMirrorKlass.hpp" |
54 | #include "oops/klass.hpp" |
55 | #include "oops/klass.inline.hpp" |
56 | #include "oops/method.inline.hpp" |
57 | #include "oops/objArrayOop.inline.hpp" |
58 | #include "oops/oop.inline.hpp" |
59 | #include "oops/symbol.hpp" |
60 | #include "oops/recordComponent.hpp" |
61 | #include "oops/typeArrayOop.inline.hpp" |
62 | #include "prims/jvmtiExport.hpp" |
63 | #include "prims/methodHandles.hpp" |
64 | #include "prims/resolvedMethodTable.hpp" |
65 | #include "runtime/fieldDescriptor.inline.hpp" |
66 | #include "runtime/frame.inline.hpp" |
67 | #include "runtime/handles.inline.hpp" |
68 | #include "runtime/init.hpp" |
69 | #include "runtime/interfaceSupport.inline.hpp" |
70 | #include "runtime/java.hpp" |
71 | #include "runtime/javaCalls.hpp" |
72 | #include "runtime/jniHandles.inline.hpp" |
73 | #include "runtime/reflectionUtils.hpp" |
74 | #include "runtime/safepoint.hpp" |
75 | #include "runtime/safepointVerifiers.hpp" |
76 | #include "runtime/thread.inline.hpp" |
77 | #include "runtime/vframe.inline.hpp" |
78 | #include "runtime/vm_version.hpp" |
79 | #include "utilities/align.hpp" |
80 | #include "utilities/preserveException.hpp" |
81 | #include "utilities/utf8.hpp" |
82 | #if INCLUDE_JVMCI1 |
83 | #include "jvmci/jvmciJavaClasses.hpp" |
84 | #endif |
85 | |
86 | #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java)klass::_name_offset = JavaClasses::compute_injected_offset(JavaClasses ::klass_name_enum); \ |
87 | klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum); |
88 | |
89 | #if INCLUDE_CDS1 |
90 | #define INJECTED_FIELD_SERIALIZE_OFFSET(klass, name, signature, may_be_java)f->do_u4((u4*)&_name_offset); \ |
91 | f->do_u4((u4*)&_##name##_offset); |
92 | #endif |
93 | |
94 | #define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java){ vmClassID::klass_knum, vmSymbolID::name_name_enum, vmSymbolID ::signature_enum, may_be_java }, \ |
95 | { VM_CLASS_ID(klass)vmClassID::klass_knum, VM_SYMBOL_ENUM_NAME(name##_name)vmSymbolID::name##_name_enum, VM_SYMBOL_ENUM_NAME(signature)vmSymbolID::signature_enum, may_be_java }, |
96 | |
97 | InjectedField JavaClasses::_injected_fields[] = { |
98 | ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD){ vmClassID::java_lang_String_knum, vmSymbolID::flags_name_enum , vmSymbolID::byte_signature_enum, false }, { vmClassID::java_lang_Class_knum , vmSymbolID::klass_name_enum, vmSymbolID::intptr_signature_enum , false }, { vmClassID::java_lang_Class_knum, vmSymbolID::array_klass_name_enum , vmSymbolID::intptr_signature_enum, false }, { vmClassID::java_lang_Class_knum , vmSymbolID::oop_size_name_enum, vmSymbolID::int_signature_enum , false }, { vmClassID::java_lang_Class_knum, vmSymbolID::static_oop_field_count_name_enum , vmSymbolID::int_signature_enum, false }, { vmClassID::java_lang_Class_knum , vmSymbolID::protection_domain_name_enum, vmSymbolID::object_signature_enum , false }, { vmClassID::java_lang_Class_knum, vmSymbolID::signers_name_enum , vmSymbolID::object_signature_enum, false }, { vmClassID::java_lang_Class_knum , vmSymbolID::source_file_name_enum, vmSymbolID::object_signature_enum , false }, { vmClassID::java_lang_ClassLoader_knum, vmSymbolID ::loader_data_name_enum, vmSymbolID::intptr_signature_enum, false }, { vmClassID::java_lang_invoke_ResolvedMethodName_knum, vmSymbolID ::vmholder_name_enum, vmSymbolID::object_signature_enum, false }, { vmClassID::java_lang_invoke_ResolvedMethodName_knum, vmSymbolID ::vmtarget_name_enum, vmSymbolID::intptr_signature_enum, false }, { vmClassID::java_lang_invoke_MemberName_knum, vmSymbolID ::vmindex_name_enum, vmSymbolID::intptr_signature_enum, false }, { vmClassID::java_lang_invoke_MethodHandleNatives_CallSiteContext_knum , vmSymbolID::vmdependencies_name_enum, vmSymbolID::intptr_signature_enum , false }, { vmClassID::java_lang_invoke_MethodHandleNatives_CallSiteContext_knum , vmSymbolID::last_cleanup_name_enum, vmSymbolID::long_signature_enum , false }, { vmClassID::java_lang_StackFrameInfo_knum, vmSymbolID ::version_name_enum, vmSymbolID::short_signature_enum, false } , { vmClassID::java_lang_Module_knum, vmSymbolID::module_entry_name_enum , vmSymbolID::intptr_signature_enum, false }, { vmClassID::java_lang_InternalError_knum , vmSymbolID::during_unsafe_access_name_enum, vmSymbolID::bool_signature_enum , false }, |
99 | }; |
100 | |
101 | // Register native methods of Object |
102 | void java_lang_Object::register_natives(TRAPSJavaThread* __the_thread__) { |
103 | InstanceKlass* obj = vmClasses::Object_klass(); |
104 | Method::register_native(obj, vmSymbols::hashCode_name(), |
105 | vmSymbols::void_int_signature(), (address) &JVM_IHashCode, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
106 | Method::register_native(obj, vmSymbols::wait_name(), |
107 | vmSymbols::long_void_signature(), (address) &JVM_MonitorWait, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
108 | Method::register_native(obj, vmSymbols::notify_name(), |
109 | vmSymbols::void_method_signature(), (address) &JVM_MonitorNotify, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
110 | Method::register_native(obj, vmSymbols::notifyAll_name(), |
111 | vmSymbols::void_method_signature(), (address) &JVM_MonitorNotifyAll, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
112 | Method::register_native(obj, vmSymbols::clone_name(), |
113 | vmSymbols::void_object_signature(), (address) &JVM_Clone, THREAD__the_thread__); |
114 | } |
115 | |
116 | int JavaClasses::compute_injected_offset(InjectedFieldID id) { |
117 | return _injected_fields[id].compute_offset(); |
118 | } |
119 | |
120 | InjectedField* JavaClasses::get_injected(Symbol* class_name, int* field_count) { |
121 | *field_count = 0; |
122 | |
123 | vmSymbolID sid = vmSymbols::find_sid(class_name); |
124 | if (sid == vmSymbolID::NO_SID) { |
125 | // Only well known classes can inject fields |
126 | return NULL__null; |
127 | } |
128 | |
129 | int count = 0; |
130 | int start = -1; |
131 | |
132 | #define LOOKUP_INJECTED_FIELD(klass, name, signature, may_be_java) \ |
133 | if (sid == VM_SYMBOL_ENUM_NAME(klass)vmSymbolID::klass_enum) { \ |
134 | count++; \ |
135 | if (start == -1) start = klass##_##name##_enum; \ |
136 | } |
137 | ALL_INJECTED_FIELDS(LOOKUP_INJECTED_FIELD)LOOKUP_INJECTED_FIELD(java_lang_String, flags, byte_signature , false) LOOKUP_INJECTED_FIELD(java_lang_Class, klass, intptr_signature , false) LOOKUP_INJECTED_FIELD(java_lang_Class, array_klass, intptr_signature , false) LOOKUP_INJECTED_FIELD(java_lang_Class, oop_size, int_signature , false) LOOKUP_INJECTED_FIELD(java_lang_Class, static_oop_field_count , int_signature, false) LOOKUP_INJECTED_FIELD(java_lang_Class , protection_domain, object_signature, false) LOOKUP_INJECTED_FIELD (java_lang_Class, signers, object_signature, false) LOOKUP_INJECTED_FIELD (java_lang_Class, source_file, object_signature, false) LOOKUP_INJECTED_FIELD (java_lang_ClassLoader, loader_data, intptr_signature, false) LOOKUP_INJECTED_FIELD(java_lang_invoke_ResolvedMethodName, vmholder , object_signature, false) LOOKUP_INJECTED_FIELD(java_lang_invoke_ResolvedMethodName , vmtarget, intptr_signature, false) LOOKUP_INJECTED_FIELD(java_lang_invoke_MemberName , vmindex, intptr_signature, false) LOOKUP_INJECTED_FIELD(java_lang_invoke_MethodHandleNatives_CallSiteContext , vmdependencies, intptr_signature, false) LOOKUP_INJECTED_FIELD (java_lang_invoke_MethodHandleNatives_CallSiteContext, last_cleanup , long_signature, false) LOOKUP_INJECTED_FIELD(java_lang_StackFrameInfo , version, short_signature, false) LOOKUP_INJECTED_FIELD(java_lang_Module , module_entry, intptr_signature, false) LOOKUP_INJECTED_FIELD (java_lang_InternalError, during_unsafe_access, bool_signature , false); |
138 | #undef LOOKUP_INJECTED_FIELD |
139 | |
140 | if (start != -1) { |
141 | *field_count = count; |
142 | return _injected_fields + start; |
143 | } |
144 | return NULL__null; |
145 | } |
146 | |
147 | |
148 | // Helpful routine for computing field offsets at run time rather than hardcoding them |
149 | // Finds local fields only, including static fields. Static field offsets are from the |
150 | // beginning of the mirror. |
151 | static void compute_offset(int &dest_offset, |
152 | InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol, |
153 | bool is_static = false) { |
154 | fieldDescriptor fd; |
155 | if (ik == NULL__null) { |
156 | ResourceMark rm; |
157 | log_error(class)(!(LogImpl<(LogTag::_class), (LogTag::__NO_TAG), (LogTag:: __NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG )>::is_level(LogLevel::Error))) ? (void)0 : LogImpl<(LogTag ::_class), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Error>("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string()); |
158 | vm_exit_during_initialization("Invalid layout of well-known class"); |
159 | } |
160 | |
161 | if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) { |
162 | ResourceMark rm; |
163 | log_error(class)(!(LogImpl<(LogTag::_class), (LogTag::__NO_TAG), (LogTag:: __NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG )>::is_level(LogLevel::Error))) ? (void)0 : LogImpl<(LogTag ::_class), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Error>("Invalid layout of %s field: %s type: %s", ik->external_name(), |
164 | name_symbol->as_C_string(), signature_symbol->as_C_string()); |
165 | #ifndef PRODUCT |
166 | // Prints all fields and offsets |
167 | Log(class)LogImpl<(LogTag::_class), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) > lt; |
168 | LogStream ls(lt.error()); |
169 | ik->print_on(&ls); |
170 | #endif //PRODUCT |
171 | vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class"); |
172 | } |
173 | dest_offset = fd.offset(); |
174 | } |
175 | |
176 | // Overloading to pass name as a string. |
177 | static void compute_offset(int& dest_offset, InstanceKlass* ik, |
178 | const char* name_string, Symbol* signature_symbol, |
179 | bool is_static = false) { |
180 | TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string)); |
181 | if (name == NULL__null) { |
182 | ResourceMark rm; |
183 | log_error(class)(!(LogImpl<(LogTag::_class), (LogTag::__NO_TAG), (LogTag:: __NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG )>::is_level(LogLevel::Error))) ? (void)0 : LogImpl<(LogTag ::_class), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Error>("Name %s should be in the SymbolTable since its class is loaded", name_string); |
184 | vm_exit_during_initialization("Invalid layout of well-known class", ik->external_name()); |
185 | } |
186 | compute_offset(dest_offset, ik, name, signature_symbol, is_static); |
187 | } |
188 | |
189 | |
190 | #if INCLUDE_CDS1 |
191 | #define FIELD_SERIALIZE_OFFSET(offset, klass, name, signature, is_static)f->do_u4((u4*)&offset) \ |
192 | f->do_u4((u4*)&offset) |
193 | #endif |
194 | |
195 | #define FIELD_COMPUTE_OFFSET(offset, klass, name, signature, is_static)compute_offset(offset, klass, name, vmSymbols::signature(), is_static ) \ |
196 | compute_offset(offset, klass, name, vmSymbols::signature(), is_static) |
197 | |
198 | |
199 | // java_lang_String |
200 | |
201 | int java_lang_String::_value_offset; |
202 | int java_lang_String::_hash_offset; |
203 | int java_lang_String::_hashIsZero_offset; |
204 | int java_lang_String::_coder_offset; |
205 | int java_lang_String::_flags_offset; |
206 | |
207 | bool java_lang_String::_initialized; |
208 | |
209 | |
210 | bool java_lang_String::test_and_set_flag(oop java_string, uint8_t flag_mask) { |
211 | uint8_t* addr = flags_addr(java_string); |
212 | uint8_t value = Atomic::load(addr); |
213 | while ((value & flag_mask) == 0) { |
214 | uint8_t old_value = value; |
215 | value |= flag_mask; |
216 | value = Atomic::cmpxchg(addr, old_value, value); |
217 | if (value == old_value) return false; // Flag bit changed from 0 to 1. |
218 | } |
219 | return true; // Flag bit is already 1. |
220 | } |
221 | |
222 | #define STRING_FIELDS_DO(macro)macro(_value_offset, k, vmSymbols::value_name(), byte_array_signature , false); macro(_hash_offset, k, "hash", int_signature, false ); macro(_hashIsZero_offset, k, "hashIsZero", bool_signature, false); macro(_coder_offset, k, "coder", byte_signature, false ); \ |
223 | macro(_value_offset, k, vmSymbols::value_name(), byte_array_signature, false); \ |
224 | macro(_hash_offset, k, "hash", int_signature, false); \ |
225 | macro(_hashIsZero_offset, k, "hashIsZero", bool_signature, false); \ |
226 | macro(_coder_offset, k, "coder", byte_signature, false); |
227 | |
228 | void java_lang_String::compute_offsets() { |
229 | if (_initialized) { |
230 | return; |
231 | } |
232 | |
233 | InstanceKlass* k = vmClasses::String_klass(); |
234 | STRING_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_value_offset, k, vmSymbols::value_name(), vmSymbols ::byte_array_signature(), false); compute_offset(_hash_offset , k, "hash", vmSymbols::int_signature(), false); compute_offset (_hashIsZero_offset, k, "hashIsZero", vmSymbols::bool_signature (), false); compute_offset(_coder_offset, k, "coder", vmSymbols ::byte_signature(), false);; |
235 | STRING_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_String::_flags_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_String_flags_enum);; |
236 | |
237 | _initialized = true; |
238 | } |
239 | |
240 | #if INCLUDE_CDS1 |
241 | void java_lang_String::serialize_offsets(SerializeClosure* f) { |
242 | STRING_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_value_offset); f->do_u4((u4*)&_hash_offset ); f->do_u4((u4*)&_hashIsZero_offset); f->do_u4((u4 *)&_coder_offset);; |
243 | STRING_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_flags_offset);; |
244 | f->do_bool(&_initialized); |
245 | } |
246 | #endif |
247 | |
248 | class CompactStringsFixup : public FieldClosure { |
249 | private: |
250 | bool _value; |
251 | |
252 | public: |
253 | CompactStringsFixup(bool value) : _value(value) {} |
254 | |
255 | void do_field(fieldDescriptor* fd) { |
256 | if (fd->name() == vmSymbols::compact_strings_name()) { |
257 | oop mirror = fd->field_holder()->java_mirror(); |
258 | assert(fd->field_holder() == vmClasses::String_klass(), "Should be String")do { if (!(fd->field_holder() == vmClasses::String_klass() )) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 258, "assert(" "fd->field_holder() == vmClasses::String_klass()" ") failed", "Should be String"); ::breakpoint(); } } while ( 0); |
259 | assert(mirror != NULL, "String must have mirror already")do { if (!(mirror != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 259, "assert(" "mirror != __null" ") failed", "String must have mirror already" ); ::breakpoint(); } } while (0); |
260 | mirror->bool_field_put(fd->offset(), _value); |
261 | } |
262 | } |
263 | }; |
264 | |
265 | void java_lang_String::set_compact_strings(bool value) { |
266 | CompactStringsFixup fix(value); |
267 | vmClasses::String_klass()->do_local_static_fields(&fix); |
268 | } |
269 | |
270 | Handle java_lang_String::basic_create(int length, bool is_latin1, TRAPSJavaThread* __the_thread__) { |
271 | assert(_initialized, "Must be initialized")do { if (!(_initialized)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 271, "assert(" "_initialized" ") failed", "Must be initialized" ); ::breakpoint(); } } while (0); |
272 | assert(CompactStrings || !is_latin1, "Must be UTF16 without CompactStrings")do { if (!(CompactStrings || !is_latin1)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 272, "assert(" "CompactStrings || !is_latin1" ") failed", "Must be UTF16 without CompactStrings" ); ::breakpoint(); } } while (0); |
273 | |
274 | // Create the String object first, so there's a chance that the String |
275 | // and the char array it points to end up in the same cache line. |
276 | oop obj; |
277 | obj = vmClasses::String_klass()->allocate_instance(CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
278 | |
279 | // Create the char array. The String object must be handlized here |
280 | // because GC can happen as a result of the allocation attempt. |
281 | Handle h_obj(THREAD__the_thread__, obj); |
282 | int arr_length = is_latin1 ? length : length << 1; // 2 bytes per UTF16. |
283 | typeArrayOop buffer = oopFactory::new_byteArray(arr_length, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0);; |
284 | |
285 | // Point the String at the char array |
286 | obj = h_obj(); |
287 | set_value(obj, buffer); |
288 | // No need to zero the offset, allocation zero'ed the entire String object |
289 | set_coder(obj, is_latin1 ? CODER_LATIN1 : CODER_UTF16); |
290 | return h_obj; |
291 | } |
292 | |
293 | Handle java_lang_String::create_from_unicode(const jchar* unicode, int length, TRAPSJavaThread* __the_thread__) { |
294 | bool is_latin1 = CompactStrings && UNICODE::is_latin1(unicode, length); |
295 | Handle h_obj = basic_create(length, is_latin1, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
296 | typeArrayOop buffer = value(h_obj()); |
297 | assert(TypeArrayKlass::cast(buffer->klass())->element_type() == T_BYTE, "only byte[]")do { if (!(TypeArrayKlass::cast(buffer->klass())->element_type () == T_BYTE)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 297, "assert(" "TypeArrayKlass::cast(buffer->klass())->element_type() == T_BYTE" ") failed", "only byte[]"); ::breakpoint(); } } while (0); |
298 | if (is_latin1) { |
299 | for (int index = 0; index < length; index++) { |
300 | buffer->byte_at_put(index, (jbyte)unicode[index]); |
301 | } |
302 | } else { |
303 | for (int index = 0; index < length; index++) { |
304 | buffer->char_at_put(index, unicode[index]); |
305 | } |
306 | } |
307 | |
308 | #ifdef ASSERT1 |
309 | { |
310 | ResourceMark rm; |
311 | char* expected = UNICODE::as_utf8(unicode, length); |
312 | char* actual = as_utf8_string(h_obj()); |
313 | if (strcmp(expected, actual) != 0) { |
314 | fatal("Unicode conversion failure: %s --> %s", expected, actual)do { (*g_assert_poison) = 'X';; report_fatal(INTERNAL_ERROR, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 314, "Unicode conversion failure: %s --> %s", expected, actual ); ::breakpoint(); } while (0); |
315 | } |
316 | } |
317 | #endif |
318 | |
319 | return h_obj; |
320 | } |
321 | |
322 | oop java_lang_String::create_oop_from_unicode(const jchar* unicode, int length, TRAPSJavaThread* __the_thread__) { |
323 | Handle h_obj = create_from_unicode(unicode, length, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
324 | return h_obj(); |
325 | } |
326 | |
327 | Handle java_lang_String::create_from_str(const char* utf8_str, TRAPSJavaThread* __the_thread__) { |
328 | if (utf8_str == NULL__null) { |
329 | return Handle(); |
330 | } |
331 | bool has_multibyte, is_latin1; |
332 | int length = UTF8::unicode_length(utf8_str, is_latin1, has_multibyte); |
333 | if (!CompactStrings) { |
334 | has_multibyte = true; |
335 | is_latin1 = false; |
336 | } |
337 | |
338 | Handle h_obj = basic_create(length, is_latin1, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
339 | if (length > 0) { |
340 | if (!has_multibyte) { |
341 | const jbyte* src = reinterpret_cast<const jbyte*>(utf8_str); |
342 | ArrayAccess<>::arraycopy_from_native(src, value(h_obj()), typeArrayOopDesc::element_offset<jbyte>(0), length); |
343 | } else if (is_latin1) { |
344 | UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length); |
345 | } else { |
346 | UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length); |
347 | } |
348 | } |
349 | |
350 | #ifdef ASSERT1 |
351 | // This check is too strict when the input string is not a valid UTF8. |
352 | // For example, it may be created with arbitrary content via jni_NewStringUTF. |
353 | if (UTF8::is_legal_utf8((const unsigned char*)utf8_str, (int)strlen(utf8_str), false)) { |
354 | ResourceMark rm; |
355 | const char* expected = utf8_str; |
356 | char* actual = as_utf8_string(h_obj()); |
357 | if (strcmp(expected, actual) != 0) { |
358 | fatal("String conversion failure: %s --> %s", expected, actual)do { (*g_assert_poison) = 'X';; report_fatal(INTERNAL_ERROR, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 358, "String conversion failure: %s --> %s", expected, actual ); ::breakpoint(); } while (0); |
359 | } |
360 | } |
361 | #endif |
362 | |
363 | return h_obj; |
364 | } |
365 | |
366 | oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPSJavaThread* __the_thread__) { |
367 | Handle h_obj = create_from_str(utf8_str, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
368 | return h_obj(); |
369 | } |
370 | |
371 | Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPSJavaThread* __the_thread__) { |
372 | const char* utf8_str = (char*)symbol->bytes(); |
373 | int utf8_len = symbol->utf8_length(); |
374 | |
375 | bool has_multibyte, is_latin1; |
376 | int length = UTF8::unicode_length(utf8_str, utf8_len, is_latin1, has_multibyte); |
377 | if (!CompactStrings) { |
378 | has_multibyte = true; |
379 | is_latin1 = false; |
380 | } |
381 | |
382 | Handle h_obj = basic_create(length, is_latin1, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
383 | if (length > 0) { |
384 | if (!has_multibyte) { |
385 | const jbyte* src = reinterpret_cast<const jbyte*>(utf8_str); |
386 | ArrayAccess<>::arraycopy_from_native(src, value(h_obj()), typeArrayOopDesc::element_offset<jbyte>(0), length); |
387 | } else if (is_latin1) { |
388 | UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length); |
389 | } else { |
390 | UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length); |
391 | } |
392 | } |
393 | |
394 | #ifdef ASSERT1 |
395 | { |
396 | ResourceMark rm; |
397 | const char* expected = symbol->as_utf8(); |
398 | char* actual = as_utf8_string(h_obj()); |
399 | if (strncmp(expected, actual, utf8_len) != 0) { |
400 | fatal("Symbol conversion failure: %s --> %s", expected, actual)do { (*g_assert_poison) = 'X';; report_fatal(INTERNAL_ERROR, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 400, "Symbol conversion failure: %s --> %s", expected, actual ); ::breakpoint(); } while (0); |
401 | } |
402 | } |
403 | #endif |
404 | |
405 | return h_obj; |
406 | } |
407 | |
408 | // Converts a C string to a Java String based on current encoding |
409 | Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPSJavaThread* __the_thread__) { |
410 | assert(str != NULL, "bad arguments")do { if (!(str != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 410, "assert(" "str != __null" ") failed", "bad arguments") ; ::breakpoint(); } } while (0); |
411 | |
412 | typedef jstring (JNICALL *to_java_string_fn_t)(JNIEnv*, const char *); |
413 | static to_java_string_fn_t _to_java_string_fn = NULL__null; |
414 | |
415 | if (_to_java_string_fn == NULL__null) { |
416 | void *lib_handle = os::native_java_library(); |
417 | _to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "JNU_NewStringPlatform"))(reinterpret_cast<to_java_string_fn_t>(os::dll_lookup(lib_handle , "JNU_NewStringPlatform"))); |
418 | #if defined(_WIN32) && !defined(_WIN64) |
419 | if (_to_java_string_fn == NULL__null) { |
420 | // On 32 bit Windows, also try __stdcall decorated name |
421 | _to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "_JNU_NewStringPlatform@8"))(reinterpret_cast<to_java_string_fn_t>(os::dll_lookup(lib_handle , "_JNU_NewStringPlatform@8"))); |
422 | } |
423 | #endif |
424 | if (_to_java_string_fn == NULL__null) { |
425 | fatal("JNU_NewStringPlatform missing")do { (*g_assert_poison) = 'X';; report_fatal(INTERNAL_ERROR, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 425, "JNU_NewStringPlatform missing"); ::breakpoint(); } while (0); |
426 | } |
427 | } |
428 | |
429 | jstring js = NULL__null; |
430 | { |
431 | JavaThread* thread = THREAD__the_thread__; |
432 | HandleMark hm(thread); |
433 | ThreadToNativeFromVM ttn(thread); |
434 | js = (_to_java_string_fn)(thread->jni_environment(), str); |
435 | } |
436 | |
437 | Handle native_platform_string(THREAD__the_thread__, JNIHandles::resolve(js)); |
438 | JNIHandles::destroy_local(js); // destroy local JNIHandle. |
439 | return native_platform_string; |
440 | } |
441 | |
442 | // Converts a Java String to a native C string that can be used for |
443 | // native OS calls. |
444 | char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPSJavaThread* __the_thread__) { |
445 | typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*); |
446 | static to_platform_string_fn_t _to_platform_string_fn = NULL__null; |
447 | |
448 | if (_to_platform_string_fn == NULL__null) { |
449 | void *lib_handle = os::native_java_library(); |
450 | _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"))(reinterpret_cast<to_platform_string_fn_t>(os::dll_lookup (lib_handle, "GetStringPlatformChars"))); |
451 | if (_to_platform_string_fn == NULL__null) { |
452 | fatal("GetStringPlatformChars missing")do { (*g_assert_poison) = 'X';; report_fatal(INTERNAL_ERROR, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 452, "GetStringPlatformChars missing"); ::breakpoint(); } while (0); |
453 | } |
454 | } |
455 | |
456 | char *native_platform_string; |
457 | { JavaThread* thread = THREAD__the_thread__; |
458 | jstring js = (jstring) JNIHandles::make_local(thread, java_string()); |
459 | bool is_copy; |
460 | HandleMark hm(thread); |
461 | ThreadToNativeFromVM ttn(thread); |
462 | JNIEnv *env = thread->jni_environment(); |
463 | native_platform_string = (_to_platform_string_fn)(env, js, &is_copy); |
464 | assert(is_copy == JNI_TRUE, "is_copy value changed")do { if (!(is_copy == 1)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 464, "assert(" "is_copy == 1" ") failed", "is_copy value changed" ); ::breakpoint(); } } while (0); |
465 | JNIHandles::destroy_local(js); |
466 | } |
467 | return native_platform_string; |
468 | } |
469 | |
470 | Handle java_lang_String::externalize_classname(Symbol* java_name, TRAPSJavaThread* __the_thread__) { |
471 | ResourceMark rm(THREAD__the_thread__); |
472 | return create_from_str(java_name->as_klass_external_name(), THREAD__the_thread__); |
473 | } |
474 | |
475 | jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPSJavaThread* __the_thread__) { |
476 | jchar* result = as_unicode_string_or_null(java_string, length); |
477 | if (result == NULL__null) { |
478 | THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string"){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 478, vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string" ); return 0; }; |
479 | } |
480 | return result; |
481 | } |
482 | |
483 | jchar* java_lang_String::as_unicode_string_or_null(oop java_string, int& length) { |
484 | typeArrayOop value = java_lang_String::value(java_string); |
485 | length = java_lang_String::length(java_string, value); |
486 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
487 | |
488 | jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length)(jchar*) resource_allocate_bytes((length) * sizeof(jchar), AllocFailStrategy ::RETURN_NULL); |
489 | if (result != NULL__null) { |
490 | if (!is_latin1) { |
491 | for (int index = 0; index < length; index++) { |
492 | result[index] = value->char_at(index); |
493 | } |
494 | } else { |
495 | for (int index = 0; index < length; index++) { |
496 | result[index] = ((jchar) value->byte_at(index)) & 0xff; |
497 | } |
498 | } |
499 | } |
500 | return result; |
501 | } |
502 | |
503 | inline unsigned int java_lang_String::hash_code_impl(oop java_string, bool update) { |
504 | // The hash and hashIsZero fields are subject to a benign data race, |
505 | // making it crucial to ensure that any observable result of the |
506 | // calculation in this method stays correct under any possible read of |
507 | // these fields. Necessary restrictions to allow this to be correct |
508 | // without explicit memory fences or similar concurrency primitives is |
509 | // that we can ever only write to one of these two fields for a given |
510 | // String instance, and that the computation is idempotent and derived |
511 | // from immutable state |
512 | assert(_initialized && (_hash_offset > 0) && (_hashIsZero_offset > 0), "Must be initialized")do { if (!(_initialized && (_hash_offset > 0) && (_hashIsZero_offset > 0))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 512, "assert(" "_initialized && (_hash_offset > 0) && (_hashIsZero_offset > 0)" ") failed", "Must be initialized"); ::breakpoint(); } } while (0); |
513 | if (java_lang_String::hash_is_set(java_string)) { |
514 | return java_string->int_field(_hash_offset); |
515 | } |
516 | |
517 | typeArrayOop value = java_lang_String::value(java_string); |
518 | int length = java_lang_String::length(java_string, value); |
519 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
520 | |
521 | unsigned int hash = 0; |
522 | if (length > 0) { |
523 | if (is_latin1) { |
524 | hash = java_lang_String::hash_code(value->byte_at_addr(0), length); |
525 | } else { |
526 | hash = java_lang_String::hash_code(value->char_at_addr(0), length); |
527 | } |
528 | } |
529 | |
530 | if (update) { |
531 | if (hash != 0) { |
532 | java_string->int_field_put(_hash_offset, hash); |
533 | } else { |
534 | java_string->bool_field_put(_hashIsZero_offset, true); |
535 | } |
536 | } |
537 | return hash; |
538 | } |
539 | |
540 | unsigned int java_lang_String::hash_code(oop java_string) { |
541 | return hash_code_impl(java_string, /*update=*/true); |
542 | } |
543 | |
544 | unsigned int java_lang_String::hash_code_noupdate(oop java_string) { |
545 | return hash_code_impl(java_string, /*update=*/false); |
546 | } |
547 | |
548 | |
549 | char* java_lang_String::as_quoted_ascii(oop java_string) { |
550 | typeArrayOop value = java_lang_String::value(java_string); |
551 | int length = java_lang_String::length(java_string, value); |
552 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
553 | |
554 | if (length == 0) return NULL__null; |
555 | |
556 | char* result; |
557 | int result_length; |
558 | if (!is_latin1) { |
559 | jchar* base = value->char_at_addr(0); |
560 | result_length = UNICODE::quoted_ascii_length(base, length) + 1; |
561 | result = NEW_RESOURCE_ARRAY(char, result_length)(char*) resource_allocate_bytes((result_length) * sizeof(char )); |
562 | UNICODE::as_quoted_ascii(base, length, result, result_length); |
563 | } else { |
564 | jbyte* base = value->byte_at_addr(0); |
565 | result_length = UNICODE::quoted_ascii_length(base, length) + 1; |
566 | result = NEW_RESOURCE_ARRAY(char, result_length)(char*) resource_allocate_bytes((result_length) * sizeof(char )); |
567 | UNICODE::as_quoted_ascii(base, length, result, result_length); |
568 | } |
569 | assert(result_length >= length + 1, "must not be shorter")do { if (!(result_length >= length + 1)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 569, "assert(" "result_length >= length + 1" ") failed", "must not be shorter"); ::breakpoint(); } } while (0); |
570 | assert(result_length == (int)strlen(result) + 1, "must match")do { if (!(result_length == (int)strlen(result) + 1)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 570, "assert(" "result_length == (int)strlen(result) + 1" ") failed" , "must match"); ::breakpoint(); } } while (0); |
571 | return result; |
572 | } |
573 | |
574 | Symbol* java_lang_String::as_symbol(oop java_string) { |
575 | typeArrayOop value = java_lang_String::value(java_string); |
576 | int length = java_lang_String::length(java_string, value); |
577 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
578 | if (!is_latin1) { |
579 | jchar* base = (length == 0) ? NULL__null : value->char_at_addr(0); |
580 | Symbol* sym = SymbolTable::new_symbol(base, length); |
581 | return sym; |
582 | } else { |
583 | ResourceMark rm; |
584 | jbyte* position = (length == 0) ? NULL__null : value->byte_at_addr(0); |
585 | const char* base = UNICODE::as_utf8(position, length); |
586 | Symbol* sym = SymbolTable::new_symbol(base, length); |
587 | return sym; |
588 | } |
589 | } |
590 | |
591 | Symbol* java_lang_String::as_symbol_or_null(oop java_string) { |
592 | typeArrayOop value = java_lang_String::value(java_string); |
593 | int length = java_lang_String::length(java_string, value); |
594 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
595 | if (!is_latin1) { |
596 | jchar* base = (length == 0) ? NULL__null : value->char_at_addr(0); |
597 | return SymbolTable::probe_unicode(base, length); |
598 | } else { |
599 | ResourceMark rm; |
600 | jbyte* position = (length == 0) ? NULL__null : value->byte_at_addr(0); |
601 | const char* base = UNICODE::as_utf8(position, length); |
602 | return SymbolTable::probe(base, length); |
603 | } |
604 | } |
605 | |
606 | int java_lang_String::utf8_length(oop java_string, typeArrayOop value) { |
607 | assert(value_equals(value, java_lang_String::value(java_string)),do { if (!(value_equals(value, java_lang_String::value(java_string )))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 608, "assert(" "value_equals(value, java_lang_String::value(java_string))" ") failed", "value must be same as java_lang_String::value(java_string)" ); ::breakpoint(); } } while (0) |
608 | "value must be same as java_lang_String::value(java_string)")do { if (!(value_equals(value, java_lang_String::value(java_string )))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 608, "assert(" "value_equals(value, java_lang_String::value(java_string))" ") failed", "value must be same as java_lang_String::value(java_string)" ); ::breakpoint(); } } while (0); |
609 | int length = java_lang_String::length(java_string, value); |
610 | if (length == 0) { |
611 | return 0; |
612 | } |
613 | if (!java_lang_String::is_latin1(java_string)) { |
614 | return UNICODE::utf8_length(value->char_at_addr(0), length); |
615 | } else { |
616 | return UNICODE::utf8_length(value->byte_at_addr(0), length); |
617 | } |
618 | } |
619 | |
620 | int java_lang_String::utf8_length(oop java_string) { |
621 | typeArrayOop value = java_lang_String::value(java_string); |
622 | return utf8_length(java_string, value); |
623 | } |
624 | |
625 | char* java_lang_String::as_utf8_string(oop java_string) { |
626 | int length; |
627 | return as_utf8_string(java_string, length); |
628 | } |
629 | |
630 | char* java_lang_String::as_utf8_string(oop java_string, int& length) { |
631 | typeArrayOop value = java_lang_String::value(java_string); |
632 | length = java_lang_String::length(java_string, value); |
633 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
634 | if (!is_latin1) { |
635 | jchar* position = (length == 0) ? NULL__null : value->char_at_addr(0); |
636 | return UNICODE::as_utf8(position, length); |
637 | } else { |
638 | jbyte* position = (length == 0) ? NULL__null : value->byte_at_addr(0); |
639 | return UNICODE::as_utf8(position, length); |
640 | } |
641 | } |
642 | |
643 | // Uses a provided buffer if it's sufficiently large, otherwise allocates |
644 | // a resource array to fit |
645 | char* java_lang_String::as_utf8_string_full(oop java_string, char* buf, int buflen, int& utf8_len) { |
646 | typeArrayOop value = java_lang_String::value(java_string); |
647 | int len = java_lang_String::length(java_string, value); |
648 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
649 | if (!is_latin1) { |
650 | jchar *position = (len == 0) ? NULL__null : value->char_at_addr(0); |
651 | utf8_len = UNICODE::utf8_length(position, len); |
652 | if (utf8_len >= buflen) { |
653 | buf = NEW_RESOURCE_ARRAY(char, utf8_len + 1)(char*) resource_allocate_bytes((utf8_len + 1) * sizeof(char) ); |
654 | } |
655 | return UNICODE::as_utf8(position, len, buf, utf8_len + 1); |
656 | } else { |
657 | jbyte *position = (len == 0) ? NULL__null : value->byte_at_addr(0); |
658 | utf8_len = UNICODE::utf8_length(position, len); |
659 | if (utf8_len >= buflen) { |
660 | buf = NEW_RESOURCE_ARRAY(char, utf8_len + 1)(char*) resource_allocate_bytes((utf8_len + 1) * sizeof(char) ); |
661 | } |
662 | return UNICODE::as_utf8(position, len, buf, utf8_len + 1); |
663 | } |
664 | } |
665 | |
666 | char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) { |
667 | assert(value_equals(value, java_lang_String::value(java_string)),do { if (!(value_equals(value, java_lang_String::value(java_string )))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 668, "assert(" "value_equals(value, java_lang_String::value(java_string))" ") failed", "value must be same as java_lang_String::value(java_string)" ); ::breakpoint(); } } while (0) |
668 | "value must be same as java_lang_String::value(java_string)")do { if (!(value_equals(value, java_lang_String::value(java_string )))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 668, "assert(" "value_equals(value, java_lang_String::value(java_string))" ") failed", "value must be same as java_lang_String::value(java_string)" ); ::breakpoint(); } } while (0); |
669 | int length = java_lang_String::length(java_string, value); |
670 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
671 | if (!is_latin1) { |
672 | jchar* position = (length == 0) ? NULL__null : value->char_at_addr(0); |
673 | return UNICODE::as_utf8(position, length, buf, buflen); |
674 | } else { |
675 | jbyte* position = (length == 0) ? NULL__null : value->byte_at_addr(0); |
676 | return UNICODE::as_utf8(position, length, buf, buflen); |
677 | } |
678 | } |
679 | |
680 | char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) { |
681 | typeArrayOop value = java_lang_String::value(java_string); |
682 | return as_utf8_string(java_string, value, buf, buflen); |
683 | } |
684 | |
685 | char* java_lang_String::as_utf8_string(oop java_string, int start, int len) { |
686 | typeArrayOop value = java_lang_String::value(java_string); |
687 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
688 | assert(start + len <= java_lang_String::length(java_string), "just checking")do { if (!(start + len <= java_lang_String::length(java_string ))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 688, "assert(" "start + len <= java_lang_String::length(java_string)" ") failed", "just checking"); ::breakpoint(); } } while (0); |
689 | if (!is_latin1) { |
690 | jchar* position = value->char_at_addr(start); |
691 | return UNICODE::as_utf8(position, len); |
692 | } else { |
693 | jbyte* position = value->byte_at_addr(start); |
694 | return UNICODE::as_utf8(position, len); |
695 | } |
696 | } |
697 | |
698 | char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) { |
699 | assert(value_equals(value, java_lang_String::value(java_string)),do { if (!(value_equals(value, java_lang_String::value(java_string )))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 700, "assert(" "value_equals(value, java_lang_String::value(java_string))" ") failed", "value must be same as java_lang_String::value(java_string)" ); ::breakpoint(); } } while (0) |
700 | "value must be same as java_lang_String::value(java_string)")do { if (!(value_equals(value, java_lang_String::value(java_string )))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 700, "assert(" "value_equals(value, java_lang_String::value(java_string))" ") failed", "value must be same as java_lang_String::value(java_string)" ); ::breakpoint(); } } while (0); |
701 | assert(start + len <= java_lang_String::length(java_string), "just checking")do { if (!(start + len <= java_lang_String::length(java_string ))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 701, "assert(" "start + len <= java_lang_String::length(java_string)" ") failed", "just checking"); ::breakpoint(); } } while (0); |
702 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
703 | if (!is_latin1) { |
704 | jchar* position = value->char_at_addr(start); |
705 | return UNICODE::as_utf8(position, len, buf, buflen); |
706 | } else { |
707 | jbyte* position = value->byte_at_addr(start); |
708 | return UNICODE::as_utf8(position, len, buf, buflen); |
709 | } |
710 | } |
711 | |
712 | bool java_lang_String::equals(oop java_string, const jchar* chars, int len) { |
713 | assert(java_string->klass() == vmClasses::String_klass(),do { if (!(java_string->klass() == vmClasses::String_klass ())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 714, "assert(" "java_string->klass() == vmClasses::String_klass()" ") failed", "must be java_string"); ::breakpoint(); } } while (0) |
714 | "must be java_string")do { if (!(java_string->klass() == vmClasses::String_klass ())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 714, "assert(" "java_string->klass() == vmClasses::String_klass()" ") failed", "must be java_string"); ::breakpoint(); } } while (0); |
715 | typeArrayOop value = java_lang_String::value_no_keepalive(java_string); |
716 | int length = java_lang_String::length(java_string, value); |
717 | if (length != len) { |
718 | return false; |
719 | } |
720 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
721 | if (!is_latin1) { |
722 | for (int i = 0; i < len; i++) { |
723 | if (value->char_at(i) != chars[i]) { |
724 | return false; |
725 | } |
726 | } |
727 | } else { |
728 | for (int i = 0; i < len; i++) { |
729 | if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) { |
730 | return false; |
731 | } |
732 | } |
733 | } |
734 | return true; |
735 | } |
736 | |
737 | bool java_lang_String::equals(oop str1, oop str2) { |
738 | assert(str1->klass() == vmClasses::String_klass(),do { if (!(str1->klass() == vmClasses::String_klass())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 739, "assert(" "str1->klass() == vmClasses::String_klass()" ") failed", "must be java String"); ::breakpoint(); } } while (0) |
739 | "must be java String")do { if (!(str1->klass() == vmClasses::String_klass())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 739, "assert(" "str1->klass() == vmClasses::String_klass()" ") failed", "must be java String"); ::breakpoint(); } } while (0); |
740 | assert(str2->klass() == vmClasses::String_klass(),do { if (!(str2->klass() == vmClasses::String_klass())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 741, "assert(" "str2->klass() == vmClasses::String_klass()" ") failed", "must be java String"); ::breakpoint(); } } while (0) |
741 | "must be java String")do { if (!(str2->klass() == vmClasses::String_klass())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 741, "assert(" "str2->klass() == vmClasses::String_klass()" ") failed", "must be java String"); ::breakpoint(); } } while (0); |
742 | typeArrayOop value1 = java_lang_String::value_no_keepalive(str1); |
743 | bool is_latin1 = java_lang_String::is_latin1(str1); |
744 | typeArrayOop value2 = java_lang_String::value_no_keepalive(str2); |
745 | bool is_latin2 = java_lang_String::is_latin1(str2); |
746 | |
747 | if (is_latin1 != is_latin2) { |
748 | // Strings with different coders are never equal. |
749 | return false; |
750 | } |
751 | return value_equals(value1, value2); |
752 | } |
753 | |
754 | void java_lang_String::print(oop java_string, outputStream* st) { |
755 | assert(java_string->klass() == vmClasses::String_klass(), "must be java_string")do { if (!(java_string->klass() == vmClasses::String_klass ())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 755, "assert(" "java_string->klass() == vmClasses::String_klass()" ") failed", "must be java_string"); ::breakpoint(); } } while (0); |
756 | typeArrayOop value = java_lang_String::value_no_keepalive(java_string); |
757 | |
758 | if (value == NULL__null) { |
759 | // This can happen if, e.g., printing a String |
760 | // object before its initializer has been called |
761 | st->print("NULL"); |
762 | return; |
763 | } |
764 | |
765 | int length = java_lang_String::length(java_string, value); |
766 | bool is_latin1 = java_lang_String::is_latin1(java_string); |
767 | |
768 | st->print("\""); |
769 | for (int index = 0; index < length; index++) { |
770 | st->print("%c", (!is_latin1) ? value->char_at(index) : |
771 | ((jchar) value->byte_at(index)) & 0xff ); |
772 | } |
773 | st->print("\""); |
774 | } |
775 | |
776 | // java_lang_Class |
777 | |
778 | int java_lang_Class::_klass_offset; |
779 | int java_lang_Class::_array_klass_offset; |
780 | int java_lang_Class::_oop_size_offset; |
781 | int java_lang_Class::_static_oop_field_count_offset; |
782 | int java_lang_Class::_class_loader_offset; |
783 | int java_lang_Class::_module_offset; |
784 | int java_lang_Class::_protection_domain_offset; |
785 | int java_lang_Class::_component_mirror_offset; |
786 | int java_lang_Class::_init_lock_offset; |
787 | int java_lang_Class::_signers_offset; |
788 | int java_lang_Class::_name_offset; |
789 | int java_lang_Class::_source_file_offset; |
790 | int java_lang_Class::_classData_offset; |
791 | int java_lang_Class::_classRedefinedCount_offset; |
792 | |
793 | bool java_lang_Class::_offsets_computed = false; |
794 | GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL__null; |
795 | GrowableArray<Klass*>* java_lang_Class::_fixup_module_field_list = NULL__null; |
796 | |
797 | #ifdef ASSERT1 |
798 | inline static void assert_valid_static_string_field(fieldDescriptor* fd) { |
799 | assert(fd->has_initial_value(), "caller should have checked this")do { if (!(fd->has_initial_value())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 799, "assert(" "fd->has_initial_value()" ") failed", "caller should have checked this" ); ::breakpoint(); } } while (0); |
800 | assert(fd->field_type() == T_OBJECT, "caller should have checked this")do { if (!(fd->field_type() == T_OBJECT)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 800, "assert(" "fd->field_type() == T_OBJECT" ") failed" , "caller should have checked this"); ::breakpoint(); } } while (0); |
801 | // Can't use vmSymbols::string_signature() as fd->signature() may have been relocated |
802 | // during DumpSharedSpaces |
803 | assert(fd->signature()->equals("Ljava/lang/String;"), "just checking")do { if (!(fd->signature()->equals("Ljava/lang/String;" ))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 803, "assert(" "fd->signature()->equals(\"Ljava/lang/String;\")" ") failed", "just checking"); ::breakpoint(); } } while (0); |
804 | } |
805 | #endif |
806 | |
807 | static void initialize_static_string_field(fieldDescriptor* fd, Handle mirror, TRAPSJavaThread* __the_thread__) { |
808 | DEBUG_ONLY(assert_valid_static_string_field(fd);)assert_valid_static_string_field(fd); |
809 | oop string = fd->string_initial_value(CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
810 | mirror()->obj_field_put(fd->offset(), string); |
811 | } |
812 | |
813 | #if INCLUDE_CDS_JAVA_HEAP1 |
814 | static void initialize_static_string_field_for_dump(fieldDescriptor* fd, Handle mirror) { |
815 | DEBUG_ONLY(assert_valid_static_string_field(fd);)assert_valid_static_string_field(fd); |
816 | assert(DumpSharedSpaces, "must be")do { if (!(DumpSharedSpaces)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 816, "assert(" "DumpSharedSpaces" ") failed", "must be"); :: breakpoint(); } } while (0); |
817 | assert(HeapShared::is_archived_object_during_dumptime(mirror()), "must be")do { if (!(HeapShared::is_archived_object_during_dumptime(mirror ()))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 817, "assert(" "HeapShared::is_archived_object_during_dumptime(mirror())" ") failed", "must be"); ::breakpoint(); } } while (0); |
818 | // Archive the String field and update the pointer. |
819 | oop s = mirror()->obj_field(fd->offset()); |
820 | oop archived_s = StringTable::create_archived_string(s); |
821 | mirror()->obj_field_put(fd->offset(), archived_s); |
822 | } |
823 | #endif |
824 | |
825 | static void initialize_static_primitive_field(fieldDescriptor* fd, Handle mirror) { |
826 | assert(fd->has_initial_value(), "caller should have checked this")do { if (!(fd->has_initial_value())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 826, "assert(" "fd->has_initial_value()" ") failed", "caller should have checked this" ); ::breakpoint(); } } while (0); |
827 | BasicType t = fd->field_type(); |
828 | switch (t) { |
829 | case T_BYTE: |
830 | mirror()->byte_field_put(fd->offset(), fd->int_initial_value()); |
831 | break; |
832 | case T_BOOLEAN: |
833 | mirror()->bool_field_put(fd->offset(), fd->int_initial_value()); |
834 | break; |
835 | case T_CHAR: |
836 | mirror()->char_field_put(fd->offset(), fd->int_initial_value()); |
837 | break; |
838 | case T_SHORT: |
839 | mirror()->short_field_put(fd->offset(), fd->int_initial_value()); |
840 | break; |
841 | case T_INT: |
842 | mirror()->int_field_put(fd->offset(), fd->int_initial_value()); |
843 | break; |
844 | case T_FLOAT: |
845 | mirror()->float_field_put(fd->offset(), fd->float_initial_value()); |
846 | break; |
847 | case T_DOUBLE: |
848 | mirror()->double_field_put(fd->offset(), fd->double_initial_value()); |
849 | break; |
850 | case T_LONG: |
851 | mirror()->long_field_put(fd->offset(), fd->long_initial_value()); |
852 | break; |
853 | default: |
854 | // Illegal ConstantValue attribute in class file should have been |
855 | // caught during classfile parsing. |
856 | ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here( "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 856); ::breakpoint(); } while (0); |
857 | } |
858 | } |
859 | |
860 | static void initialize_static_field(fieldDescriptor* fd, Handle mirror, TRAPSJavaThread* __the_thread__) { |
861 | assert(mirror.not_null() && fd->is_static(), "just checking")do { if (!(mirror.not_null() && fd->is_static())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 861, "assert(" "mirror.not_null() && fd->is_static()" ") failed", "just checking"); ::breakpoint(); } } while (0); |
862 | if (fd->has_initial_value()) { |
863 | if (fd->field_type() != T_OBJECT) { |
864 | initialize_static_primitive_field(fd, mirror); |
865 | } else { |
866 | initialize_static_string_field(fd, mirror, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
867 | } |
868 | } |
869 | } |
870 | |
871 | #if INCLUDE_CDS_JAVA_HEAP1 |
872 | static void initialize_static_field_for_dump(fieldDescriptor* fd, Handle mirror) { |
873 | assert(mirror.not_null() && fd->is_static(), "just checking")do { if (!(mirror.not_null() && fd->is_static())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 873, "assert(" "mirror.not_null() && fd->is_static()" ") failed", "just checking"); ::breakpoint(); } } while (0); |
874 | if (fd->has_initial_value()) { |
875 | if (fd->field_type() != T_OBJECT) { |
876 | initialize_static_primitive_field(fd, mirror); |
877 | } else { |
878 | initialize_static_string_field_for_dump(fd, mirror); |
879 | } |
880 | } |
881 | } |
882 | #endif |
883 | |
884 | void java_lang_Class::fixup_mirror(Klass* k, TRAPSJavaThread* __the_thread__) { |
885 | assert(InstanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already")do { if (!(InstanceMirrorKlass::offset_of_static_fields() != 0 )) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 885, "assert(" "InstanceMirrorKlass::offset_of_static_fields() != 0" ") failed", "must have been computed already"); ::breakpoint (); } } while (0); |
886 | |
887 | // If the offset was read from the shared archive, it was fixed up already |
888 | if (!k->is_shared()) { |
889 | if (k->is_instance_klass()) { |
890 | // During bootstrap, java.lang.Class wasn't loaded so static field |
891 | // offsets were computed without the size added it. Go back and |
892 | // update all the static field offsets to included the size. |
893 | for (JavaFieldStream fs(InstanceKlass::cast(k)); !fs.done(); fs.next()) { |
894 | if (fs.access_flags().is_static()) { |
895 | int real_offset = fs.offset() + InstanceMirrorKlass::offset_of_static_fields(); |
896 | fs.set_offset(real_offset); |
897 | } |
898 | } |
899 | } |
900 | } |
901 | |
902 | if (k->is_shared() && k->has_archived_mirror_index()) { |
903 | if (HeapShared::are_archived_mirrors_available()) { |
904 | bool present = restore_archived_mirror(k, Handle(), Handle(), Handle(), CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
905 | assert(present, "Missing archived mirror for %s", k->external_name())do { if (!(present)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 905, "assert(" "present" ") failed", "Missing archived mirror for %s" , k->external_name()); ::breakpoint(); } } while (0); |
906 | return; |
907 | } else { |
908 | k->clear_java_mirror_handle(); |
909 | k->clear_archived_mirror_index(); |
910 | } |
911 | } |
912 | create_mirror(k, Handle(), Handle(), Handle(), Handle(), CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
913 | } |
914 | |
915 | void java_lang_Class::initialize_mirror_fields(Klass* k, |
916 | Handle mirror, |
917 | Handle protection_domain, |
918 | Handle classData, |
919 | TRAPSJavaThread* __the_thread__) { |
920 | // Allocate a simple java object for a lock. |
921 | // This needs to be a java object because during class initialization |
922 | // it can be held across a java call. |
923 | typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
924 | set_init_lock(mirror(), r); |
925 | |
926 | // Set protection domain also |
927 | set_protection_domain(mirror(), protection_domain()); |
928 | |
929 | // Initialize static fields |
930 | InstanceKlass::cast(k)->do_local_static_fields(&initialize_static_field, mirror, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
931 | |
932 | // Set classData |
933 | set_class_data(mirror(), classData()); |
934 | } |
935 | |
936 | // Set the java.lang.Module module field in the java_lang_Class mirror |
937 | void java_lang_Class::set_mirror_module_field(JavaThread* current, Klass* k, Handle mirror, Handle module) { |
938 | if (module.is_null()) { |
939 | // During startup, the module may be NULL only if java.base has not been defined yet. |
940 | // Put the class on the fixup_module_list to patch later when the java.lang.Module |
941 | // for java.base is known. But note that since we captured the NULL module another |
942 | // thread may have completed that initialization. |
943 | |
944 | bool javabase_was_defined = false; |
945 | { |
946 | MutexLocker m1(current, Module_lock); |
947 | // Keep list of classes needing java.base module fixup |
948 | if (!ModuleEntryTable::javabase_defined()) { |
949 | assert(k->java_mirror() != NULL, "Class's mirror is null")do { if (!(k->java_mirror() != __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 949, "assert(" "k->java_mirror() != __null" ") failed", "Class's mirror is null" ); ::breakpoint(); } } while (0); |
950 | k->class_loader_data()->inc_keep_alive(); |
951 | assert(fixup_module_field_list() != NULL, "fixup_module_field_list not initialized")do { if (!(fixup_module_field_list() != __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 951, "assert(" "fixup_module_field_list() != __null" ") failed" , "fixup_module_field_list not initialized"); ::breakpoint(); } } while (0); |
952 | fixup_module_field_list()->push(k); |
953 | } else { |
954 | javabase_was_defined = true; |
955 | } |
956 | } |
957 | |
958 | // If java.base was already defined then patch this particular class with java.base. |
959 | if (javabase_was_defined) { |
960 | ModuleEntry *javabase_entry = ModuleEntryTable::javabase_moduleEntry(); |
961 | assert(javabase_entry != NULL && javabase_entry->module() != NULL,do { if (!(javabase_entry != __null && javabase_entry ->module() != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 962, "assert(" "javabase_entry != __null && javabase_entry->module() != __null" ") failed", "Setting class module field, " "java.base" " should be defined" ); ::breakpoint(); } } while (0) |
962 | "Setting class module field, " JAVA_BASE_NAME " should be defined")do { if (!(javabase_entry != __null && javabase_entry ->module() != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 962, "assert(" "javabase_entry != __null && javabase_entry->module() != __null" ") failed", "Setting class module field, " "java.base" " should be defined" ); ::breakpoint(); } } while (0); |
963 | Handle javabase_handle(current, javabase_entry->module()); |
964 | set_module(mirror(), javabase_handle()); |
965 | } |
966 | } else { |
967 | assert(Universe::is_module_initialized() ||do { if (!(Universe::is_module_initialized() || (ModuleEntryTable ::javabase_defined() && (module() == ModuleEntryTable ::javabase_moduleEntry()->module())))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 970, "assert(" "Universe::is_module_initialized() || (ModuleEntryTable::javabase_defined() && (module() == ModuleEntryTable::javabase_moduleEntry()->module()))" ") failed", "Incorrect java.lang.Module specification while creating mirror" ); ::breakpoint(); } } while (0) |
968 | (ModuleEntryTable::javabase_defined() &&do { if (!(Universe::is_module_initialized() || (ModuleEntryTable ::javabase_defined() && (module() == ModuleEntryTable ::javabase_moduleEntry()->module())))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 970, "assert(" "Universe::is_module_initialized() || (ModuleEntryTable::javabase_defined() && (module() == ModuleEntryTable::javabase_moduleEntry()->module()))" ") failed", "Incorrect java.lang.Module specification while creating mirror" ); ::breakpoint(); } } while (0) |
969 | (module() == ModuleEntryTable::javabase_moduleEntry()->module())),do { if (!(Universe::is_module_initialized() || (ModuleEntryTable ::javabase_defined() && (module() == ModuleEntryTable ::javabase_moduleEntry()->module())))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 970, "assert(" "Universe::is_module_initialized() || (ModuleEntryTable::javabase_defined() && (module() == ModuleEntryTable::javabase_moduleEntry()->module()))" ") failed", "Incorrect java.lang.Module specification while creating mirror" ); ::breakpoint(); } } while (0) |
970 | "Incorrect java.lang.Module specification while creating mirror")do { if (!(Universe::is_module_initialized() || (ModuleEntryTable ::javabase_defined() && (module() == ModuleEntryTable ::javabase_moduleEntry()->module())))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 970, "assert(" "Universe::is_module_initialized() || (ModuleEntryTable::javabase_defined() && (module() == ModuleEntryTable::javabase_moduleEntry()->module()))" ") failed", "Incorrect java.lang.Module specification while creating mirror" ); ::breakpoint(); } } while (0); |
971 | set_module(mirror(), module()); |
972 | } |
973 | } |
974 | |
975 | // Statically allocate fixup lists because they always get created. |
976 | void java_lang_Class::allocate_fixup_lists() { |
977 | GrowableArray<Klass*>* mirror_list = |
978 | new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, mtClass); |
979 | set_fixup_mirror_list(mirror_list); |
980 | |
981 | GrowableArray<Klass*>* module_list = |
982 | new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, mtModule); |
983 | set_fixup_module_field_list(module_list); |
984 | } |
985 | |
986 | void java_lang_Class::create_mirror(Klass* k, Handle class_loader, |
987 | Handle module, Handle protection_domain, |
988 | Handle classData, TRAPSJavaThread* __the_thread__) { |
989 | assert(k != NULL, "Use create_basic_type_mirror for primitive types")do { if (!(k != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 989, "assert(" "k != __null" ") failed", "Use create_basic_type_mirror for primitive types" ); ::breakpoint(); } } while (0); |
990 | assert(k->java_mirror() == NULL, "should only assign mirror once")do { if (!(k->java_mirror() == __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 990, "assert(" "k->java_mirror() == __null" ") failed", "should only assign mirror once" ); ::breakpoint(); } } while (0); |
991 | |
992 | // Use this moment of initialization to cache modifier_flags also, |
993 | // to support Class.getModifiers(). Instance classes recalculate |
994 | // the cached flags after the class file is parsed, but before the |
995 | // class is put into the system dictionary. |
996 | int computed_modifiers = k->compute_modifier_flags(); |
997 | k->set_modifier_flags(computed_modifiers); |
998 | // Class_klass has to be loaded because it is used to allocate |
999 | // the mirror. |
1000 | if (vmClasses::Class_klass_loaded()) { |
1001 | // Allocate mirror (java.lang.Class instance) |
1002 | oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
1003 | Handle mirror(THREAD__the_thread__, mirror_oop); |
1004 | Handle comp_mirror; |
1005 | |
1006 | // Setup indirection from mirror->klass |
1007 | set_klass(mirror(), k); |
1008 | |
1009 | InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); |
1010 | assert(oop_size(mirror()) == mk->instance_size(k), "should have been set")do { if (!(oop_size(mirror()) == mk->instance_size(k))) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1010, "assert(" "oop_size(mirror()) == mk->instance_size(k)" ") failed", "should have been set"); ::breakpoint(); } } while (0); |
1011 | |
1012 | set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); |
1013 | |
1014 | // It might also have a component mirror. This mirror must already exist. |
1015 | if (k->is_array_klass()) { |
1016 | if (k->is_typeArray_klass()) { |
1017 | BasicType type = TypeArrayKlass::cast(k)->element_type(); |
1018 | comp_mirror = Handle(THREAD__the_thread__, Universe::java_mirror(type)); |
1019 | } else { |
1020 | assert(k->is_objArray_klass(), "Must be")do { if (!(k->is_objArray_klass())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1020, "assert(" "k->is_objArray_klass()" ") failed", "Must be" ); ::breakpoint(); } } while (0); |
1021 | Klass* element_klass = ObjArrayKlass::cast(k)->element_klass(); |
1022 | assert(element_klass != NULL, "Must have an element klass")do { if (!(element_klass != __null)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1022, "assert(" "element_klass != __null" ") failed", "Must have an element klass" ); ::breakpoint(); } } while (0); |
1023 | comp_mirror = Handle(THREAD__the_thread__, element_klass->java_mirror()); |
1024 | } |
1025 | assert(comp_mirror() != NULL, "must have a mirror")do { if (!(comp_mirror() != __null)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1025, "assert(" "comp_mirror() != __null" ") failed", "must have a mirror" ); ::breakpoint(); } } while (0); |
1026 | |
1027 | // Two-way link between the array klass and its component mirror: |
1028 | // (array_klass) k -> mirror -> component_mirror -> array_klass -> k |
1029 | set_component_mirror(mirror(), comp_mirror()); |
1030 | // See below for ordering dependencies between field array_klass in component mirror |
1031 | // and java_mirror in this klass. |
1032 | } else { |
1033 | assert(k->is_instance_klass(), "Must be")do { if (!(k->is_instance_klass())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1033, "assert(" "k->is_instance_klass()" ") failed", "Must be" ); ::breakpoint(); } } while (0); |
1034 | |
1035 | initialize_mirror_fields(k, mirror, protection_domain, classData, THREAD__the_thread__); |
1036 | if (HAS_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->has_pending_exception())) { |
1037 | // If any of the fields throws an exception like OOM remove the klass field |
1038 | // from the mirror so GC doesn't follow it after the klass has been deallocated. |
1039 | // This mirror looks like a primitive type, which logically it is because it |
1040 | // it represents no class. |
1041 | set_klass(mirror(), NULL__null); |
1042 | return; |
1043 | } |
1044 | } |
1045 | |
1046 | // set the classLoader field in the java_lang_Class instance |
1047 | assert(class_loader() == k->class_loader(), "should be same")do { if (!(class_loader() == k->class_loader())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1047, "assert(" "class_loader() == k->class_loader()" ") failed" , "should be same"); ::breakpoint(); } } while (0); |
1048 | set_class_loader(mirror(), class_loader()); |
1049 | |
1050 | // Setup indirection from klass->mirror |
1051 | // after any exceptions can happen during allocations. |
1052 | k->set_java_mirror(mirror); |
1053 | |
1054 | // Set the module field in the java_lang_Class instance. This must be done |
1055 | // after the mirror is set. |
1056 | set_mirror_module_field(THREAD__the_thread__, k, mirror, module); |
1057 | |
1058 | if (comp_mirror() != NULL__null) { |
1059 | // Set after k->java_mirror() is published, because compiled code running |
1060 | // concurrently doesn't expect a k to have a null java_mirror. |
1061 | release_set_array_klass(comp_mirror(), k); |
1062 | } |
1063 | } else { |
1064 | assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized")do { if (!(fixup_mirror_list() != __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1064, "assert(" "fixup_mirror_list() != __null" ") failed", "fixup_mirror_list not initialized"); ::breakpoint(); } } while (0); |
1065 | fixup_mirror_list()->push(k); |
1066 | } |
1067 | } |
1068 | |
1069 | #if INCLUDE_CDS_JAVA_HEAP1 |
1070 | // Clears mirror fields. Static final fields with initial values are reloaded |
1071 | // from constant pool. The object identity hash is in the object header and is |
1072 | // not affected. |
1073 | class ResetMirrorField: public FieldClosure { |
1074 | private: |
1075 | Handle _m; |
1076 | |
1077 | public: |
1078 | ResetMirrorField(Handle mirror) : _m(mirror) {} |
1079 | |
1080 | void do_field(fieldDescriptor* fd) { |
1081 | assert(DumpSharedSpaces, "dump time only")do { if (!(DumpSharedSpaces)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1081, "assert(" "DumpSharedSpaces" ") failed", "dump time only" ); ::breakpoint(); } } while (0); |
1082 | assert(_m.not_null(), "Mirror cannot be NULL")do { if (!(_m.not_null())) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1082, "assert(" "_m.not_null()" ") failed", "Mirror cannot be NULL" ); ::breakpoint(); } } while (0); |
1083 | |
1084 | if (fd->is_static() && fd->has_initial_value()) { |
1085 | initialize_static_field_for_dump(fd, _m); |
1086 | return; |
1087 | } |
1088 | |
1089 | BasicType ft = fd->field_type(); |
1090 | switch (ft) { |
1091 | case T_BYTE: |
1092 | _m()->byte_field_put(fd->offset(), 0); |
1093 | break; |
1094 | case T_CHAR: |
1095 | _m()->char_field_put(fd->offset(), 0); |
1096 | break; |
1097 | case T_DOUBLE: |
1098 | _m()->double_field_put(fd->offset(), 0); |
1099 | break; |
1100 | case T_FLOAT: |
1101 | _m()->float_field_put(fd->offset(), 0); |
1102 | break; |
1103 | case T_INT: |
1104 | _m()->int_field_put(fd->offset(), 0); |
1105 | break; |
1106 | case T_LONG: |
1107 | _m()->long_field_put(fd->offset(), 0); |
1108 | break; |
1109 | case T_SHORT: |
1110 | _m()->short_field_put(fd->offset(), 0); |
1111 | break; |
1112 | case T_BOOLEAN: |
1113 | _m()->bool_field_put(fd->offset(), false); |
1114 | break; |
1115 | case T_ARRAY: |
1116 | case T_OBJECT: { |
1117 | // It might be useful to cache the String field, but |
1118 | // for now just clear out any reference field |
1119 | oop o = _m()->obj_field(fd->offset()); |
1120 | _m()->obj_field_put(fd->offset(), NULL__null); |
1121 | break; |
1122 | } |
1123 | default: |
1124 | ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here( "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1124); ::breakpoint(); } while (0); |
1125 | break; |
1126 | } |
1127 | } |
1128 | }; |
1129 | |
1130 | static void set_klass_field_in_archived_mirror(oop mirror_obj, int offset, Klass* k) { |
1131 | assert(java_lang_Class::is_instance(mirror_obj), "must be")do { if (!(java_lang_Class::is_instance(mirror_obj))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1131, "assert(" "java_lang_Class::is_instance(mirror_obj)" ") failed" , "must be"); ::breakpoint(); } } while (0); |
1132 | // this is the copy of k in the output buffer |
1133 | Klass* copy = ArchiveBuilder::get_relocated_klass(k); |
1134 | |
1135 | // This is the address of k, if the archive is loaded at the requested location |
1136 | Klass* def = ArchiveBuilder::current()->to_requested(copy); |
1137 | |
1138 | log_debug(cds, heap, mirror)(!(LogImpl<(LogTag::_cds), (LogTag::_heap), (LogTag::_mirror ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Debug))) ? (void)0 : LogImpl<(LogTag ::_cds), (LogTag::_heap), (LogTag::_mirror), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Debug>( |
1139 | "Relocate mirror metadata field at %d from " PTR_FORMAT"0x%016" "l" "x" " ==> " PTR_FORMAT"0x%016" "l" "x", |
1140 | offset, p2i(k), p2i(def)); |
1141 | |
1142 | mirror_obj->metadata_field_put(offset, def); |
1143 | } |
1144 | |
1145 | void java_lang_Class::archive_basic_type_mirrors() { |
1146 | assert(HeapShared::can_write(), "must be")do { if (!(HeapShared::can_write())) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1146, "assert(" "HeapShared::can_write()" ") failed", "must be" ); ::breakpoint(); } } while (0); |
1147 | |
1148 | for (int t = T_BOOLEAN; t < T_VOID+1; t++) { |
1149 | BasicType bt = (BasicType)t; |
1150 | oop m = Universe::_mirrors[t].resolve(); |
1151 | if (m != NULL__null) { |
1152 | // Update the field at _array_klass_offset to point to the relocated array klass. |
1153 | oop archived_m = HeapShared::archive_object(m); |
1154 | assert(archived_m != NULL, "sanity")do { if (!(archived_m != __null)) { (*g_assert_poison) = 'X'; ; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1154, "assert(" "archived_m != __null" ") failed", "sanity" ); ::breakpoint(); } } while (0); |
1155 | Klass *ak = (Klass*)(archived_m->metadata_field(_array_klass_offset)); |
1156 | assert(ak != NULL || t == T_VOID, "should not be NULL")do { if (!(ak != __null || t == T_VOID)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1156, "assert(" "ak != __null || t == T_VOID" ") failed", "should not be NULL" ); ::breakpoint(); } } while (0); |
1157 | if (ak != NULL__null) { |
1158 | set_klass_field_in_archived_mirror(archived_m, _array_klass_offset, ak); |
1159 | } |
1160 | |
1161 | // Clear the fields. Just to be safe |
1162 | Klass *k = m->klass(); |
1163 | Handle archived_mirror_h(Thread::current(), archived_m); |
1164 | ResetMirrorField reset(archived_mirror_h); |
1165 | InstanceKlass::cast(k)->do_nonstatic_fields(&reset); |
1166 | |
1167 | log_trace(cds, heap, mirror)(!(LogImpl<(LogTag::_cds), (LogTag::_heap), (LogTag::_mirror ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Trace))) ? (void)0 : LogImpl<(LogTag ::_cds), (LogTag::_heap), (LogTag::_mirror), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Trace>( |
1168 | "Archived %s mirror object from " PTR_FORMAT"0x%016" "l" "x" " ==> " PTR_FORMAT"0x%016" "l" "x", |
1169 | type2name(bt), p2i(m), p2i(archived_m)); |
1170 | |
1171 | Universe::replace_mirror(bt, archived_m); |
1172 | } |
1173 | } |
1174 | } |
1175 | // |
1176 | // After the mirror object is successfully archived, the archived |
1177 | // klass is set with _has_archived_raw_mirror flag. |
1178 | // |
1179 | // The _has_archived_raw_mirror flag is cleared at runtime when the |
1180 | // archived mirror is restored. If archived java heap data cannot |
1181 | // be used at runtime, new mirror object is created for the shared |
1182 | // class. The _has_archived_raw_mirror is cleared also during the process. |
1183 | oop java_lang_Class::archive_mirror(Klass* k) { |
1184 | assert(HeapShared::can_write(), "must be")do { if (!(HeapShared::can_write())) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1184, "assert(" "HeapShared::can_write()" ") failed", "must be" ); ::breakpoint(); } } while (0); |
1185 | |
1186 | // Mirror is already archived |
1187 | if (k->has_archived_mirror_index()) { |
1188 | assert(k->archived_java_mirror() != NULL, "no archived mirror")do { if (!(k->archived_java_mirror() != __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1188, "assert(" "k->archived_java_mirror() != __null" ") failed" , "no archived mirror"); ::breakpoint(); } } while (0); |
1189 | return k->archived_java_mirror(); |
1190 | } |
1191 | |
1192 | // No mirror |
1193 | oop mirror = k->java_mirror(); |
1194 | if (mirror == NULL__null) { |
1195 | return NULL__null; |
1196 | } |
1197 | |
1198 | if (k->is_instance_klass()) { |
1199 | InstanceKlass *ik = InstanceKlass::cast(k); |
1200 | assert(ik->signers() == NULL, "class with signer should have been excluded")do { if (!(ik->signers() == __null)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1200, "assert(" "ik->signers() == __null" ") failed", "class with signer should have been excluded" ); ::breakpoint(); } } while (0); |
1201 | |
1202 | if (!(ik->is_shared_boot_class() || ik->is_shared_platform_class() || |
1203 | ik->is_shared_app_class())) { |
1204 | // Archiving mirror for classes from non-builtin loaders is not |
1205 | // supported. |
1206 | return NULL__null; |
1207 | } |
1208 | } |
1209 | |
1210 | // Now start archiving the mirror object |
1211 | oop archived_mirror = HeapShared::archive_object(mirror); |
1212 | if (archived_mirror == NULL__null) { |
1213 | return NULL__null; |
1214 | } |
1215 | |
1216 | archived_mirror = process_archived_mirror(k, mirror, archived_mirror); |
1217 | if (archived_mirror == NULL__null) { |
1218 | return NULL__null; |
1219 | } |
1220 | |
1221 | k->set_archived_java_mirror(archived_mirror); |
1222 | |
1223 | ResourceMark rm; |
1224 | log_trace(cds, heap, mirror)(!(LogImpl<(LogTag::_cds), (LogTag::_heap), (LogTag::_mirror ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Trace))) ? (void)0 : LogImpl<(LogTag ::_cds), (LogTag::_heap), (LogTag::_mirror), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Trace>( |
1225 | "Archived %s mirror object from " PTR_FORMAT"0x%016" "l" "x" " ==> " PTR_FORMAT"0x%016" "l" "x", |
1226 | k->external_name(), p2i(mirror), p2i(archived_mirror)); |
1227 | |
1228 | return archived_mirror; |
1229 | } |
1230 | |
1231 | // The process is based on create_mirror(). |
1232 | oop java_lang_Class::process_archived_mirror(Klass* k, oop mirror, |
1233 | oop archived_mirror) { |
1234 | // Clear nonstatic fields in archived mirror. Some of the fields will be set |
1235 | // to archived metadata and objects below. |
1236 | Klass *c = archived_mirror->klass(); |
1237 | Handle archived_mirror_h(Thread::current(), archived_mirror); |
1238 | ResetMirrorField reset(archived_mirror_h); |
1239 | InstanceKlass::cast(c)->do_nonstatic_fields(&reset); |
1240 | |
1241 | if (k->is_array_klass()) { |
1242 | oop archived_comp_mirror; |
1243 | if (k->is_typeArray_klass()) { |
1244 | // The primitive type mirrors are already archived. Get the archived mirror. |
1245 | oop comp_mirror = component_mirror(mirror); |
1246 | archived_comp_mirror = HeapShared::find_archived_heap_object(comp_mirror); |
1247 | assert(archived_comp_mirror != NULL, "Must be")do { if (!(archived_comp_mirror != __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1247, "assert(" "archived_comp_mirror != __null" ") failed" , "Must be"); ::breakpoint(); } } while (0); |
1248 | } else { |
1249 | assert(k->is_objArray_klass(), "Must be")do { if (!(k->is_objArray_klass())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1249, "assert(" "k->is_objArray_klass()" ") failed", "Must be" ); ::breakpoint(); } } while (0); |
1250 | Klass* element_klass = ObjArrayKlass::cast(k)->element_klass(); |
1251 | assert(element_klass != NULL, "Must have an element klass")do { if (!(element_klass != __null)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1251, "assert(" "element_klass != __null" ") failed", "Must have an element klass" ); ::breakpoint(); } } while (0); |
1252 | archived_comp_mirror = archive_mirror(element_klass); |
1253 | if (archived_comp_mirror == NULL__null) { |
1254 | return NULL__null; |
1255 | } |
1256 | } |
1257 | set_component_mirror(archived_mirror, archived_comp_mirror); |
1258 | } else { |
1259 | assert(k->is_instance_klass(), "Must be")do { if (!(k->is_instance_klass())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1259, "assert(" "k->is_instance_klass()" ") failed", "Must be" ); ::breakpoint(); } } while (0); |
1260 | |
1261 | // Reset local static fields in the mirror |
1262 | InstanceKlass::cast(k)->do_local_static_fields(&reset); |
1263 | |
1264 | set_init_lock(archived_mirror, NULL__null); |
1265 | |
1266 | set_protection_domain(archived_mirror, NULL__null); |
1267 | set_signers(archived_mirror, NULL__null); |
1268 | set_source_file(archived_mirror, NULL__null); |
1269 | } |
1270 | |
1271 | // clear class loader and mirror_module_field |
1272 | set_class_loader(archived_mirror, NULL__null); |
1273 | set_module(archived_mirror, NULL__null); |
1274 | |
1275 | // The archived mirror's field at _klass_offset is still pointing to the original |
1276 | // klass. Updated the field in the archived mirror to point to the relocated |
1277 | // klass in the archive. |
1278 | set_klass_field_in_archived_mirror(archived_mirror, _klass_offset, as_Klass(mirror)); |
1279 | |
1280 | // The field at _array_klass_offset is pointing to the original one dimension |
1281 | // higher array klass if exists. Relocate the pointer. |
1282 | Klass *arr = array_klass_acquire(mirror); |
1283 | if (arr != NULL__null) { |
1284 | set_klass_field_in_archived_mirror(archived_mirror, _array_klass_offset, arr); |
1285 | } |
1286 | return archived_mirror; |
1287 | } |
1288 | |
1289 | void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) { |
1290 | if (MetaspaceShared::relocation_delta() != 0) { |
1291 | assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class")do { if (!(archived_mirror->metadata_field(_klass_offset) == __null)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1291, "assert(" "archived_mirror->metadata_field(_klass_offset) == __null" ") failed", "must be for primitive class"); ::breakpoint(); } } while (0); |
1292 | |
1293 | Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset)); |
1294 | if (ak != NULL__null) { |
1295 | archived_mirror->metadata_field_put(_array_klass_offset, |
1296 | (Klass*)(address(ak) + MetaspaceShared::relocation_delta())); |
1297 | } |
1298 | } |
1299 | } |
1300 | |
1301 | void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) { |
1302 | assert(MetaspaceShared::relocation_delta() != 0, "must be")do { if (!(MetaspaceShared::relocation_delta() != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1302, "assert(" "MetaspaceShared::relocation_delta() != 0" ") failed" , "must be"); ::breakpoint(); } } while (0); |
1303 | |
1304 | Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset)); |
1305 | archived_mirror->metadata_field_put(_klass_offset, |
1306 | (Klass*)(address(k) + MetaspaceShared::relocation_delta())); |
1307 | |
1308 | Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset)); |
1309 | if (ak != NULL__null) { |
1310 | archived_mirror->metadata_field_put(_array_klass_offset, |
1311 | (Klass*)(address(ak) + MetaspaceShared::relocation_delta())); |
1312 | } |
1313 | } |
1314 | |
1315 | |
1316 | // Returns true if the mirror is updated, false if no archived mirror |
1317 | // data is present. After the archived mirror object is restored, the |
1318 | // shared klass' _has_raw_archived_mirror flag is cleared. |
1319 | bool java_lang_Class::restore_archived_mirror(Klass *k, |
1320 | Handle class_loader, Handle module, |
1321 | Handle protection_domain, TRAPSJavaThread* __the_thread__) { |
1322 | // Postpone restoring archived mirror until java.lang.Class is loaded. Please |
1323 | // see more details in vmClasses::resolve_all(). |
1324 | if (!vmClasses::Class_klass_loaded()) { |
1325 | assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized")do { if (!(fixup_mirror_list() != __null)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1325, "assert(" "fixup_mirror_list() != __null" ") failed", "fixup_mirror_list not initialized"); ::breakpoint(); } } while (0); |
1326 | fixup_mirror_list()->push(k); |
1327 | return true; |
1328 | } |
1329 | |
1330 | oop m = k->archived_java_mirror(); |
1331 | assert(m != NULL, "must have stored non-null archived mirror")do { if (!(m != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1331, "assert(" "m != __null" ") failed", "must have stored non-null archived mirror" ); ::breakpoint(); } } while (0); |
1332 | |
1333 | // Sanity: clear it now to prevent re-initialization if any of the following fails |
1334 | k->clear_archived_mirror_index(); |
1335 | |
1336 | // mirror is archived, restore |
1337 | log_debug(cds, mirror)(!(LogImpl<(LogTag::_cds), (LogTag::_mirror), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Debug))) ? (void)0 : LogImpl<(LogTag ::_cds), (LogTag::_mirror), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Debug>("Archived mirror is: " PTR_FORMAT"0x%016" "l" "x", p2i(m)); |
1338 | if (HeapShared::is_mapped()) { |
1339 | assert(Universe::heap()->is_archived_object(m), "must be archived mirror object")do { if (!(Universe::heap()->is_archived_object(m))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1339, "assert(" "Universe::heap()->is_archived_object(m)" ") failed", "must be archived mirror object"); ::breakpoint( ); } } while (0); |
1340 | } |
1341 | assert(as_Klass(m) == k, "must be")do { if (!(as_Klass(m) == k)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1341, "assert(" "as_Klass(m) == k" ") failed", "must be"); :: breakpoint(); } } while (0); |
1342 | Handle mirror(THREAD__the_thread__, m); |
1343 | |
1344 | if (!k->is_array_klass()) { |
1345 | // - local static final fields with initial values were initialized at dump time |
1346 | |
1347 | // create the init_lock |
1348 | typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false)__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return false; (void)(0); |
1349 | set_init_lock(mirror(), r); |
1350 | |
1351 | if (protection_domain.not_null()) { |
1352 | set_protection_domain(mirror(), protection_domain()); |
1353 | } |
1354 | } |
1355 | |
1356 | assert(class_loader() == k->class_loader(), "should be same")do { if (!(class_loader() == k->class_loader())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1356, "assert(" "class_loader() == k->class_loader()" ") failed" , "should be same"); ::breakpoint(); } } while (0); |
1357 | if (class_loader.not_null()) { |
1358 | set_class_loader(mirror(), class_loader()); |
1359 | } |
1360 | |
1361 | k->set_java_mirror(mirror); |
1362 | |
1363 | set_mirror_module_field(THREAD__the_thread__, k, mirror, module); |
1364 | |
1365 | if (log_is_enabled(Trace, cds, heap, mirror)(LogImpl<(LogTag::_cds), (LogTag::_heap), (LogTag::_mirror ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Trace))) { |
1366 | ResourceMark rm(THREAD__the_thread__); |
1367 | log_trace(cds, heap, mirror)(!(LogImpl<(LogTag::_cds), (LogTag::_heap), (LogTag::_mirror ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Trace))) ? (void)0 : LogImpl<(LogTag ::_cds), (LogTag::_heap), (LogTag::_mirror), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Trace>( |
1368 | "Restored %s archived mirror " PTR_FORMAT"0x%016" "l" "x", k->external_name(), p2i(mirror())); |
1369 | } |
1370 | |
1371 | return true; |
1372 | } |
1373 | #endif // INCLUDE_CDS_JAVA_HEAP |
1374 | |
1375 | void java_lang_Class::fixup_module_field(Klass* k, Handle module) { |
1376 | assert(_module_offset != 0, "must have been computed already")do { if (!(_module_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1376, "assert(" "_module_offset != 0" ") failed", "must have been computed already" ); ::breakpoint(); } } while (0); |
1377 | set_module(k->java_mirror(), module()); |
1378 | } |
1379 | |
1380 | void java_lang_Class::set_oop_size(HeapWord* java_class, size_t size) { |
1381 | assert(_oop_size_offset != 0, "must be set")do { if (!(_oop_size_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1381, "assert(" "_oop_size_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1382 | assert(size > 0, "Oop size must be greater than zero, not " SIZE_FORMAT, size)do { if (!(size > 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1382, "assert(" "size > 0" ") failed", "Oop size must be greater than zero, not " "%" "l" "u", size); ::breakpoint(); } } while (0); |
1383 | assert(size <= INT_MAX, "Lossy conversion: " SIZE_FORMAT, size)do { if (!(size <= 2147483647)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1383, "assert(" "size <= 2147483647" ") failed", "Lossy conversion: " "%" "l" "u", size); ::breakpoint(); } } while (0); |
1384 | *(int*)(((char*)java_class) + _oop_size_offset) = (int)size; |
1385 | } |
1386 | |
1387 | int java_lang_Class::static_oop_field_count(oop java_class) { |
1388 | assert(_static_oop_field_count_offset != 0, "must be set")do { if (!(_static_oop_field_count_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1388, "assert(" "_static_oop_field_count_offset != 0" ") failed" , "must be set"); ::breakpoint(); } } while (0); |
1389 | return java_class->int_field(_static_oop_field_count_offset); |
1390 | } |
1391 | |
1392 | void java_lang_Class::set_static_oop_field_count(oop java_class, int size) { |
1393 | assert(_static_oop_field_count_offset != 0, "must be set")do { if (!(_static_oop_field_count_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1393, "assert(" "_static_oop_field_count_offset != 0" ") failed" , "must be set"); ::breakpoint(); } } while (0); |
1394 | java_class->int_field_put(_static_oop_field_count_offset, size); |
1395 | } |
1396 | |
1397 | oop java_lang_Class::protection_domain(oop java_class) { |
1398 | assert(_protection_domain_offset != 0, "must be set")do { if (!(_protection_domain_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1398, "assert(" "_protection_domain_offset != 0" ") failed" , "must be set"); ::breakpoint(); } } while (0); |
1399 | return java_class->obj_field(_protection_domain_offset); |
1400 | } |
1401 | void java_lang_Class::set_protection_domain(oop java_class, oop pd) { |
1402 | assert(_protection_domain_offset != 0, "must be set")do { if (!(_protection_domain_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1402, "assert(" "_protection_domain_offset != 0" ") failed" , "must be set"); ::breakpoint(); } } while (0); |
1403 | java_class->obj_field_put(_protection_domain_offset, pd); |
1404 | } |
1405 | |
1406 | void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) { |
1407 | assert(_component_mirror_offset != 0, "must be set")do { if (!(_component_mirror_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1407, "assert(" "_component_mirror_offset != 0" ") failed", "must be set"); ::breakpoint(); } } while (0); |
1408 | java_class->obj_field_put(_component_mirror_offset, comp_mirror); |
1409 | } |
1410 | oop java_lang_Class::component_mirror(oop java_class) { |
1411 | assert(_component_mirror_offset != 0, "must be set")do { if (!(_component_mirror_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1411, "assert(" "_component_mirror_offset != 0" ") failed", "must be set"); ::breakpoint(); } } while (0); |
1412 | return java_class->obj_field(_component_mirror_offset); |
1413 | } |
1414 | |
1415 | oop java_lang_Class::init_lock(oop java_class) { |
1416 | assert(_init_lock_offset != 0, "must be set")do { if (!(_init_lock_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1416, "assert(" "_init_lock_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1417 | return java_class->obj_field(_init_lock_offset); |
1418 | } |
1419 | void java_lang_Class::set_init_lock(oop java_class, oop init_lock) { |
1420 | assert(_init_lock_offset != 0, "must be set")do { if (!(_init_lock_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1420, "assert(" "_init_lock_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1421 | java_class->obj_field_put(_init_lock_offset, init_lock); |
1422 | } |
1423 | |
1424 | objArrayOop java_lang_Class::signers(oop java_class) { |
1425 | assert(_signers_offset != 0, "must be set")do { if (!(_signers_offset != 0)) { (*g_assert_poison) = 'X'; ; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1425, "assert(" "_signers_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1426 | return (objArrayOop)java_class->obj_field(_signers_offset); |
1427 | } |
1428 | void java_lang_Class::set_signers(oop java_class, objArrayOop signers) { |
1429 | assert(_signers_offset != 0, "must be set")do { if (!(_signers_offset != 0)) { (*g_assert_poison) = 'X'; ; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1429, "assert(" "_signers_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1430 | java_class->obj_field_put(_signers_offset, signers); |
1431 | } |
1432 | |
1433 | oop java_lang_Class::class_data(oop java_class) { |
1434 | assert(_classData_offset != 0, "must be set")do { if (!(_classData_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1434, "assert(" "_classData_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1435 | return java_class->obj_field(_classData_offset); |
1436 | } |
1437 | void java_lang_Class::set_class_data(oop java_class, oop class_data) { |
1438 | assert(_classData_offset != 0, "must be set")do { if (!(_classData_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1438, "assert(" "_classData_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1439 | java_class->obj_field_put(_classData_offset, class_data); |
1440 | } |
1441 | |
1442 | void java_lang_Class::set_class_loader(oop java_class, oop loader) { |
1443 | assert(_class_loader_offset != 0, "offsets should have been initialized")do { if (!(_class_loader_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1443, "assert(" "_class_loader_offset != 0" ") failed", "offsets should have been initialized" ); ::breakpoint(); } } while (0); |
1444 | java_class->obj_field_put(_class_loader_offset, loader); |
1445 | } |
1446 | |
1447 | oop java_lang_Class::class_loader(oop java_class) { |
1448 | assert(_class_loader_offset != 0, "must be set")do { if (!(_class_loader_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1448, "assert(" "_class_loader_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1449 | return java_class->obj_field(_class_loader_offset); |
1450 | } |
1451 | |
1452 | oop java_lang_Class::module(oop java_class) { |
1453 | assert(_module_offset != 0, "must be set")do { if (!(_module_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1453, "assert(" "_module_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1454 | return java_class->obj_field(_module_offset); |
1455 | } |
1456 | |
1457 | void java_lang_Class::set_module(oop java_class, oop module) { |
1458 | assert(_module_offset != 0, "must be set")do { if (!(_module_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1458, "assert(" "_module_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1459 | java_class->obj_field_put(_module_offset, module); |
1460 | } |
1461 | |
1462 | oop java_lang_Class::name(Handle java_class, TRAPSJavaThread* __the_thread__) { |
1463 | assert(_name_offset != 0, "must be set")do { if (!(_name_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1463, "assert(" "_name_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1464 | oop o = java_class->obj_field(_name_offset); |
1465 | if (o == NULL__null) { |
1466 | o = StringTable::intern(as_external_name(java_class()), THREAD__the_thread__); |
1467 | java_class->obj_field_put(_name_offset, o); |
1468 | } |
1469 | return o; |
1470 | } |
1471 | |
1472 | oop java_lang_Class::source_file(oop java_class) { |
1473 | assert(_source_file_offset != 0, "must be set")do { if (!(_source_file_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1473, "assert(" "_source_file_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1474 | return java_class->obj_field(_source_file_offset); |
1475 | } |
1476 | |
1477 | void java_lang_Class::set_source_file(oop java_class, oop source_file) { |
1478 | assert(_source_file_offset != 0, "must be set")do { if (!(_source_file_offset != 0)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1478, "assert(" "_source_file_offset != 0" ") failed", "must be set" ); ::breakpoint(); } } while (0); |
1479 | java_class->obj_field_put(_source_file_offset, source_file); |
1480 | } |
1481 | |
1482 | oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPSJavaThread* __the_thread__) { |
1483 | // This should be improved by adding a field at the Java level or by |
1484 | // introducing a new VM klass (see comment in ClassFileParser) |
1485 | oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(NULL__null, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
1486 | if (type != T_VOID) { |
1487 | Klass* aklass = Universe::typeArrayKlassObj(type); |
1488 | assert(aklass != NULL, "correct bootstrap")do { if (!(aklass != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1488, "assert(" "aklass != __null" ") failed", "correct bootstrap" ); ::breakpoint(); } } while (0); |
1489 | release_set_array_klass(java_class, aklass); |
1490 | } |
1491 | #ifdef ASSERT1 |
1492 | InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass()); |
1493 | assert(static_oop_field_count(java_class) == 0, "should have been zeroed by allocation")do { if (!(static_oop_field_count(java_class) == 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1493, "assert(" "static_oop_field_count(java_class) == 0" ") failed" , "should have been zeroed by allocation"); ::breakpoint(); } } while (0); |
1494 | #endif |
1495 | return java_class; |
1496 | } |
1497 | |
1498 | void java_lang_Class::set_klass(oop java_class, Klass* klass) { |
1499 | assert(is_instance(java_class), "must be a Class object")do { if (!(is_instance(java_class))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1499, "assert(" "is_instance(java_class)" ") failed", "must be a Class object" ); ::breakpoint(); } } while (0); |
1500 | java_class->metadata_field_put(_klass_offset, klass); |
1501 | } |
1502 | |
1503 | |
1504 | void java_lang_Class::print_signature(oop java_class, outputStream* st) { |
1505 | assert(is_instance(java_class), "must be a Class object")do { if (!(is_instance(java_class))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1505, "assert(" "is_instance(java_class)" ") failed", "must be a Class object" ); ::breakpoint(); } } while (0); |
1506 | Symbol* name = NULL__null; |
1507 | bool is_instance = false; |
1508 | if (is_primitive(java_class)) { |
1509 | name = vmSymbols::type_signature(primitive_type(java_class)); |
1510 | } else { |
1511 | Klass* k = as_Klass(java_class); |
1512 | is_instance = k->is_instance_klass(); |
1513 | name = k->name(); |
1514 | } |
1515 | if (name == NULL__null) { |
1516 | st->print("<null>"); |
1517 | return; |
1518 | } |
1519 | if (is_instance) st->print("L"); |
1520 | st->write((char*) name->base(), (int) name->utf8_length()); |
1521 | if (is_instance) st->print(";"); |
1522 | } |
1523 | |
1524 | Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found) { |
1525 | assert(is_instance(java_class), "must be a Class object")do { if (!(is_instance(java_class))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1525, "assert(" "is_instance(java_class)" ") failed", "must be a Class object" ); ::breakpoint(); } } while (0); |
1526 | Symbol* name; |
1527 | if (is_primitive(java_class)) { |
1528 | name = vmSymbols::type_signature(primitive_type(java_class)); |
1529 | // Because this can create a new symbol, the caller has to decrement |
1530 | // the refcount, so make adjustment here and below for symbols returned |
1531 | // that are not created or incremented due to a successful lookup. |
1532 | name->increment_refcount(); |
1533 | } else { |
1534 | Klass* k = as_Klass(java_class); |
1535 | if (!k->is_instance_klass()) { |
1536 | name = k->name(); |
1537 | name->increment_refcount(); |
1538 | } else { |
1539 | ResourceMark rm; |
1540 | const char* sigstr = k->signature_name(); |
1541 | int siglen = (int) strlen(sigstr); |
1542 | if (!intern_if_not_found) { |
1543 | name = SymbolTable::probe(sigstr, siglen); |
1544 | } else { |
1545 | name = SymbolTable::new_symbol(sigstr, siglen); |
1546 | } |
1547 | } |
1548 | } |
1549 | return name; |
1550 | } |
1551 | |
1552 | // Returns the Java name for this Java mirror (Resource allocated) |
1553 | // See Klass::external_name(). |
1554 | // For primitive type Java mirrors, its type name is returned. |
1555 | const char* java_lang_Class::as_external_name(oop java_class) { |
1556 | assert(is_instance(java_class), "must be a Class object")do { if (!(is_instance(java_class))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1556, "assert(" "is_instance(java_class)" ") failed", "must be a Class object" ); ::breakpoint(); } } while (0); |
1557 | const char* name = NULL__null; |
1558 | if (is_primitive(java_class)) { |
1559 | name = type2name(primitive_type(java_class)); |
1560 | } else { |
1561 | name = as_Klass(java_class)->external_name(); |
1562 | } |
1563 | if (name == NULL__null) { |
1564 | name = "<null>"; |
1565 | } |
1566 | return name; |
1567 | } |
1568 | |
1569 | Klass* java_lang_Class::array_klass_acquire(oop java_class) { |
1570 | Klass* k = ((Klass*)java_class->metadata_field_acquire(_array_klass_offset)); |
1571 | assert(k == NULL || k->is_klass() && k->is_array_klass(), "should be array klass")do { if (!(k == __null || k->is_klass() && k->is_array_klass ())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1571, "assert(" "k == __null || k->is_klass() && k->is_array_klass()" ") failed", "should be array klass"); ::breakpoint(); } } while (0); |
1572 | return k; |
1573 | } |
1574 | |
1575 | |
1576 | void java_lang_Class::release_set_array_klass(oop java_class, Klass* klass) { |
1577 | assert(klass->is_klass() && klass->is_array_klass(), "should be array klass")do { if (!(klass->is_klass() && klass->is_array_klass ())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1577, "assert(" "klass->is_klass() && klass->is_array_klass()" ") failed", "should be array klass"); ::breakpoint(); } } while (0); |
1578 | java_class->release_metadata_field_put(_array_klass_offset, klass); |
1579 | } |
1580 | |
1581 | |
1582 | BasicType java_lang_Class::primitive_type(oop java_class) { |
1583 | assert(is_primitive(java_class), "just checking")do { if (!(is_primitive(java_class))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1583, "assert(" "is_primitive(java_class)" ") failed", "just checking" ); ::breakpoint(); } } while (0); |
1584 | Klass* ak = ((Klass*)java_class->metadata_field(_array_klass_offset)); |
1585 | BasicType type = T_VOID; |
1586 | if (ak != NULL__null) { |
1587 | // Note: create_basic_type_mirror above initializes ak to a non-null value. |
1588 | type = ArrayKlass::cast(ak)->element_type(); |
1589 | } else { |
1590 | assert(java_class == Universe::void_mirror(), "only valid non-array primitive")do { if (!(java_class == Universe::void_mirror())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1590, "assert(" "java_class == Universe::void_mirror()" ") failed" , "only valid non-array primitive"); ::breakpoint(); } } while (0); |
1591 | } |
1592 | assert(Universe::java_mirror(type) == java_class, "must be consistent")do { if (!(Universe::java_mirror(type) == java_class)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1592, "assert(" "Universe::java_mirror(type) == java_class" ") failed", "must be consistent"); ::breakpoint(); } } while (0); |
1593 | return type; |
1594 | } |
1595 | |
1596 | BasicType java_lang_Class::as_BasicType(oop java_class, Klass** reference_klass) { |
1597 | assert(is_instance(java_class), "must be a Class object")do { if (!(is_instance(java_class))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1597, "assert(" "is_instance(java_class)" ") failed", "must be a Class object" ); ::breakpoint(); } } while (0); |
1598 | if (is_primitive(java_class)) { |
1599 | if (reference_klass != NULL__null) |
1600 | (*reference_klass) = NULL__null; |
1601 | return primitive_type(java_class); |
1602 | } else { |
1603 | if (reference_klass != NULL__null) |
1604 | (*reference_klass) = as_Klass(java_class); |
1605 | return T_OBJECT; |
1606 | } |
1607 | } |
1608 | |
1609 | |
1610 | oop java_lang_Class::primitive_mirror(BasicType t) { |
1611 | oop mirror = Universe::java_mirror(t); |
1612 | assert(mirror != NULL && mirror->is_a(vmClasses::Class_klass()), "must be a Class")do { if (!(mirror != __null && mirror->is_a(vmClasses ::Class_klass()))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1612, "assert(" "mirror != __null && mirror->is_a(vmClasses::Class_klass())" ") failed", "must be a Class"); ::breakpoint(); } } while (0 ); |
1613 | assert(is_primitive(mirror), "must be primitive")do { if (!(is_primitive(mirror))) { (*g_assert_poison) = 'X'; ; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1613, "assert(" "is_primitive(mirror)" ") failed", "must be primitive" ); ::breakpoint(); } } while (0); |
1614 | return mirror; |
1615 | } |
1616 | |
1617 | #define CLASS_FIELDS_DO(macro)macro(_classRedefinedCount_offset, k, "classRedefinedCount", int_signature , false); macro(_class_loader_offset, k, "classLoader", classloader_signature , false); macro(_component_mirror_offset, k, "componentType", class_signature, false); macro(_module_offset, k, "module", module_signature , false); macro(_name_offset, k, "name", string_signature, false ); macro(_classData_offset, k, "classData", object_signature, false); \ |
1618 | macro(_classRedefinedCount_offset, k, "classRedefinedCount", int_signature, false); \ |
1619 | macro(_class_loader_offset, k, "classLoader", classloader_signature, false); \ |
1620 | macro(_component_mirror_offset, k, "componentType", class_signature, false); \ |
1621 | macro(_module_offset, k, "module", module_signature, false); \ |
1622 | macro(_name_offset, k, "name", string_signature, false); \ |
1623 | macro(_classData_offset, k, "classData", object_signature, false); |
1624 | |
1625 | void java_lang_Class::compute_offsets() { |
1626 | if (_offsets_computed) { |
1627 | return; |
1628 | } |
1629 | |
1630 | _offsets_computed = true; |
1631 | |
1632 | InstanceKlass* k = vmClasses::Class_klass(); |
1633 | CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_classRedefinedCount_offset, k, "classRedefinedCount" , vmSymbols::int_signature(), false); compute_offset(_class_loader_offset , k, "classLoader", vmSymbols::classloader_signature(), false ); compute_offset(_component_mirror_offset, k, "componentType" , vmSymbols::class_signature(), false); compute_offset(_module_offset , k, "module", vmSymbols::module_signature(), false); compute_offset (_name_offset, k, "name", vmSymbols::string_signature(), false ); compute_offset(_classData_offset, k, "classData", vmSymbols ::object_signature(), false);; |
1634 | |
1635 | // Init lock is a C union with component_mirror. Only instanceKlass mirrors have |
1636 | // init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops |
1637 | // GC treats them the same. |
1638 | _init_lock_offset = _component_mirror_offset; |
1639 | |
1640 | CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_Class::_klass_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_Class_klass_enum); java_lang_Class::_array_klass_offset = JavaClasses::compute_injected_offset(JavaClasses::java_lang_Class_array_klass_enum ); java_lang_Class::_oop_size_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_Class_oop_size_enum); java_lang_Class ::_static_oop_field_count_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_Class_static_oop_field_count_enum); java_lang_Class ::_protection_domain_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_Class_protection_domain_enum); java_lang_Class ::_signers_offset = JavaClasses::compute_injected_offset(JavaClasses ::java_lang_Class_signers_enum); java_lang_Class::_source_file_offset = JavaClasses::compute_injected_offset(JavaClasses::java_lang_Class_source_file_enum );; |
1641 | } |
1642 | |
1643 | #if INCLUDE_CDS1 |
1644 | void java_lang_Class::serialize_offsets(SerializeClosure* f) { |
1645 | f->do_bool(&_offsets_computed); |
1646 | f->do_u4((u4*)&_init_lock_offset); |
1647 | |
1648 | CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_classRedefinedCount_offset); f->do_u4 ((u4*)&_class_loader_offset); f->do_u4((u4*)&_component_mirror_offset ); f->do_u4((u4*)&_module_offset); f->do_u4((u4*)& _name_offset); f->do_u4((u4*)&_classData_offset);; |
1649 | |
1650 | CLASS_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_klass_offset); f->do_u4((u4*)&_array_klass_offset ); f->do_u4((u4*)&_oop_size_offset); f->do_u4((u4*) &_static_oop_field_count_offset); f->do_u4((u4*)&_protection_domain_offset ); f->do_u4((u4*)&_signers_offset); f->do_u4((u4*)& _source_file_offset);; |
1651 | } |
1652 | #endif |
1653 | |
1654 | int java_lang_Class::classRedefinedCount(oop the_class_mirror) { |
1655 | assert(_classRedefinedCount_offset != 0, "offsets should have been initialized")do { if (!(_classRedefinedCount_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1655, "assert(" "_classRedefinedCount_offset != 0" ") failed" , "offsets should have been initialized"); ::breakpoint(); } } while (0); |
1656 | return the_class_mirror->int_field(_classRedefinedCount_offset); |
1657 | } |
1658 | |
1659 | void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) { |
1660 | assert(_classRedefinedCount_offset != 0, "offsets should have been initialized")do { if (!(_classRedefinedCount_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1660, "assert(" "_classRedefinedCount_offset != 0" ") failed" , "offsets should have been initialized"); ::breakpoint(); } } while (0); |
1661 | the_class_mirror->int_field_put(_classRedefinedCount_offset, value); |
1662 | } |
1663 | |
1664 | |
1665 | // Note: JDK1.1 and before had a privateInfo_offset field which was used for the |
1666 | // platform thread structure, and a eetop offset which was used for thread |
1667 | // local storage (and unused by the HotSpot VM). In JDK1.2 the two structures |
1668 | // merged, so in the HotSpot VM we just use the eetop field for the thread |
1669 | // instead of the privateInfo_offset. |
1670 | // |
1671 | // Note: The stackSize field is only present starting in 1.4. |
1672 | |
1673 | int java_lang_Thread::_name_offset; |
1674 | int java_lang_Thread::_group_offset; |
1675 | int java_lang_Thread::_contextClassLoader_offset; |
1676 | int java_lang_Thread::_inheritedAccessControlContext_offset; |
1677 | int java_lang_Thread::_priority_offset; |
1678 | int java_lang_Thread::_eetop_offset; |
1679 | int java_lang_Thread::_interrupted_offset; |
1680 | int java_lang_Thread::_daemon_offset; |
1681 | int java_lang_Thread::_stillborn_offset; |
1682 | int java_lang_Thread::_stackSize_offset; |
1683 | int java_lang_Thread::_tid_offset; |
1684 | int java_lang_Thread::_thread_status_offset; |
1685 | int java_lang_Thread::_park_blocker_offset; |
1686 | |
1687 | #define THREAD_FIELDS_DO(macro)macro(_name_offset, k, vmSymbols::name_name(), string_signature , false); macro(_group_offset, k, vmSymbols::group_name(), threadgroup_signature , false); macro(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name (), classloader_signature, false); macro(_inheritedAccessControlContext_offset , k, vmSymbols::inheritedAccessControlContext_name(), accesscontrolcontext_signature , false); macro(_priority_offset, k, vmSymbols::priority_name (), int_signature, false); macro(_daemon_offset, k, vmSymbols ::daemon_name(), bool_signature, false); macro(_eetop_offset, k, "eetop", long_signature, false); macro(_interrupted_offset , k, "interrupted", bool_signature, false); macro(_stillborn_offset , k, "stillborn", bool_signature, false); macro(_stackSize_offset , k, "stackSize", long_signature, false); macro(_tid_offset, k , "tid", long_signature, false); macro(_thread_status_offset, k, "threadStatus", int_signature, false); macro(_park_blocker_offset , k, "parkBlocker", object_signature, false) \ |
1688 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \ |
1689 | macro(_group_offset, k, vmSymbols::group_name(), threadgroup_signature, false); \ |
1690 | macro(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), classloader_signature, false); \ |
1691 | macro(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), accesscontrolcontext_signature, false); \ |
1692 | macro(_priority_offset, k, vmSymbols::priority_name(), int_signature, false); \ |
1693 | macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature, false); \ |
1694 | macro(_eetop_offset, k, "eetop", long_signature, false); \ |
1695 | macro(_interrupted_offset, k, "interrupted", bool_signature, false); \ |
1696 | macro(_stillborn_offset, k, "stillborn", bool_signature, false); \ |
1697 | macro(_stackSize_offset, k, "stackSize", long_signature, false); \ |
1698 | macro(_tid_offset, k, "tid", long_signature, false); \ |
1699 | macro(_thread_status_offset, k, "threadStatus", int_signature, false); \ |
1700 | macro(_park_blocker_offset, k, "parkBlocker", object_signature, false) |
1701 | |
1702 | void java_lang_Thread::compute_offsets() { |
1703 | assert(_group_offset == 0, "offsets should be initialized only once")do { if (!(_group_offset == 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1703, "assert(" "_group_offset == 0" ") failed", "offsets should be initialized only once" ); ::breakpoint(); } } while (0); |
1704 | |
1705 | InstanceKlass* k = vmClasses::Thread_klass(); |
1706 | THREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols ::string_signature(), false); compute_offset(_group_offset, k , vmSymbols::group_name(), vmSymbols::threadgroup_signature() , false); compute_offset(_contextClassLoader_offset, k, vmSymbols ::contextClassLoader_name(), vmSymbols::classloader_signature (), false); compute_offset(_inheritedAccessControlContext_offset , k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols ::accesscontrolcontext_signature(), false); compute_offset(_priority_offset , k, vmSymbols::priority_name(), vmSymbols::int_signature(), false ); compute_offset(_daemon_offset, k, vmSymbols::daemon_name() , vmSymbols::bool_signature(), false); compute_offset(_eetop_offset , k, "eetop", vmSymbols::long_signature(), false); compute_offset (_interrupted_offset, k, "interrupted", vmSymbols::bool_signature (), false); compute_offset(_stillborn_offset, k, "stillborn", vmSymbols::bool_signature(), false); compute_offset(_stackSize_offset , k, "stackSize", vmSymbols::long_signature(), false); compute_offset (_tid_offset, k, "tid", vmSymbols::long_signature(), false); compute_offset (_thread_status_offset, k, "threadStatus", vmSymbols::int_signature (), false); compute_offset(_park_blocker_offset, k, "parkBlocker" , vmSymbols::object_signature(), false); |
1707 | } |
1708 | |
1709 | #if INCLUDE_CDS1 |
1710 | void java_lang_Thread::serialize_offsets(SerializeClosure* f) { |
1711 | THREAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_name_offset); f->do_u4((u4*)&_group_offset ); f->do_u4((u4*)&_contextClassLoader_offset); f->do_u4 ((u4*)&_inheritedAccessControlContext_offset); f->do_u4 ((u4*)&_priority_offset); f->do_u4((u4*)&_daemon_offset ); f->do_u4((u4*)&_eetop_offset); f->do_u4((u4*)& _interrupted_offset); f->do_u4((u4*)&_stillborn_offset ); f->do_u4((u4*)&_stackSize_offset); f->do_u4((u4* )&_tid_offset); f->do_u4((u4*)&_thread_status_offset ); f->do_u4((u4*)&_park_blocker_offset); |
1712 | } |
1713 | #endif |
1714 | |
1715 | JavaThread* java_lang_Thread::thread(oop java_thread) { |
1716 | return (JavaThread*)java_thread->address_field(_eetop_offset); |
1717 | } |
1718 | |
1719 | |
1720 | void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) { |
1721 | java_thread->address_field_put(_eetop_offset, (address)thread); |
1722 | } |
1723 | |
1724 | bool java_lang_Thread::interrupted(oop java_thread) { |
1725 | // Make sure the caller can safely access oops. |
1726 | assert(Thread::current()->is_VM_thread() ||do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1729, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0) |
1727 | (JavaThread::current()->thread_state() != _thread_blocked &&do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1729, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0) |
1728 | JavaThread::current()->thread_state() != _thread_in_native),do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1729, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0) |
1729 | "Unsafe access to oop")do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1729, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0); |
1730 | return java_thread->bool_field_volatile(_interrupted_offset); |
1731 | } |
1732 | |
1733 | void java_lang_Thread::set_interrupted(oop java_thread, bool val) { |
1734 | // Make sure the caller can safely access oops. |
1735 | assert(Thread::current()->is_VM_thread() ||do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1738, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0) |
1736 | (JavaThread::current()->thread_state() != _thread_blocked &&do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1738, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0) |
1737 | JavaThread::current()->thread_state() != _thread_in_native),do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1738, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0) |
1738 | "Unsafe access to oop")do { if (!(Thread::current()->is_VM_thread() || (JavaThread ::current()->thread_state() != _thread_blocked && JavaThread ::current()->thread_state() != _thread_in_native))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1738, "assert(" "Thread::current()->is_VM_thread() || (JavaThread::current()->thread_state() != _thread_blocked && JavaThread::current()->thread_state() != _thread_in_native)" ") failed", "Unsafe access to oop"); ::breakpoint(); } } while (0); |
1739 | java_thread->bool_field_put_volatile(_interrupted_offset, val); |
1740 | } |
1741 | |
1742 | |
1743 | oop java_lang_Thread::name(oop java_thread) { |
1744 | return java_thread->obj_field(_name_offset); |
1745 | } |
1746 | |
1747 | |
1748 | void java_lang_Thread::set_name(oop java_thread, oop name) { |
1749 | java_thread->obj_field_put(_name_offset, name); |
1750 | } |
1751 | |
1752 | |
1753 | ThreadPriority java_lang_Thread::priority(oop java_thread) { |
1754 | return (ThreadPriority)java_thread->int_field(_priority_offset); |
1755 | } |
1756 | |
1757 | |
1758 | void java_lang_Thread::set_priority(oop java_thread, ThreadPriority priority) { |
1759 | java_thread->int_field_put(_priority_offset, priority); |
1760 | } |
1761 | |
1762 | |
1763 | oop java_lang_Thread::threadGroup(oop java_thread) { |
1764 | return java_thread->obj_field(_group_offset); |
1765 | } |
1766 | |
1767 | |
1768 | bool java_lang_Thread::is_stillborn(oop java_thread) { |
1769 | return java_thread->bool_field(_stillborn_offset) != 0; |
1770 | } |
1771 | |
1772 | |
1773 | // We never have reason to turn the stillborn bit off |
1774 | void java_lang_Thread::set_stillborn(oop java_thread) { |
1775 | java_thread->bool_field_put(_stillborn_offset, true); |
1776 | } |
1777 | |
1778 | |
1779 | bool java_lang_Thread::is_alive(oop java_thread) { |
1780 | JavaThread* thr = java_lang_Thread::thread(java_thread); |
1781 | return (thr != NULL__null); |
1782 | } |
1783 | |
1784 | |
1785 | bool java_lang_Thread::is_daemon(oop java_thread) { |
1786 | return java_thread->bool_field(_daemon_offset) != 0; |
1787 | } |
1788 | |
1789 | |
1790 | void java_lang_Thread::set_daemon(oop java_thread) { |
1791 | java_thread->bool_field_put(_daemon_offset, true); |
1792 | } |
1793 | |
1794 | oop java_lang_Thread::context_class_loader(oop java_thread) { |
1795 | return java_thread->obj_field(_contextClassLoader_offset); |
1796 | } |
1797 | |
1798 | oop java_lang_Thread::inherited_access_control_context(oop java_thread) { |
1799 | return java_thread->obj_field(_inheritedAccessControlContext_offset); |
1800 | } |
1801 | |
1802 | |
1803 | jlong java_lang_Thread::stackSize(oop java_thread) { |
1804 | return java_thread->long_field(_stackSize_offset); |
1805 | } |
1806 | |
1807 | // Write the thread status value to threadStatus field in java.lang.Thread java class. |
1808 | void java_lang_Thread::set_thread_status(oop java_thread, |
1809 | JavaThreadStatus status) { |
1810 | java_thread->int_field_put(_thread_status_offset, static_cast<int>(status)); |
1811 | } |
1812 | |
1813 | // Read thread status value from threadStatus field in java.lang.Thread java class. |
1814 | JavaThreadStatus java_lang_Thread::get_thread_status(oop java_thread) { |
1815 | // Make sure the caller is operating on behalf of the VM or is |
1816 | // running VM code (state == _thread_in_vm). |
1817 | assert(Threads_lock->owned_by_self() || Thread::current()->is_VM_thread() ||do { if (!(Threads_lock->owned_by_self() || Thread::current ()->is_VM_thread() || JavaThread::current()->thread_state () == _thread_in_vm)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1819, "assert(" "Threads_lock->owned_by_self() || Thread::current()->is_VM_thread() || JavaThread::current()->thread_state() == _thread_in_vm" ") failed", "Java Thread is not running in vm"); ::breakpoint (); } } while (0) |
1818 | JavaThread::current()->thread_state() == _thread_in_vm,do { if (!(Threads_lock->owned_by_self() || Thread::current ()->is_VM_thread() || JavaThread::current()->thread_state () == _thread_in_vm)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1819, "assert(" "Threads_lock->owned_by_self() || Thread::current()->is_VM_thread() || JavaThread::current()->thread_state() == _thread_in_vm" ") failed", "Java Thread is not running in vm"); ::breakpoint (); } } while (0) |
1819 | "Java Thread is not running in vm")do { if (!(Threads_lock->owned_by_self() || Thread::current ()->is_VM_thread() || JavaThread::current()->thread_state () == _thread_in_vm)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1819, "assert(" "Threads_lock->owned_by_self() || Thread::current()->is_VM_thread() || JavaThread::current()->thread_state() == _thread_in_vm" ") failed", "Java Thread is not running in vm"); ::breakpoint (); } } while (0); |
1820 | return static_cast<JavaThreadStatus>(java_thread->int_field(_thread_status_offset)); |
1821 | } |
1822 | |
1823 | |
1824 | jlong java_lang_Thread::thread_id(oop java_thread) { |
1825 | return java_thread->long_field(_tid_offset); |
1826 | } |
1827 | |
1828 | oop java_lang_Thread::park_blocker(oop java_thread) { |
1829 | return java_thread->obj_field(_park_blocker_offset); |
1830 | } |
1831 | |
1832 | const char* java_lang_Thread::thread_status_name(oop java_thread) { |
1833 | JavaThreadStatus status = static_cast<JavaThreadStatus>(java_thread->int_field(_thread_status_offset)); |
1834 | switch (status) { |
1835 | case JavaThreadStatus::NEW : return "NEW"; |
1836 | case JavaThreadStatus::RUNNABLE : return "RUNNABLE"; |
1837 | case JavaThreadStatus::SLEEPING : return "TIMED_WAITING (sleeping)"; |
1838 | case JavaThreadStatus::IN_OBJECT_WAIT : return "WAITING (on object monitor)"; |
1839 | case JavaThreadStatus::IN_OBJECT_WAIT_TIMED : return "TIMED_WAITING (on object monitor)"; |
1840 | case JavaThreadStatus::PARKED : return "WAITING (parking)"; |
1841 | case JavaThreadStatus::PARKED_TIMED : return "TIMED_WAITING (parking)"; |
1842 | case JavaThreadStatus::BLOCKED_ON_MONITOR_ENTER : return "BLOCKED (on object monitor)"; |
1843 | case JavaThreadStatus::TERMINATED : return "TERMINATED"; |
1844 | default : return "UNKNOWN"; |
1845 | }; |
1846 | } |
1847 | int java_lang_ThreadGroup::_parent_offset; |
1848 | int java_lang_ThreadGroup::_name_offset; |
1849 | int java_lang_ThreadGroup::_threads_offset; |
1850 | int java_lang_ThreadGroup::_groups_offset; |
1851 | int java_lang_ThreadGroup::_maxPriority_offset; |
1852 | int java_lang_ThreadGroup::_destroyed_offset; |
1853 | int java_lang_ThreadGroup::_daemon_offset; |
1854 | int java_lang_ThreadGroup::_nthreads_offset; |
1855 | int java_lang_ThreadGroup::_ngroups_offset; |
1856 | |
1857 | oop java_lang_ThreadGroup::parent(oop java_thread_group) { |
1858 | assert(oopDesc::is_oop(java_thread_group), "thread group must be oop")do { if (!(oopDesc::is_oop(java_thread_group))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1858, "assert(" "oopDesc::is_oop(java_thread_group)" ") failed" , "thread group must be oop"); ::breakpoint(); } } while (0); |
1859 | return java_thread_group->obj_field(_parent_offset); |
1860 | } |
1861 | |
1862 | // ("name as oop" accessor is not necessary) |
1863 | |
1864 | const char* java_lang_ThreadGroup::name(oop java_thread_group) { |
1865 | oop name = java_thread_group->obj_field(_name_offset); |
1866 | // ThreadGroup.name can be null |
1867 | if (name != NULL__null) { |
1868 | return java_lang_String::as_utf8_string(name); |
1869 | } |
1870 | return NULL__null; |
1871 | } |
1872 | |
1873 | int java_lang_ThreadGroup::nthreads(oop java_thread_group) { |
1874 | assert(oopDesc::is_oop(java_thread_group), "thread group must be oop")do { if (!(oopDesc::is_oop(java_thread_group))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1874, "assert(" "oopDesc::is_oop(java_thread_group)" ") failed" , "thread group must be oop"); ::breakpoint(); } } while (0); |
1875 | return java_thread_group->int_field(_nthreads_offset); |
1876 | } |
1877 | |
1878 | objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) { |
1879 | oop threads = java_thread_group->obj_field(_threads_offset); |
1880 | assert(threads != NULL, "threadgroups should have threads")do { if (!(threads != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1880, "assert(" "threads != __null" ") failed", "threadgroups should have threads" ); ::breakpoint(); } } while (0); |
1881 | assert(threads->is_objArray(), "just checking")do { if (!(threads->is_objArray())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1881, "assert(" "threads->is_objArray()" ") failed", "just checking" ); ::breakpoint(); } } while (0); // Todo: Add better type checking code |
1882 | return objArrayOop(threads); |
1883 | } |
1884 | |
1885 | int java_lang_ThreadGroup::ngroups(oop java_thread_group) { |
1886 | assert(oopDesc::is_oop(java_thread_group), "thread group must be oop")do { if (!(oopDesc::is_oop(java_thread_group))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1886, "assert(" "oopDesc::is_oop(java_thread_group)" ") failed" , "thread group must be oop"); ::breakpoint(); } } while (0); |
1887 | return java_thread_group->int_field(_ngroups_offset); |
1888 | } |
1889 | |
1890 | objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) { |
1891 | oop groups = java_thread_group->obj_field(_groups_offset); |
1892 | assert(groups == NULL || groups->is_objArray(), "just checking")do { if (!(groups == __null || groups->is_objArray())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1892, "assert(" "groups == __null || groups->is_objArray()" ") failed", "just checking"); ::breakpoint(); } } while (0); // Todo: Add better type checking code |
1893 | return objArrayOop(groups); |
1894 | } |
1895 | |
1896 | ThreadPriority java_lang_ThreadGroup::maxPriority(oop java_thread_group) { |
1897 | assert(oopDesc::is_oop(java_thread_group), "thread group must be oop")do { if (!(oopDesc::is_oop(java_thread_group))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1897, "assert(" "oopDesc::is_oop(java_thread_group)" ") failed" , "thread group must be oop"); ::breakpoint(); } } while (0); |
1898 | return (ThreadPriority) java_thread_group->int_field(_maxPriority_offset); |
1899 | } |
1900 | |
1901 | bool java_lang_ThreadGroup::is_destroyed(oop java_thread_group) { |
1902 | assert(oopDesc::is_oop(java_thread_group), "thread group must be oop")do { if (!(oopDesc::is_oop(java_thread_group))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1902, "assert(" "oopDesc::is_oop(java_thread_group)" ") failed" , "thread group must be oop"); ::breakpoint(); } } while (0); |
1903 | return java_thread_group->bool_field(_destroyed_offset) != 0; |
1904 | } |
1905 | |
1906 | bool java_lang_ThreadGroup::is_daemon(oop java_thread_group) { |
1907 | assert(oopDesc::is_oop(java_thread_group), "thread group must be oop")do { if (!(oopDesc::is_oop(java_thread_group))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1907, "assert(" "oopDesc::is_oop(java_thread_group)" ") failed" , "thread group must be oop"); ::breakpoint(); } } while (0); |
1908 | return java_thread_group->bool_field(_daemon_offset) != 0; |
1909 | } |
1910 | |
1911 | #define THREADGROUP_FIELDS_DO(macro)macro(_parent_offset, k, vmSymbols::parent_name(), threadgroup_signature , false); macro(_name_offset, k, vmSymbols::name_name(), string_signature , false); macro(_threads_offset, k, vmSymbols::threads_name() , thread_array_signature, false); macro(_groups_offset, k, vmSymbols ::groups_name(), threadgroup_array_signature, false); macro(_maxPriority_offset , k, vmSymbols::maxPriority_name(), int_signature, false); macro (_destroyed_offset, k, vmSymbols::destroyed_name(), bool_signature , false); macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature , false); macro(_nthreads_offset, k, vmSymbols::nthreads_name (), int_signature, false); macro(_ngroups_offset, k, vmSymbols ::ngroups_name(), int_signature, false) \ |
1912 | macro(_parent_offset, k, vmSymbols::parent_name(), threadgroup_signature, false); \ |
1913 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \ |
1914 | macro(_threads_offset, k, vmSymbols::threads_name(), thread_array_signature, false); \ |
1915 | macro(_groups_offset, k, vmSymbols::groups_name(), threadgroup_array_signature, false); \ |
1916 | macro(_maxPriority_offset, k, vmSymbols::maxPriority_name(), int_signature, false); \ |
1917 | macro(_destroyed_offset, k, vmSymbols::destroyed_name(), bool_signature, false); \ |
1918 | macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature, false); \ |
1919 | macro(_nthreads_offset, k, vmSymbols::nthreads_name(), int_signature, false); \ |
1920 | macro(_ngroups_offset, k, vmSymbols::ngroups_name(), int_signature, false) |
1921 | |
1922 | void java_lang_ThreadGroup::compute_offsets() { |
1923 | assert(_parent_offset == 0, "offsets should be initialized only once")do { if (!(_parent_offset == 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 1923, "assert(" "_parent_offset == 0" ") failed", "offsets should be initialized only once" ); ::breakpoint(); } } while (0); |
1924 | |
1925 | InstanceKlass* k = vmClasses::ThreadGroup_klass(); |
1926 | THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_parent_offset, k, vmSymbols::parent_name(), vmSymbols ::threadgroup_signature(), false); compute_offset(_name_offset , k, vmSymbols::name_name(), vmSymbols::string_signature(), false ); compute_offset(_threads_offset, k, vmSymbols::threads_name (), vmSymbols::thread_array_signature(), false); compute_offset (_groups_offset, k, vmSymbols::groups_name(), vmSymbols::threadgroup_array_signature (), false); compute_offset(_maxPriority_offset, k, vmSymbols:: maxPriority_name(), vmSymbols::int_signature(), false); compute_offset (_destroyed_offset, k, vmSymbols::destroyed_name(), vmSymbols ::bool_signature(), false); compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature(), false ); compute_offset(_nthreads_offset, k, vmSymbols::nthreads_name (), vmSymbols::int_signature(), false); compute_offset(_ngroups_offset , k, vmSymbols::ngroups_name(), vmSymbols::int_signature(), false ); |
1927 | } |
1928 | |
1929 | #if INCLUDE_CDS1 |
1930 | void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) { |
1931 | THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_parent_offset); f->do_u4((u4*)& _name_offset); f->do_u4((u4*)&_threads_offset); f-> do_u4((u4*)&_groups_offset); f->do_u4((u4*)&_maxPriority_offset ); f->do_u4((u4*)&_destroyed_offset); f->do_u4((u4* )&_daemon_offset); f->do_u4((u4*)&_nthreads_offset ); f->do_u4((u4*)&_ngroups_offset); |
1932 | } |
1933 | #endif |
1934 | |
1935 | // java_lang_Throwable |
1936 | |
1937 | int java_lang_Throwable::_backtrace_offset; |
1938 | int java_lang_Throwable::_detailMessage_offset; |
1939 | int java_lang_Throwable::_stackTrace_offset; |
1940 | int java_lang_Throwable::_depth_offset; |
1941 | int java_lang_Throwable::_cause_offset; |
1942 | int java_lang_Throwable::_static_unassigned_stacktrace_offset; |
1943 | |
1944 | #define THROWABLE_FIELDS_DO(macro)macro(_backtrace_offset, k, "backtrace", object_signature, false ); macro(_detailMessage_offset, k, "detailMessage", string_signature , false); macro(_stackTrace_offset, k, "stackTrace", java_lang_StackTraceElement_array , false); macro(_depth_offset, k, "depth", int_signature, false ); macro(_cause_offset, k, "cause", throwable_signature, false ); macro(_static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK" , java_lang_StackTraceElement_array, true) \ |
1945 | macro(_backtrace_offset, k, "backtrace", object_signature, false); \ |
1946 | macro(_detailMessage_offset, k, "detailMessage", string_signature, false); \ |
1947 | macro(_stackTrace_offset, k, "stackTrace", java_lang_StackTraceElement_array, false); \ |
1948 | macro(_depth_offset, k, "depth", int_signature, false); \ |
1949 | macro(_cause_offset, k, "cause", throwable_signature, false); \ |
1950 | macro(_static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK", java_lang_StackTraceElement_array, true) |
1951 | |
1952 | void java_lang_Throwable::compute_offsets() { |
1953 | InstanceKlass* k = vmClasses::Throwable_klass(); |
1954 | THROWABLE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_backtrace_offset, k, "backtrace", vmSymbols:: object_signature(), false); compute_offset(_detailMessage_offset , k, "detailMessage", vmSymbols::string_signature(), false); compute_offset (_stackTrace_offset, k, "stackTrace", vmSymbols::java_lang_StackTraceElement_array (), false); compute_offset(_depth_offset, k, "depth", vmSymbols ::int_signature(), false); compute_offset(_cause_offset, k, "cause" , vmSymbols::throwable_signature(), false); compute_offset(_static_unassigned_stacktrace_offset , k, "UNASSIGNED_STACK", vmSymbols::java_lang_StackTraceElement_array (), true); |
1955 | } |
1956 | |
1957 | #if INCLUDE_CDS1 |
1958 | void java_lang_Throwable::serialize_offsets(SerializeClosure* f) { |
1959 | THROWABLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_backtrace_offset); f->do_u4((u4*)& _detailMessage_offset); f->do_u4((u4*)&_stackTrace_offset ); f->do_u4((u4*)&_depth_offset); f->do_u4((u4*)& _cause_offset); f->do_u4((u4*)&_static_unassigned_stacktrace_offset ); |
1960 | } |
1961 | #endif |
1962 | |
1963 | oop java_lang_Throwable::unassigned_stacktrace() { |
1964 | InstanceKlass* ik = vmClasses::Throwable_klass(); |
1965 | oop base = ik->static_field_base_raw(); |
1966 | return base->obj_field(_static_unassigned_stacktrace_offset); |
1967 | } |
1968 | |
1969 | oop java_lang_Throwable::backtrace(oop throwable) { |
1970 | return throwable->obj_field_acquire(_backtrace_offset); |
1971 | } |
1972 | |
1973 | |
1974 | void java_lang_Throwable::set_backtrace(oop throwable, oop value) { |
1975 | throwable->release_obj_field_put(_backtrace_offset, value); |
1976 | } |
1977 | |
1978 | int java_lang_Throwable::depth(oop throwable) { |
1979 | return throwable->int_field(_depth_offset); |
1980 | } |
1981 | |
1982 | void java_lang_Throwable::set_depth(oop throwable, int value) { |
1983 | throwable->int_field_put(_depth_offset, value); |
1984 | } |
1985 | |
1986 | oop java_lang_Throwable::message(oop throwable) { |
1987 | return throwable->obj_field(_detailMessage_offset); |
1988 | } |
1989 | |
1990 | oop java_lang_Throwable::cause(oop throwable) { |
1991 | return throwable->obj_field(_cause_offset); |
1992 | } |
1993 | |
1994 | // Return Symbol for detailed_message or NULL |
1995 | Symbol* java_lang_Throwable::detail_message(oop throwable) { |
1996 | PreserveExceptionMark pm(Thread::current()); |
1997 | oop detailed_message = java_lang_Throwable::message(throwable); |
1998 | if (detailed_message != NULL__null) { |
1999 | return java_lang_String::as_symbol(detailed_message); |
2000 | } |
2001 | return NULL__null; |
2002 | } |
2003 | |
2004 | void java_lang_Throwable::set_message(oop throwable, oop value) { |
2005 | throwable->obj_field_put(_detailMessage_offset, value); |
2006 | } |
2007 | |
2008 | |
2009 | void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) { |
2010 | throwable->obj_field_put(_stackTrace_offset, st_element_array); |
2011 | } |
2012 | |
2013 | void java_lang_Throwable::clear_stacktrace(oop throwable) { |
2014 | set_stacktrace(throwable, NULL__null); |
2015 | } |
2016 | |
2017 | |
2018 | void java_lang_Throwable::print(oop throwable, outputStream* st) { |
2019 | ResourceMark rm; |
2020 | Klass* k = throwable->klass(); |
2021 | assert(k != NULL, "just checking")do { if (!(k != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2021, "assert(" "k != __null" ") failed", "just checking"); ::breakpoint(); } } while (0); |
2022 | st->print("%s", k->external_name()); |
2023 | oop msg = message(throwable); |
2024 | if (msg != NULL__null) { |
2025 | st->print(": %s", java_lang_String::as_utf8_string(msg)); |
2026 | } |
2027 | } |
2028 | |
2029 | // After this many redefines, the stack trace is unreliable. |
2030 | const int MAX_VERSION = USHRT_MAX(32767 *2 +1); |
2031 | |
2032 | static inline bool version_matches(Method* method, int version) { |
2033 | assert(version < MAX_VERSION, "version is too big")do { if (!(version < MAX_VERSION)) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2033, "assert(" "version < MAX_VERSION" ") failed", "version is too big" ); ::breakpoint(); } } while (0); |
2034 | return method != NULL__null && (method->constants()->version() == version); |
2035 | } |
2036 | |
2037 | // This class provides a simple wrapper over the internal structure of |
2038 | // exception backtrace to insulate users of the backtrace from needing |
2039 | // to know what it looks like. |
2040 | // The code of this class is not GC safe. Allocations can only happen |
2041 | // in expand(). |
2042 | class BacktraceBuilder: public StackObj { |
2043 | friend class BacktraceIterator; |
2044 | private: |
2045 | Handle _backtrace; |
2046 | objArrayOop _head; |
2047 | typeArrayOop _methods; |
2048 | typeArrayOop _bcis; |
2049 | objArrayOop _mirrors; |
2050 | typeArrayOop _names; // Needed to insulate method name against redefinition. |
2051 | // True if the top frame of the backtrace is omitted because it shall be hidden. |
2052 | bool _has_hidden_top_frame; |
2053 | int _index; |
2054 | NoSafepointVerifier _nsv; |
2055 | |
2056 | enum { |
2057 | trace_methods_offset = java_lang_Throwable::trace_methods_offset, |
2058 | trace_bcis_offset = java_lang_Throwable::trace_bcis_offset, |
2059 | trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset, |
2060 | trace_names_offset = java_lang_Throwable::trace_names_offset, |
2061 | trace_next_offset = java_lang_Throwable::trace_next_offset, |
2062 | trace_hidden_offset = java_lang_Throwable::trace_hidden_offset, |
2063 | trace_size = java_lang_Throwable::trace_size, |
2064 | trace_chunk_size = java_lang_Throwable::trace_chunk_size |
2065 | }; |
2066 | |
2067 | // get info out of chunks |
2068 | static typeArrayOop get_methods(objArrayHandle chunk) { |
2069 | typeArrayOop methods = typeArrayOop(chunk->obj_at(trace_methods_offset)); |
2070 | assert(methods != NULL, "method array should be initialized in backtrace")do { if (!(methods != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2070, "assert(" "methods != __null" ") failed", "method array should be initialized in backtrace" ); ::breakpoint(); } } while (0); |
2071 | return methods; |
2072 | } |
2073 | static typeArrayOop get_bcis(objArrayHandle chunk) { |
2074 | typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset)); |
2075 | assert(bcis != NULL, "bci array should be initialized in backtrace")do { if (!(bcis != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2075, "assert(" "bcis != __null" ") failed", "bci array should be initialized in backtrace" ); ::breakpoint(); } } while (0); |
2076 | return bcis; |
2077 | } |
2078 | static objArrayOop get_mirrors(objArrayHandle chunk) { |
2079 | objArrayOop mirrors = objArrayOop(chunk->obj_at(trace_mirrors_offset)); |
2080 | assert(mirrors != NULL, "mirror array should be initialized in backtrace")do { if (!(mirrors != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2080, "assert(" "mirrors != __null" ") failed", "mirror array should be initialized in backtrace" ); ::breakpoint(); } } while (0); |
2081 | return mirrors; |
2082 | } |
2083 | static typeArrayOop get_names(objArrayHandle chunk) { |
2084 | typeArrayOop names = typeArrayOop(chunk->obj_at(trace_names_offset)); |
2085 | assert(names != NULL, "names array should be initialized in backtrace")do { if (!(names != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2085, "assert(" "names != __null" ") failed", "names array should be initialized in backtrace" ); ::breakpoint(); } } while (0); |
2086 | return names; |
2087 | } |
2088 | static bool has_hidden_top_frame(objArrayHandle chunk) { |
2089 | oop hidden = chunk->obj_at(trace_hidden_offset); |
2090 | return hidden != NULL__null; |
2091 | } |
2092 | |
2093 | public: |
2094 | |
2095 | // constructor for new backtrace |
2096 | BacktraceBuilder(TRAPSJavaThread* __the_thread__): _head(NULL__null), _methods(NULL__null), _bcis(NULL__null), _mirrors(NULL__null), _names(NULL__null), _has_hidden_top_frame(false) { |
2097 | expand(CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2098 | _backtrace = Handle(THREAD__the_thread__, _head); |
2099 | _index = 0; |
2100 | } |
2101 | |
2102 | BacktraceBuilder(Thread* thread, objArrayHandle backtrace) { |
2103 | _methods = get_methods(backtrace); |
2104 | _bcis = get_bcis(backtrace); |
2105 | _mirrors = get_mirrors(backtrace); |
2106 | _names = get_names(backtrace); |
2107 | _has_hidden_top_frame = has_hidden_top_frame(backtrace); |
2108 | assert(_methods->length() == _bcis->length() &&do { if (!(_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors ->length() == _names->length())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2111, "assert(" "_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors->length() == _names->length()" ") failed", "method and source information arrays should match" ); ::breakpoint(); } } while (0) |
2109 | _methods->length() == _mirrors->length() &&do { if (!(_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors ->length() == _names->length())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2111, "assert(" "_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors->length() == _names->length()" ") failed", "method and source information arrays should match" ); ::breakpoint(); } } while (0) |
2110 | _mirrors->length() == _names->length(),do { if (!(_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors ->length() == _names->length())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2111, "assert(" "_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors->length() == _names->length()" ") failed", "method and source information arrays should match" ); ::breakpoint(); } } while (0) |
2111 | "method and source information arrays should match")do { if (!(_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors ->length() == _names->length())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2111, "assert(" "_methods->length() == _bcis->length() && _methods->length() == _mirrors->length() && _mirrors->length() == _names->length()" ") failed", "method and source information arrays should match" ); ::breakpoint(); } } while (0); |
2112 | |
2113 | // head is the preallocated backtrace |
2114 | _head = backtrace(); |
2115 | _backtrace = Handle(thread, _head); |
2116 | _index = 0; |
2117 | } |
2118 | |
2119 | void expand(TRAPSJavaThread* __the_thread__) { |
2120 | objArrayHandle old_head(THREAD__the_thread__, _head); |
2121 | PauseNoSafepointVerifier pnsv(&_nsv); |
2122 | |
2123 | objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2124 | objArrayHandle new_head(THREAD__the_thread__, head); |
2125 | |
2126 | typeArrayOop methods = oopFactory::new_shortArray(trace_chunk_size, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2127 | typeArrayHandle new_methods(THREAD__the_thread__, methods); |
2128 | |
2129 | typeArrayOop bcis = oopFactory::new_intArray(trace_chunk_size, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2130 | typeArrayHandle new_bcis(THREAD__the_thread__, bcis); |
2131 | |
2132 | objArrayOop mirrors = oopFactory::new_objectArray(trace_chunk_size, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2133 | objArrayHandle new_mirrors(THREAD__the_thread__, mirrors); |
2134 | |
2135 | typeArrayOop names = oopFactory::new_symbolArray(trace_chunk_size, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2136 | typeArrayHandle new_names(THREAD__the_thread__, names); |
2137 | |
2138 | if (!old_head.is_null()) { |
2139 | old_head->obj_at_put(trace_next_offset, new_head()); |
2140 | } |
2141 | new_head->obj_at_put(trace_methods_offset, new_methods()); |
2142 | new_head->obj_at_put(trace_bcis_offset, new_bcis()); |
2143 | new_head->obj_at_put(trace_mirrors_offset, new_mirrors()); |
2144 | new_head->obj_at_put(trace_names_offset, new_names()); |
2145 | new_head->obj_at_put(trace_hidden_offset, NULL__null); |
2146 | |
2147 | _head = new_head(); |
2148 | _methods = new_methods(); |
2149 | _bcis = new_bcis(); |
2150 | _mirrors = new_mirrors(); |
2151 | _names = new_names(); |
2152 | _index = 0; |
2153 | } |
2154 | |
2155 | oop backtrace() { |
2156 | return _backtrace(); |
2157 | } |
2158 | |
2159 | inline void push(Method* method, int bci, TRAPSJavaThread* __the_thread__) { |
2160 | // Smear the -1 bci to 0 since the array only holds unsigned |
2161 | // shorts. The later line number lookup would just smear the -1 |
2162 | // to a 0 even if it could be recorded. |
2163 | if (bci == SynchronizationEntryBCI) bci = 0; |
2164 | |
2165 | if (_index >= trace_chunk_size) { |
2166 | methodHandle mhandle(THREAD__the_thread__, method); |
2167 | expand(CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2168 | method = mhandle(); |
2169 | } |
2170 | |
2171 | _methods->ushort_at_put(_index, method->orig_method_idnum()); |
2172 | _bcis->int_at_put(_index, Backtrace::merge_bci_and_version(bci, method->constants()->version())); |
2173 | |
2174 | // Note:this doesn't leak symbols because the mirror in the backtrace keeps the |
2175 | // klass owning the symbols alive so their refcounts aren't decremented. |
2176 | Symbol* name = method->name(); |
2177 | _names->symbol_at_put(_index, name); |
2178 | |
2179 | // We need to save the mirrors in the backtrace to keep the class |
2180 | // from being unloaded while we still have this stack trace. |
2181 | assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror")do { if (!(method->method_holder()->java_mirror() != __null )) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2181, "assert(" "method->method_holder()->java_mirror() != __null" ") failed", "never push null for mirror"); ::breakpoint(); } } while (0); |
2182 | _mirrors->obj_at_put(_index, method->method_holder()->java_mirror()); |
2183 | _index++; |
2184 | } |
2185 | |
2186 | void set_has_hidden_top_frame() { |
2187 | if (!_has_hidden_top_frame) { |
2188 | // It would be nice to add java/lang/Boolean::TRUE here |
2189 | // to indicate that this backtrace has a hidden top frame. |
2190 | // But this code is used before TRUE is allocated. |
2191 | // Therefore let's just use an arbitrary legal oop |
2192 | // available right here. _methods is a short[]. |
2193 | assert(_methods != NULL, "we need a legal oop")do { if (!(_methods != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2193, "assert(" "_methods != __null" ") failed", "we need a legal oop" ); ::breakpoint(); } } while (0); |
2194 | _has_hidden_top_frame = true; |
2195 | _head->obj_at_put(trace_hidden_offset, _methods); |
2196 | } |
2197 | } |
2198 | }; |
2199 | |
2200 | struct BacktraceElement : public StackObj { |
2201 | int _method_id; |
2202 | int _bci; |
2203 | int _version; |
2204 | Symbol* _name; |
2205 | Handle _mirror; |
2206 | BacktraceElement(Handle mirror, int mid, int version, int bci, Symbol* name) : |
2207 | _method_id(mid), _bci(bci), _version(version), _name(name), _mirror(mirror) {} |
2208 | }; |
2209 | |
2210 | class BacktraceIterator : public StackObj { |
2211 | int _index; |
2212 | objArrayHandle _result; |
2213 | objArrayHandle _mirrors; |
2214 | typeArrayHandle _methods; |
2215 | typeArrayHandle _bcis; |
2216 | typeArrayHandle _names; |
2217 | |
2218 | void init(objArrayHandle result, Thread* thread) { |
2219 | // Get method id, bci, version and mirror from chunk |
2220 | _result = result; |
2221 | if (_result.not_null()) { |
2222 | _methods = typeArrayHandle(thread, BacktraceBuilder::get_methods(_result)); |
2223 | _bcis = typeArrayHandle(thread, BacktraceBuilder::get_bcis(_result)); |
2224 | _mirrors = objArrayHandle(thread, BacktraceBuilder::get_mirrors(_result)); |
2225 | _names = typeArrayHandle(thread, BacktraceBuilder::get_names(_result)); |
2226 | _index = 0; |
2227 | } |
2228 | } |
2229 | public: |
2230 | BacktraceIterator(objArrayHandle result, Thread* thread) { |
2231 | init(result, thread); |
2232 | assert(_methods.is_null() || _methods->length() == java_lang_Throwable::trace_chunk_size, "lengths don't match")do { if (!(_methods.is_null() || _methods->length() == java_lang_Throwable ::trace_chunk_size)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2232, "assert(" "_methods.is_null() || _methods->length() == java_lang_Throwable::trace_chunk_size" ") failed", "lengths don't match"); ::breakpoint(); } } while (0); |
2233 | } |
2234 | |
2235 | BacktraceElement next(Thread* thread) { |
2236 | BacktraceElement e (Handle(thread, _mirrors->obj_at(_index)), |
2237 | _methods->ushort_at(_index), |
2238 | Backtrace::version_at(_bcis->int_at(_index)), |
2239 | Backtrace::bci_at(_bcis->int_at(_index)), |
2240 | _names->symbol_at(_index)); |
2241 | _index++; |
2242 | |
2243 | if (_index >= java_lang_Throwable::trace_chunk_size) { |
2244 | int next_offset = java_lang_Throwable::trace_next_offset; |
2245 | // Get next chunk |
2246 | objArrayHandle result (thread, objArrayOop(_result->obj_at(next_offset))); |
2247 | init(result, thread); |
2248 | } |
2249 | return e; |
2250 | } |
2251 | |
2252 | bool repeat() { |
2253 | return _result.not_null() && _mirrors->obj_at(_index) != NULL__null; |
2254 | } |
2255 | }; |
2256 | |
2257 | |
2258 | // Print stack trace element to resource allocated buffer |
2259 | static void print_stack_element_to_stream(outputStream* st, Handle mirror, int method_id, |
2260 | int version, int bci, Symbol* name) { |
2261 | ResourceMark rm; |
2262 | |
2263 | // Get strings and string lengths |
2264 | InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); |
2265 | const char* klass_name = holder->external_name(); |
2266 | int buf_len = (int)strlen(klass_name); |
2267 | |
2268 | char* method_name = name->as_C_string(); |
2269 | buf_len += (int)strlen(method_name); |
2270 | |
2271 | char* source_file_name = NULL__null; |
2272 | Symbol* source = Backtrace::get_source_file_name(holder, version); |
2273 | if (source != NULL__null) { |
2274 | source_file_name = source->as_C_string(); |
2275 | buf_len += (int)strlen(source_file_name); |
2276 | } |
2277 | |
2278 | char *module_name = NULL__null, *module_version = NULL__null; |
2279 | ModuleEntry* module = holder->module(); |
2280 | if (module->is_named()) { |
2281 | module_name = module->name()->as_C_string(); |
2282 | buf_len += (int)strlen(module_name); |
2283 | if (module->version() != NULL__null) { |
2284 | module_version = module->version()->as_C_string(); |
2285 | buf_len += (int)strlen(module_version); |
2286 | } |
2287 | } |
2288 | |
2289 | // Allocate temporary buffer with extra space for formatting and line number |
2290 | char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64)(char*) resource_allocate_bytes((buf_len + 64) * sizeof(char) ); |
2291 | |
2292 | // Print stack trace line in buffer |
2293 | sprintf(buf, "\tat %s.%s(", klass_name, method_name); |
2294 | |
2295 | // Print module information |
2296 | if (module_name != NULL__null) { |
2297 | if (module_version != NULL__null) { |
2298 | sprintf(buf + (int)strlen(buf), "%s@%s/", module_name, module_version); |
2299 | } else { |
2300 | sprintf(buf + (int)strlen(buf), "%s/", module_name); |
2301 | } |
2302 | } |
2303 | |
2304 | // The method can be NULL if the requested class version is gone |
2305 | Method* method = holder->method_with_orig_idnum(method_id, version); |
2306 | if (!version_matches(method, version)) { |
2307 | strcat(buf, "Redefined)"); |
2308 | } else { |
2309 | int line_number = Backtrace::get_line_number(method, bci); |
2310 | if (line_number == -2) { |
2311 | strcat(buf, "Native Method)"); |
2312 | } else { |
2313 | if (source_file_name != NULL__null && (line_number != -1)) { |
2314 | // Sourcename and linenumber |
2315 | sprintf(buf + (int)strlen(buf), "%s:%d)", source_file_name, line_number); |
2316 | } else if (source_file_name != NULL__null) { |
2317 | // Just sourcename |
2318 | sprintf(buf + (int)strlen(buf), "%s)", source_file_name); |
2319 | } else { |
2320 | // Neither sourcename nor linenumber |
2321 | sprintf(buf + (int)strlen(buf), "Unknown Source)"); |
2322 | } |
2323 | CompiledMethod* nm = method->code(); |
2324 | if (WizardMode && nm != NULL__null) { |
2325 | sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT"0x%016" "l" "x" ")", (intptr_t)nm); |
2326 | } |
2327 | } |
2328 | } |
2329 | |
2330 | st->print_cr("%s", buf); |
2331 | } |
2332 | |
2333 | void java_lang_Throwable::print_stack_element(outputStream *st, Method* method, int bci) { |
2334 | Handle mirror (Thread::current(), method->method_holder()->java_mirror()); |
2335 | int method_id = method->orig_method_idnum(); |
2336 | int version = method->constants()->version(); |
2337 | print_stack_element_to_stream(st, mirror, method_id, version, bci, method->name()); |
2338 | } |
2339 | |
2340 | /** |
2341 | * Print the throwable message and its stack trace plus all causes by walking the |
2342 | * cause chain. The output looks the same as of Throwable.printStackTrace(). |
2343 | */ |
2344 | void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st) { |
2345 | // First, print the message. |
2346 | print(throwable(), st); |
2347 | st->cr(); |
2348 | |
2349 | // Now print the stack trace. |
2350 | JavaThread* THREAD__the_thread__ = JavaThread::current(); // For exception macros. |
2351 | while (throwable.not_null()) { |
2352 | objArrayHandle result (THREAD__the_thread__, objArrayOop(backtrace(throwable()))); |
2353 | if (result.is_null()) { |
2354 | st->print_raw_cr("\t<<no stack trace available>>"); |
2355 | return; |
2356 | } |
2357 | BacktraceIterator iter(result, THREAD__the_thread__); |
2358 | |
2359 | while (iter.repeat()) { |
2360 | BacktraceElement bte = iter.next(THREAD__the_thread__); |
2361 | print_stack_element_to_stream(st, bte._mirror, bte._method_id, bte._version, bte._bci, bte._name); |
2362 | } |
2363 | { |
2364 | // Call getCause() which doesn't necessarily return the _cause field. |
2365 | ExceptionMark em(THREAD__the_thread__); |
2366 | JavaValue cause(T_OBJECT); |
2367 | JavaCalls::call_virtual(&cause, |
2368 | throwable, |
2369 | throwable->klass(), |
2370 | vmSymbols::getCause_name(), |
2371 | vmSymbols::void_throwable_signature(), |
2372 | THREAD__the_thread__); |
2373 | // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM. |
2374 | if (HAS_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->has_pending_exception())) { |
2375 | CLEAR_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->clear_pending_exception( )); |
2376 | throwable = Handle(); |
2377 | } else { |
2378 | throwable = Handle(THREAD__the_thread__, cause.get_oop()); |
2379 | if (throwable.not_null()) { |
2380 | st->print("Caused by: "); |
2381 | print(throwable(), st); |
2382 | st->cr(); |
2383 | } |
2384 | } |
2385 | } |
2386 | } |
2387 | } |
2388 | |
2389 | /** |
2390 | * Print the throwable stack trace by calling the Java method java.lang.Throwable.printStackTrace(). |
2391 | */ |
2392 | void java_lang_Throwable::java_printStackTrace(Handle throwable, TRAPSJavaThread* __the_thread__) { |
2393 | assert(throwable->is_a(vmClasses::Throwable_klass()), "Throwable instance expected")do { if (!(throwable->is_a(vmClasses::Throwable_klass()))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2393, "assert(" "throwable->is_a(vmClasses::Throwable_klass())" ") failed", "Throwable instance expected"); ::breakpoint(); } } while (0); |
2394 | JavaValue result(T_VOID); |
2395 | JavaCalls::call_virtual(&result, |
2396 | throwable, |
2397 | vmClasses::Throwable_klass(), |
2398 | vmSymbols::printStackTrace_name(), |
2399 | vmSymbols::void_method_signature(), |
2400 | THREAD__the_thread__); |
2401 | } |
2402 | |
2403 | void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPSJavaThread* __the_thread__) { |
2404 | if (!StackTraceInThrowable) return; |
2405 | ResourceMark rm(THREAD__the_thread__); |
2406 | |
2407 | // Start out by clearing the backtrace for this object, in case the VM |
2408 | // runs out of memory while allocating the stack trace |
2409 | set_backtrace(throwable(), NULL__null); |
2410 | // Clear lazily constructed Java level stacktrace if refilling occurs |
2411 | // This is unnecessary in 1.7+ but harmless |
2412 | clear_stacktrace(throwable()); |
2413 | |
2414 | int max_depth = MaxJavaStackTraceDepth; |
2415 | JavaThread* thread = THREAD__the_thread__; |
2416 | |
2417 | BacktraceBuilder bt(CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2418 | |
2419 | // If there is no Java frame just return the method that was being called |
2420 | // with bci 0 |
2421 | if (!thread->has_last_Java_frame()) { |
2422 | if (max_depth >= 1 && method() != NULL__null) { |
2423 | bt.push(method(), 0, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2424 | log_info(stacktrace)(!(LogImpl<(LogTag::_stacktrace), (LogTag::__NO_TAG), (LogTag ::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag:: __NO_TAG)>::is_level(LogLevel::Info))) ? (void)0 : LogImpl <(LogTag::_stacktrace), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::write<LogLevel::Info>("%s, %d", throwable->klass()->external_name(), 1); |
2425 | set_depth(throwable(), 1); |
2426 | set_backtrace(throwable(), bt.backtrace()); |
2427 | } |
2428 | return; |
2429 | } |
2430 | |
2431 | // Instead of using vframe directly, this version of fill_in_stack_trace |
2432 | // basically handles everything by hand. This significantly improved the |
2433 | // speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows. |
2434 | // See bug 6333838 for more details. |
2435 | // The "ASSERT" here is to verify this method generates the exactly same stack |
2436 | // trace as utilizing vframe. |
2437 | #ifdef ASSERT1 |
2438 | vframeStream st(thread, false /* stop_at_java_call_stub */, false /* process_frames */); |
2439 | #endif |
2440 | int total_count = 0; |
2441 | RegisterMap map(thread, false /* update */, false /* process_frames */); |
2442 | int decode_offset = 0; |
2443 | CompiledMethod* nm = NULL__null; |
2444 | bool skip_fillInStackTrace_check = false; |
2445 | bool skip_throwableInit_check = false; |
2446 | bool skip_hidden = !ShowHiddenFrames; |
2447 | |
2448 | for (frame fr = thread->last_frame(); max_depth == 0 || max_depth != total_count;) { |
2449 | Method* method = NULL__null; |
2450 | int bci = 0; |
2451 | |
2452 | // Compiled java method case. |
2453 | if (decode_offset != 0) { |
2454 | DebugInfoReadStream stream(nm, decode_offset); |
2455 | decode_offset = stream.read_int(); |
2456 | method = (Method*)nm->metadata_at(stream.read_int()); |
2457 | bci = stream.read_bci(); |
2458 | } else { |
2459 | if (fr.is_first_frame()) break; |
2460 | address pc = fr.pc(); |
2461 | if (fr.is_interpreted_frame()) { |
2462 | address bcp = fr.interpreter_frame_bcp(); |
2463 | method = fr.interpreter_frame_method(); |
2464 | bci = method->bci_from(bcp); |
2465 | fr = fr.sender(&map); |
2466 | } else { |
2467 | CodeBlob* cb = fr.cb(); |
2468 | // HMMM QQQ might be nice to have frame return nm as NULL if cb is non-NULL |
2469 | // but non nmethod |
2470 | fr = fr.sender(&map); |
2471 | if (cb == NULL__null || !cb->is_compiled()) { |
2472 | continue; |
2473 | } |
2474 | nm = cb->as_compiled_method(); |
2475 | if (nm->method()->is_native()) { |
2476 | method = nm->method(); |
2477 | bci = 0; |
2478 | } else { |
2479 | PcDesc* pd = nm->pc_desc_at(pc); |
2480 | decode_offset = pd->scope_decode_offset(); |
2481 | // if decode_offset is not equal to 0, it will execute the |
2482 | // "compiled java method case" at the beginning of the loop. |
2483 | continue; |
2484 | } |
2485 | } |
2486 | } |
2487 | #ifdef ASSERT1 |
2488 | assert(st.method() == method && st.bci() == bci,do { if (!(st.method() == method && st.bci() == bci)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2489, "assert(" "st.method() == method && st.bci() == bci" ") failed", "Wrong stack trace"); ::breakpoint(); } } while ( 0) |
2489 | "Wrong stack trace")do { if (!(st.method() == method && st.bci() == bci)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2489, "assert(" "st.method() == method && st.bci() == bci" ") failed", "Wrong stack trace"); ::breakpoint(); } } while ( 0); |
2490 | st.next(); |
2491 | #endif |
2492 | |
2493 | // the format of the stacktrace will be: |
2494 | // - 1 or more fillInStackTrace frames for the exception class (skipped) |
2495 | // - 0 or more <init> methods for the exception class (skipped) |
2496 | // - rest of the stack |
2497 | |
2498 | if (!skip_fillInStackTrace_check) { |
2499 | if (method->name() == vmSymbols::fillInStackTrace_name() && |
2500 | throwable->is_a(method->method_holder())) { |
2501 | continue; |
2502 | } |
2503 | else { |
2504 | skip_fillInStackTrace_check = true; // gone past them all |
2505 | } |
2506 | } |
2507 | if (!skip_throwableInit_check) { |
2508 | assert(skip_fillInStackTrace_check, "logic error in backtrace filtering")do { if (!(skip_fillInStackTrace_check)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2508, "assert(" "skip_fillInStackTrace_check" ") failed", "logic error in backtrace filtering" ); ::breakpoint(); } } while (0); |
2509 | |
2510 | // skip <init> methods of the exception class and superclasses |
2511 | // This is simlar to classic VM. |
2512 | if (method->name() == vmSymbols::object_initializer_name() && |
2513 | throwable->is_a(method->method_holder())) { |
2514 | continue; |
2515 | } else { |
2516 | // there are none or we've seen them all - either way stop checking |
2517 | skip_throwableInit_check = true; |
2518 | } |
2519 | } |
2520 | if (method->is_hidden()) { |
2521 | if (skip_hidden) { |
2522 | if (total_count == 0) { |
2523 | // The top frame will be hidden from the stack trace. |
2524 | bt.set_has_hidden_top_frame(); |
2525 | } |
2526 | continue; |
2527 | } |
2528 | } |
2529 | bt.push(method, bci, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2530 | total_count++; |
2531 | } |
2532 | |
2533 | log_info(stacktrace)(!(LogImpl<(LogTag::_stacktrace), (LogTag::__NO_TAG), (LogTag ::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag:: __NO_TAG)>::is_level(LogLevel::Info))) ? (void)0 : LogImpl <(LogTag::_stacktrace), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::write<LogLevel::Info>("%s, %d", throwable->klass()->external_name(), total_count); |
2534 | |
2535 | // Put completed stack trace into throwable object |
2536 | set_backtrace(throwable(), bt.backtrace()); |
2537 | set_depth(throwable(), total_count); |
2538 | } |
2539 | |
2540 | void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method) { |
2541 | // No-op if stack trace is disabled |
2542 | if (!StackTraceInThrowable) { |
2543 | return; |
2544 | } |
2545 | |
2546 | // Disable stack traces for some preallocated out of memory errors |
2547 | if (!Universe::should_fill_in_stack_trace(throwable)) { |
2548 | return; |
2549 | } |
2550 | |
2551 | JavaThread* THREAD__the_thread__ = JavaThread::current(); // For exception macros. |
2552 | PreserveExceptionMark pm(THREAD__the_thread__); |
2553 | |
2554 | fill_in_stack_trace(throwable, method, THREAD__the_thread__); |
2555 | // Ignore exceptions thrown during stack trace filling (OOM) and reinstall the |
2556 | // original exception via the PreserveExceptionMark destructor. |
2557 | CLEAR_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->clear_pending_exception( )); |
2558 | } |
2559 | |
2560 | void java_lang_Throwable::allocate_backtrace(Handle throwable, TRAPSJavaThread* __the_thread__) { |
2561 | // Allocate stack trace - backtrace is created but not filled in |
2562 | |
2563 | // No-op if stack trace is disabled |
2564 | if (!StackTraceInThrowable) return; |
2565 | BacktraceBuilder bt(CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); // creates a backtrace |
2566 | set_backtrace(throwable(), bt.backtrace()); |
2567 | } |
2568 | |
2569 | |
2570 | void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) { |
2571 | // Fill in stack trace into preallocated backtrace (no GC) |
2572 | |
2573 | // No-op if stack trace is disabled |
2574 | if (!StackTraceInThrowable) return; |
2575 | |
2576 | assert(throwable->is_a(vmClasses::Throwable_klass()), "sanity check")do { if (!(throwable->is_a(vmClasses::Throwable_klass()))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2576, "assert(" "throwable->is_a(vmClasses::Throwable_klass())" ") failed", "sanity check"); ::breakpoint(); } } while (0); |
2577 | |
2578 | JavaThread* THREAD__the_thread__ = JavaThread::current(); // For exception macros. |
2579 | |
2580 | objArrayHandle backtrace (THREAD__the_thread__, (objArrayOop)java_lang_Throwable::backtrace(throwable())); |
2581 | assert(backtrace.not_null(), "backtrace should have been preallocated")do { if (!(backtrace.not_null())) { (*g_assert_poison) = 'X'; ; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2581, "assert(" "backtrace.not_null()" ") failed", "backtrace should have been preallocated" ); ::breakpoint(); } } while (0); |
2582 | |
2583 | ResourceMark rm(THREAD__the_thread__); |
2584 | vframeStream st(THREAD__the_thread__, false /* stop_at_java_call_stub */, false /* process_frames */); |
2585 | |
2586 | BacktraceBuilder bt(THREAD__the_thread__, backtrace); |
2587 | |
2588 | // Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init |
2589 | // methods as preallocated errors aren't created by "java" code. |
2590 | |
2591 | // fill in as much stack trace as possible |
2592 | int chunk_count = 0; |
2593 | for (;!st.at_end(); st.next()) { |
2594 | bt.push(st.method(), st.bci(), CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2595 | chunk_count++; |
2596 | |
2597 | // Bail-out for deep stacks |
2598 | if (chunk_count >= trace_chunk_size) break; |
2599 | } |
2600 | set_depth(throwable(), chunk_count); |
2601 | log_info(stacktrace)(!(LogImpl<(LogTag::_stacktrace), (LogTag::__NO_TAG), (LogTag ::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag:: __NO_TAG)>::is_level(LogLevel::Info))) ? (void)0 : LogImpl <(LogTag::_stacktrace), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::write<LogLevel::Info>("%s, %d", throwable->klass()->external_name(), chunk_count); |
2602 | |
2603 | // We support the Throwable immutability protocol defined for Java 7. |
2604 | java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace()); |
2605 | assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized")do { if (!(java_lang_Throwable::unassigned_stacktrace() != __null )) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2605, "assert(" "java_lang_Throwable::unassigned_stacktrace() != __null" ") failed", "not initialized"); ::breakpoint(); } } while (0 ); |
2606 | } |
2607 | |
2608 | void java_lang_Throwable::get_stack_trace_elements(Handle throwable, |
2609 | objArrayHandle stack_trace_array_h, TRAPSJavaThread* __the_thread__) { |
2610 | |
2611 | if (throwable.is_null() || stack_trace_array_h.is_null()) { |
2612 | THROW(vmSymbols::java_lang_NullPointerException()){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2612, vmSymbols::java_lang_NullPointerException(), __null); return; }; |
2613 | } |
2614 | |
2615 | assert(stack_trace_array_h->is_objArray(), "Stack trace array should be an array of StackTraceElenent")do { if (!(stack_trace_array_h->is_objArray())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2615, "assert(" "stack_trace_array_h->is_objArray()" ") failed" , "Stack trace array should be an array of StackTraceElenent" ); ::breakpoint(); } } while (0); |
2616 | |
2617 | if (stack_trace_array_h->length() != depth(throwable())) { |
2618 | THROW(vmSymbols::java_lang_IndexOutOfBoundsException()){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2618, vmSymbols::java_lang_IndexOutOfBoundsException(), __null ); return; }; |
2619 | } |
2620 | |
2621 | objArrayHandle result(THREAD__the_thread__, objArrayOop(backtrace(throwable()))); |
2622 | BacktraceIterator iter(result, THREAD__the_thread__); |
2623 | |
2624 | int index = 0; |
2625 | while (iter.repeat()) { |
2626 | BacktraceElement bte = iter.next(THREAD__the_thread__); |
2627 | |
2628 | Handle stack_trace_element(THREAD__the_thread__, stack_trace_array_h->obj_at(index++)); |
2629 | |
2630 | if (stack_trace_element.is_null()) { |
2631 | THROW(vmSymbols::java_lang_NullPointerException()){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2631, vmSymbols::java_lang_NullPointerException(), __null); return; }; |
2632 | } |
2633 | |
2634 | InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror())); |
2635 | methodHandle method (THREAD__the_thread__, holder->method_with_orig_idnum(bte._method_id, bte._version)); |
2636 | |
2637 | java_lang_StackTraceElement::fill_in(stack_trace_element, holder, |
2638 | method, |
2639 | bte._version, |
2640 | bte._bci, |
2641 | bte._name, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2642 | } |
2643 | } |
2644 | |
2645 | Handle java_lang_Throwable::get_cause_with_stack_trace(Handle throwable, TRAPSJavaThread* __the_thread__) { |
2646 | // Call to JVM to fill in the stack trace and clear declaringClassObject to |
2647 | // not keep classes alive in the stack trace. |
2648 | // call this: public StackTraceElement[] getStackTrace() |
2649 | assert(throwable.not_null(), "shouldn't be")do { if (!(throwable.not_null())) { (*g_assert_poison) = 'X'; ; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2649, "assert(" "throwable.not_null()" ") failed", "shouldn't be" ); ::breakpoint(); } } while (0); |
2650 | |
2651 | JavaValue result(T_ARRAY); |
2652 | JavaCalls::call_virtual(&result, throwable, |
2653 | vmClasses::Throwable_klass(), |
2654 | vmSymbols::getStackTrace_name(), |
2655 | vmSymbols::getStackTrace_signature(), |
2656 | CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
2657 | Handle stack_trace(THREAD__the_thread__, result.get_oop()); |
2658 | assert(stack_trace->is_objArray(), "Should be an array")do { if (!(stack_trace->is_objArray())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2658, "assert(" "stack_trace->is_objArray()" ") failed", "Should be an array"); ::breakpoint(); } } while (0); |
2659 | |
2660 | // Throw ExceptionInInitializerError as the cause with this exception in |
2661 | // the message and stack trace. |
2662 | |
2663 | // Now create the message with the original exception and thread name. |
2664 | Symbol* message = java_lang_Throwable::detail_message(throwable()); |
2665 | ResourceMark rm(THREAD__the_thread__); |
2666 | stringStream st; |
2667 | st.print("Exception %s%s ", throwable()->klass()->name()->as_klass_external_name(), |
2668 | message == nullptr ? "" : ":"); |
2669 | if (message == NULL__null) { |
2670 | st.print("[in thread \"%s\"]", THREAD__the_thread__->name()); |
2671 | } else { |
2672 | st.print("%s [in thread \"%s\"]", message->as_C_string(), THREAD__the_thread__->name()); |
2673 | } |
2674 | |
2675 | Symbol* exception_name = vmSymbols::java_lang_ExceptionInInitializerError(); |
2676 | Handle h_cause = Exceptions::new_exception(THREAD__the_thread__, exception_name, st.as_string()); |
2677 | |
2678 | // If new_exception returns a different exception while creating the exception, return null. |
2679 | if (h_cause->klass()->name() != exception_name) { |
2680 | log_info(class, init)(!(LogImpl<(LogTag::_class), (LogTag::_init), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG) >::is_level(LogLevel::Info))) ? (void)0 : LogImpl<(LogTag ::_class), (LogTag::_init), (LogTag::__NO_TAG), (LogTag::__NO_TAG ), (LogTag::__NO_TAG), (LogTag::__NO_TAG)>::write<LogLevel ::Info>("Exception thrown while saving initialization exception %s", |
2681 | h_cause->klass()->external_name()); |
2682 | return Handle(); |
2683 | } |
2684 | java_lang_Throwable::set_stacktrace(h_cause(), stack_trace()); |
2685 | // Clear backtrace because the stacktrace should be used instead. |
2686 | set_backtrace(h_cause(), NULL__null); |
2687 | return h_cause; |
2688 | } |
2689 | |
2690 | bool java_lang_Throwable::get_top_method_and_bci(oop throwable, Method** method, int* bci) { |
2691 | JavaThread* current = JavaThread::current(); |
2692 | objArrayHandle result(current, objArrayOop(backtrace(throwable))); |
2693 | BacktraceIterator iter(result, current); |
2694 | // No backtrace available. |
2695 | if (!iter.repeat()) return false; |
2696 | |
2697 | // If the exception happened in a frame that has been hidden, i.e., |
2698 | // omitted from the back trace, we can not compute the message. |
2699 | oop hidden = ((objArrayOop)backtrace(throwable))->obj_at(trace_hidden_offset); |
2700 | if (hidden != NULL__null) { |
2701 | return false; |
2702 | } |
2703 | |
2704 | // Get first backtrace element. |
2705 | BacktraceElement bte = iter.next(current); |
2706 | |
2707 | InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror())); |
2708 | assert(holder != NULL, "first element should be non-null")do { if (!(holder != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2708, "assert(" "holder != __null" ") failed", "first element should be non-null" ); ::breakpoint(); } } while (0); |
2709 | Method* m = holder->method_with_orig_idnum(bte._method_id, bte._version); |
2710 | |
2711 | // Original version is no longer available. |
2712 | if (m == NULL__null || !version_matches(m, bte._version)) { |
2713 | return false; |
2714 | } |
2715 | |
2716 | *method = m; |
2717 | *bci = bte._bci; |
2718 | return true; |
2719 | } |
2720 | |
2721 | oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPSJavaThread* __the_thread__) { |
2722 | // Allocate java.lang.StackTraceElement instance |
2723 | InstanceKlass* k = vmClasses::StackTraceElement_klass(); |
2724 | assert(k != NULL, "must be loaded in 1.4+")do { if (!(k != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2724, "assert(" "k != __null" ") failed", "must be loaded in 1.4+" ); ::breakpoint(); } } while (0); |
2725 | if (k->should_be_initialized()) { |
2726 | k->initialize(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
2727 | } |
2728 | |
2729 | Handle element = k->allocate_instance_handle(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
2730 | |
2731 | int version = method->constants()->version(); |
2732 | fill_in(element, method->method_holder(), method, version, bci, method->name(), CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
2733 | return element(); |
2734 | } |
2735 | |
2736 | void java_lang_StackTraceElement::fill_in(Handle element, |
2737 | InstanceKlass* holder, const methodHandle& method, |
2738 | int version, int bci, Symbol* name, TRAPSJavaThread* __the_thread__) { |
2739 | assert(element->is_a(vmClasses::StackTraceElement_klass()), "sanity check")do { if (!(element->is_a(vmClasses::StackTraceElement_klass ()))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2739, "assert(" "element->is_a(vmClasses::StackTraceElement_klass())" ") failed", "sanity check"); ::breakpoint(); } } while (0); |
2740 | |
2741 | ResourceMark rm(THREAD__the_thread__); |
2742 | HandleMark hm(THREAD__the_thread__); |
2743 | |
2744 | // Fill in class name |
2745 | Handle java_class(THREAD__the_thread__, holder->java_mirror()); |
2746 | oop classname = java_lang_Class::name(java_class, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2747 | java_lang_StackTraceElement::set_declaringClass(element(), classname); |
2748 | java_lang_StackTraceElement::set_declaringClassObject(element(), java_class()); |
2749 | |
2750 | oop loader = holder->class_loader(); |
2751 | if (loader != NULL__null) { |
2752 | oop loader_name = java_lang_ClassLoader::name(loader); |
2753 | if (loader_name != NULL__null) |
2754 | java_lang_StackTraceElement::set_classLoaderName(element(), loader_name); |
2755 | } |
2756 | |
2757 | // Fill in method name |
2758 | oop methodname = StringTable::intern(name, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2759 | java_lang_StackTraceElement::set_methodName(element(), methodname); |
2760 | |
2761 | // Fill in module name and version |
2762 | ModuleEntry* module = holder->module(); |
2763 | if (module->is_named()) { |
2764 | oop module_name = StringTable::intern(module->name(), CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2765 | java_lang_StackTraceElement::set_moduleName(element(), module_name); |
2766 | oop module_version; |
2767 | if (module->version() != NULL__null) { |
2768 | module_version = StringTable::intern(module->version(), CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2769 | } else { |
2770 | module_version = NULL__null; |
2771 | } |
2772 | java_lang_StackTraceElement::set_moduleVersion(element(), module_version); |
2773 | } |
2774 | |
2775 | if (method() == NULL__null || !version_matches(method(), version)) { |
2776 | // The method was redefined, accurate line number information isn't available |
2777 | java_lang_StackTraceElement::set_fileName(element(), NULL__null); |
2778 | java_lang_StackTraceElement::set_lineNumber(element(), -1); |
2779 | } else { |
2780 | Symbol* source; |
2781 | oop source_file; |
2782 | int line_number; |
2783 | decode_file_and_line(java_class, holder, version, method, bci, source, source_file, line_number, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2784 | |
2785 | java_lang_StackTraceElement::set_fileName(element(), source_file); |
2786 | java_lang_StackTraceElement::set_lineNumber(element(), line_number); |
2787 | } |
2788 | } |
2789 | |
2790 | void java_lang_StackTraceElement::decode_file_and_line(Handle java_class, |
2791 | InstanceKlass* holder, |
2792 | int version, |
2793 | const methodHandle& method, |
2794 | int bci, |
2795 | Symbol*& source, |
2796 | oop& source_file, |
2797 | int& line_number, TRAPSJavaThread* __the_thread__) { |
2798 | // Fill in source file name and line number. |
2799 | source = Backtrace::get_source_file_name(holder, version); |
2800 | source_file = java_lang_Class::source_file(java_class()); |
2801 | if (source != NULL__null) { |
2802 | // Class was not redefined. We can trust its cache if set, |
2803 | // else we have to initialize it. |
2804 | if (source_file == NULL__null) { |
2805 | source_file = StringTable::intern(source, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2806 | java_lang_Class::set_source_file(java_class(), source_file); |
2807 | } |
2808 | } else { |
2809 | // Class was redefined. Dump the cache if it was set. |
2810 | if (source_file != NULL__null) { |
2811 | source_file = NULL__null; |
2812 | java_lang_Class::set_source_file(java_class(), source_file); |
2813 | } |
2814 | } |
2815 | line_number = Backtrace::get_line_number(method(), bci); |
2816 | } |
2817 | |
2818 | #if INCLUDE_JVMCI1 |
2819 | void java_lang_StackTraceElement::decode(const methodHandle& method, int bci, |
2820 | Symbol*& filename, int& line_number, TRAPSJavaThread* __the_thread__) { |
2821 | ResourceMark rm(THREAD__the_thread__); |
2822 | HandleMark hm(THREAD__the_thread__); |
2823 | |
2824 | filename = NULL__null; |
2825 | line_number = -1; |
2826 | |
2827 | oop source_file; |
2828 | int version = method->constants()->version(); |
2829 | InstanceKlass* holder = method->method_holder(); |
2830 | Handle java_class(THREAD__the_thread__, holder->java_mirror()); |
2831 | decode_file_and_line(java_class, holder, version, method, bci, filename, source_file, line_number, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2832 | } |
2833 | #endif // INCLUDE_JVMCI |
2834 | |
2835 | // java_lang_StackFrameInfo |
2836 | |
2837 | int java_lang_StackFrameInfo::_memberName_offset; |
2838 | int java_lang_StackFrameInfo::_bci_offset; |
2839 | int java_lang_StackFrameInfo::_version_offset; |
2840 | |
2841 | #define STACKFRAMEINFO_FIELDS_DO(macro)macro(_memberName_offset, k, "memberName", object_signature, false ); macro(_bci_offset, k, "bci", int_signature, false) \ |
2842 | macro(_memberName_offset, k, "memberName", object_signature, false); \ |
2843 | macro(_bci_offset, k, "bci", int_signature, false) |
2844 | |
2845 | void java_lang_StackFrameInfo::compute_offsets() { |
2846 | InstanceKlass* k = vmClasses::StackFrameInfo_klass(); |
2847 | STACKFRAMEINFO_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_memberName_offset, k, "memberName", vmSymbols ::object_signature(), false); compute_offset(_bci_offset, k, "bci" , vmSymbols::int_signature(), false); |
2848 | STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_StackFrameInfo::_version_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_StackFrameInfo_version_enum);; |
2849 | } |
2850 | |
2851 | #if INCLUDE_CDS1 |
2852 | void java_lang_StackFrameInfo::serialize_offsets(SerializeClosure* f) { |
2853 | STACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_memberName_offset); f->do_u4((u4*)& _bci_offset); |
2854 | STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_version_offset);; |
2855 | } |
2856 | #endif |
2857 | |
2858 | Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPSJavaThread* __the_thread__) { |
2859 | HandleMark hm(THREAD__the_thread__); |
2860 | Handle mname(THREAD__the_thread__, stackFrame->obj_field(_memberName_offset)); |
2861 | Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); |
2862 | // we should expand MemberName::name when Throwable uses StackTrace |
2863 | // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); |
2864 | return method; |
2865 | } |
2866 | |
2867 | void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPSJavaThread* __the_thread__) { |
2868 | // set Method* or mid/cpref |
2869 | HandleMark hm(THREAD__the_thread__); |
2870 | Handle mname(THREAD__the_thread__, stackFrame->obj_field(_memberName_offset)); |
2871 | InstanceKlass* ik = method->method_holder(); |
2872 | CallInfo info(method(), ik, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2873 | MethodHandles::init_method_MemberName(mname, info); |
2874 | // set bci |
2875 | java_lang_StackFrameInfo::set_bci(stackFrame(), bci); |
2876 | // method may be redefined; store the version |
2877 | int version = method->constants()->version(); |
2878 | assert((jushort)version == version, "version should be short")do { if (!((jushort)version == version)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2878, "assert(" "(jushort)version == version" ") failed", "version should be short" ); ::breakpoint(); } } while (0); |
2879 | java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); |
2880 | } |
2881 | |
2882 | void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPSJavaThread* __the_thread__) { |
2883 | ResourceMark rm(THREAD__the_thread__); |
2884 | HandleMark hm(THREAD__the_thread__); |
2885 | Handle mname(THREAD__the_thread__, stackFrame->obj_field(java_lang_StackFrameInfo::_memberName_offset)); |
2886 | Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname())); |
2887 | InstanceKlass* holder = InstanceKlass::cast(clazz); |
2888 | Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2889 | |
2890 | short version = stackFrame->short_field(_version_offset); |
2891 | int bci = stackFrame->int_field(_bci_offset); |
2892 | Symbol* name = method->name(); |
2893 | java_lang_StackTraceElement::fill_in(stack_trace_element, holder, methodHandle(THREAD__the_thread__, method), |
2894 | version, bci, name, CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return ; (void)(0); |
2895 | } |
2896 | |
2897 | void java_lang_StackFrameInfo::set_version(oop element, short value) { |
2898 | element->short_field_put(_version_offset, value); |
2899 | } |
2900 | |
2901 | void java_lang_StackFrameInfo::set_bci(oop element, int value) { |
2902 | assert(value >= 0 && value < max_jushort, "must be a valid bci value")do { if (!(value >= 0 && value < max_jushort)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 2902, "assert(" "value >= 0 && value < max_jushort" ") failed", "must be a valid bci value"); ::breakpoint(); } } while (0); |
2903 | element->int_field_put(_bci_offset, value); |
2904 | } |
2905 | |
2906 | int java_lang_LiveStackFrameInfo::_monitors_offset; |
2907 | int java_lang_LiveStackFrameInfo::_locals_offset; |
2908 | int java_lang_LiveStackFrameInfo::_operands_offset; |
2909 | int java_lang_LiveStackFrameInfo::_mode_offset; |
2910 | |
2911 | #define LIVESTACKFRAMEINFO_FIELDS_DO(macro)macro(_monitors_offset, k, "monitors", object_array_signature , false); macro(_locals_offset, k, "locals", object_array_signature , false); macro(_operands_offset, k, "operands", object_array_signature , false); macro(_mode_offset, k, "mode", int_signature, false ) \ |
2912 | macro(_monitors_offset, k, "monitors", object_array_signature, false); \ |
2913 | macro(_locals_offset, k, "locals", object_array_signature, false); \ |
2914 | macro(_operands_offset, k, "operands", object_array_signature, false); \ |
2915 | macro(_mode_offset, k, "mode", int_signature, false) |
2916 | |
2917 | void java_lang_LiveStackFrameInfo::compute_offsets() { |
2918 | InstanceKlass* k = vmClasses::LiveStackFrameInfo_klass(); |
2919 | LIVESTACKFRAMEINFO_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_monitors_offset, k, "monitors", vmSymbols::object_array_signature (), false); compute_offset(_locals_offset, k, "locals", vmSymbols ::object_array_signature(), false); compute_offset(_operands_offset , k, "operands", vmSymbols::object_array_signature(), false); compute_offset(_mode_offset, k, "mode", vmSymbols::int_signature (), false); |
2920 | } |
2921 | |
2922 | #if INCLUDE_CDS1 |
2923 | void java_lang_LiveStackFrameInfo::serialize_offsets(SerializeClosure* f) { |
2924 | LIVESTACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_monitors_offset); f->do_u4((u4*)& _locals_offset); f->do_u4((u4*)&_operands_offset); f-> do_u4((u4*)&_mode_offset); |
2925 | } |
2926 | #endif |
2927 | |
2928 | void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) { |
2929 | element->obj_field_put(_monitors_offset, value); |
2930 | } |
2931 | |
2932 | void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) { |
2933 | element->obj_field_put(_locals_offset, value); |
2934 | } |
2935 | |
2936 | void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) { |
2937 | element->obj_field_put(_operands_offset, value); |
2938 | } |
2939 | |
2940 | void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) { |
2941 | element->int_field_put(_mode_offset, value); |
2942 | } |
2943 | |
2944 | |
2945 | // java_lang_AccessibleObject |
2946 | |
2947 | int java_lang_reflect_AccessibleObject::_override_offset; |
2948 | |
2949 | #define ACCESSIBLEOBJECT_FIELDS_DO(macro)macro(_override_offset, k, "override", bool_signature, false) \ |
2950 | macro(_override_offset, k, "override", bool_signature, false) |
2951 | |
2952 | void java_lang_reflect_AccessibleObject::compute_offsets() { |
2953 | InstanceKlass* k = vmClasses::reflect_AccessibleObject_klass(); |
2954 | ACCESSIBLEOBJECT_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_override_offset, k, "override", vmSymbols::bool_signature (), false); |
2955 | } |
2956 | |
2957 | #if INCLUDE_CDS1 |
2958 | void java_lang_reflect_AccessibleObject::serialize_offsets(SerializeClosure* f) { |
2959 | ACCESSIBLEOBJECT_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_override_offset); |
2960 | } |
2961 | #endif |
2962 | |
2963 | jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { |
2964 | return (jboolean) reflect->bool_field(_override_offset); |
2965 | } |
2966 | |
2967 | void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) { |
2968 | reflect->bool_field_put(_override_offset, (int) value); |
2969 | } |
2970 | |
2971 | // java_lang_reflect_Method |
2972 | |
2973 | int java_lang_reflect_Method::_clazz_offset; |
2974 | int java_lang_reflect_Method::_name_offset; |
2975 | int java_lang_reflect_Method::_returnType_offset; |
2976 | int java_lang_reflect_Method::_parameterTypes_offset; |
2977 | int java_lang_reflect_Method::_exceptionTypes_offset; |
2978 | int java_lang_reflect_Method::_slot_offset; |
2979 | int java_lang_reflect_Method::_modifiers_offset; |
2980 | int java_lang_reflect_Method::_signature_offset; |
2981 | int java_lang_reflect_Method::_annotations_offset; |
2982 | int java_lang_reflect_Method::_parameter_annotations_offset; |
2983 | int java_lang_reflect_Method::_annotation_default_offset; |
2984 | |
2985 | #define METHOD_FIELDS_DO(macro)macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature , false); macro(_name_offset, k, vmSymbols::name_name(), string_signature , false); macro(_returnType_offset, k, vmSymbols::returnType_name (), class_signature, false); macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false ); macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name (), class_array_signature, false); macro(_slot_offset, k, vmSymbols ::slot_name(), int_signature, false); macro(_modifiers_offset , k, vmSymbols::modifiers_name(), int_signature, false); macro (_signature_offset, k, vmSymbols::signature_name(), string_signature , false); macro(_annotations_offset, k, vmSymbols::annotations_name (), byte_array_signature, false); macro(_parameter_annotations_offset , k, vmSymbols::parameter_annotations_name(), byte_array_signature , false); macro(_annotation_default_offset, k, vmSymbols::annotation_default_name (), byte_array_signature, false); \ |
2986 | macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \ |
2987 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \ |
2988 | macro(_returnType_offset, k, vmSymbols::returnType_name(), class_signature, false); \ |
2989 | macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false); \ |
2990 | macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), class_array_signature, false); \ |
2991 | macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \ |
2992 | macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \ |
2993 | macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \ |
2994 | macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); \ |
2995 | macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), byte_array_signature, false); \ |
2996 | macro(_annotation_default_offset, k, vmSymbols::annotation_default_name(), byte_array_signature, false); |
2997 | |
2998 | void java_lang_reflect_Method::compute_offsets() { |
2999 | InstanceKlass* k = vmClasses::reflect_Method_klass(); |
3000 | METHOD_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols ::class_signature(), false); compute_offset(_name_offset, k, vmSymbols ::name_name(), vmSymbols::string_signature(), false); compute_offset (_returnType_offset, k, vmSymbols::returnType_name(), vmSymbols ::class_signature(), false); compute_offset(_parameterTypes_offset , k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature (), false); compute_offset(_exceptionTypes_offset, k, vmSymbols ::exceptionTypes_name(), vmSymbols::class_array_signature(), false ); compute_offset(_slot_offset, k, vmSymbols::slot_name(), vmSymbols ::int_signature(), false); compute_offset(_modifiers_offset, k , vmSymbols::modifiers_name(), vmSymbols::int_signature(), false ); compute_offset(_signature_offset, k, vmSymbols::signature_name (), vmSymbols::string_signature(), false); compute_offset(_annotations_offset , k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature (), false); compute_offset(_parameter_annotations_offset, k, vmSymbols ::parameter_annotations_name(), vmSymbols::byte_array_signature (), false); compute_offset(_annotation_default_offset, k, vmSymbols ::annotation_default_name(), vmSymbols::byte_array_signature( ), false);; |
3001 | } |
3002 | |
3003 | #if INCLUDE_CDS1 |
3004 | void java_lang_reflect_Method::serialize_offsets(SerializeClosure* f) { |
3005 | METHOD_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_clazz_offset); f->do_u4((u4*)&_name_offset ); f->do_u4((u4*)&_returnType_offset); f->do_u4((u4 *)&_parameterTypes_offset); f->do_u4((u4*)&_exceptionTypes_offset ); f->do_u4((u4*)&_slot_offset); f->do_u4((u4*)& _modifiers_offset); f->do_u4((u4*)&_signature_offset); f->do_u4((u4*)&_annotations_offset); f->do_u4((u4* )&_parameter_annotations_offset); f->do_u4((u4*)&_annotation_default_offset );; |
3006 | } |
3007 | #endif |
3008 | |
3009 | Handle java_lang_reflect_Method::create(TRAPSJavaThread* __the_thread__) { |
3010 | assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem")do { if (!(Universe::is_fully_initialized())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3010, "assert(" "Universe::is_fully_initialized()" ") failed" , "Need to find another solution to the reflection problem"); ::breakpoint(); } } while (0); |
3011 | Klass* klass = vmClasses::reflect_Method_klass(); |
3012 | // This class is eagerly initialized during VM initialization, since we keep a refence |
3013 | // to one of the methods |
3014 | assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized")do { if (!(InstanceKlass::cast(klass)->is_initialized())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3014, "assert(" "InstanceKlass::cast(klass)->is_initialized()" ") failed", "must be initialized"); ::breakpoint(); } } while (0); |
3015 | return InstanceKlass::cast(klass)->allocate_instance_handle(THREAD__the_thread__); |
3016 | } |
3017 | |
3018 | oop java_lang_reflect_Method::clazz(oop reflect) { |
3019 | return reflect->obj_field(_clazz_offset); |
3020 | } |
3021 | |
3022 | void java_lang_reflect_Method::set_clazz(oop reflect, oop value) { |
3023 | reflect->obj_field_put(_clazz_offset, value); |
3024 | } |
3025 | |
3026 | int java_lang_reflect_Method::slot(oop reflect) { |
3027 | return reflect->int_field(_slot_offset); |
3028 | } |
3029 | |
3030 | void java_lang_reflect_Method::set_slot(oop reflect, int value) { |
3031 | reflect->int_field_put(_slot_offset, value); |
3032 | } |
3033 | |
3034 | void java_lang_reflect_Method::set_name(oop method, oop value) { |
3035 | method->obj_field_put(_name_offset, value); |
3036 | } |
3037 | |
3038 | oop java_lang_reflect_Method::return_type(oop method) { |
3039 | return method->obj_field(_returnType_offset); |
3040 | } |
3041 | |
3042 | void java_lang_reflect_Method::set_return_type(oop method, oop value) { |
3043 | method->obj_field_put(_returnType_offset, value); |
3044 | } |
3045 | |
3046 | oop java_lang_reflect_Method::parameter_types(oop method) { |
3047 | return method->obj_field(_parameterTypes_offset); |
3048 | } |
3049 | |
3050 | void java_lang_reflect_Method::set_parameter_types(oop method, oop value) { |
3051 | method->obj_field_put(_parameterTypes_offset, value); |
3052 | } |
3053 | |
3054 | void java_lang_reflect_Method::set_exception_types(oop method, oop value) { |
3055 | method->obj_field_put(_exceptionTypes_offset, value); |
3056 | } |
3057 | |
3058 | void java_lang_reflect_Method::set_modifiers(oop method, int value) { |
3059 | method->int_field_put(_modifiers_offset, value); |
3060 | } |
3061 | |
3062 | void java_lang_reflect_Method::set_signature(oop method, oop value) { |
3063 | method->obj_field_put(_signature_offset, value); |
3064 | } |
3065 | |
3066 | void java_lang_reflect_Method::set_annotations(oop method, oop value) { |
3067 | method->obj_field_put(_annotations_offset, value); |
3068 | } |
3069 | |
3070 | void java_lang_reflect_Method::set_parameter_annotations(oop method, oop value) { |
3071 | method->obj_field_put(_parameter_annotations_offset, value); |
3072 | } |
3073 | |
3074 | void java_lang_reflect_Method::set_annotation_default(oop method, oop value) { |
3075 | method->obj_field_put(_annotation_default_offset, value); |
3076 | } |
3077 | |
3078 | int java_lang_reflect_Constructor::_clazz_offset; |
3079 | int java_lang_reflect_Constructor::_parameterTypes_offset; |
3080 | int java_lang_reflect_Constructor::_exceptionTypes_offset; |
3081 | int java_lang_reflect_Constructor::_slot_offset; |
3082 | int java_lang_reflect_Constructor::_modifiers_offset; |
3083 | int java_lang_reflect_Constructor::_signature_offset; |
3084 | int java_lang_reflect_Constructor::_annotations_offset; |
3085 | int java_lang_reflect_Constructor::_parameter_annotations_offset; |
3086 | |
3087 | #define CONSTRUCTOR_FIELDS_DO(macro)macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature , false); macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name (), class_array_signature, false); macro(_exceptionTypes_offset , k, vmSymbols::exceptionTypes_name(), class_array_signature, false); macro(_slot_offset, k, vmSymbols::slot_name(), int_signature , false); macro(_modifiers_offset, k, vmSymbols::modifiers_name (), int_signature, false); macro(_signature_offset, k, vmSymbols ::signature_name(), string_signature, false); macro(_annotations_offset , k, vmSymbols::annotations_name(), byte_array_signature, false ); macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name (), byte_array_signature, false); \ |
3088 | macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \ |
3089 | macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false); \ |
3090 | macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), class_array_signature, false); \ |
3091 | macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \ |
3092 | macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \ |
3093 | macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \ |
3094 | macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); \ |
3095 | macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), byte_array_signature, false); |
3096 | |
3097 | void java_lang_reflect_Constructor::compute_offsets() { |
3098 | InstanceKlass* k = vmClasses::reflect_Constructor_klass(); |
3099 | CONSTRUCTOR_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols ::class_signature(), false); compute_offset(_parameterTypes_offset , k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature (), false); compute_offset(_exceptionTypes_offset, k, vmSymbols ::exceptionTypes_name(), vmSymbols::class_array_signature(), false ); compute_offset(_slot_offset, k, vmSymbols::slot_name(), vmSymbols ::int_signature(), false); compute_offset(_modifiers_offset, k , vmSymbols::modifiers_name(), vmSymbols::int_signature(), false ); compute_offset(_signature_offset, k, vmSymbols::signature_name (), vmSymbols::string_signature(), false); compute_offset(_annotations_offset , k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature (), false); compute_offset(_parameter_annotations_offset, k, vmSymbols ::parameter_annotations_name(), vmSymbols::byte_array_signature (), false);; |
3100 | } |
3101 | |
3102 | #if INCLUDE_CDS1 |
3103 | void java_lang_reflect_Constructor::serialize_offsets(SerializeClosure* f) { |
3104 | CONSTRUCTOR_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_clazz_offset); f->do_u4((u4*)&_parameterTypes_offset ); f->do_u4((u4*)&_exceptionTypes_offset); f->do_u4 ((u4*)&_slot_offset); f->do_u4((u4*)&_modifiers_offset ); f->do_u4((u4*)&_signature_offset); f->do_u4((u4* )&_annotations_offset); f->do_u4((u4*)&_parameter_annotations_offset );; |
3105 | } |
3106 | #endif |
3107 | |
3108 | Handle java_lang_reflect_Constructor::create(TRAPSJavaThread* __the_thread__) { |
3109 | assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem")do { if (!(Universe::is_fully_initialized())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3109, "assert(" "Universe::is_fully_initialized()" ") failed" , "Need to find another solution to the reflection problem"); ::breakpoint(); } } while (0); |
3110 | Symbol* name = vmSymbols::java_lang_reflect_Constructor(); |
3111 | Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3112 | InstanceKlass* ik = InstanceKlass::cast(k); |
3113 | // Ensure it is initialized |
3114 | ik->initialize(CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3115 | return ik->allocate_instance_handle(THREAD__the_thread__); |
3116 | } |
3117 | |
3118 | oop java_lang_reflect_Constructor::clazz(oop reflect) { |
3119 | return reflect->obj_field(_clazz_offset); |
3120 | } |
3121 | |
3122 | void java_lang_reflect_Constructor::set_clazz(oop reflect, oop value) { |
3123 | reflect->obj_field_put(_clazz_offset, value); |
3124 | } |
3125 | |
3126 | oop java_lang_reflect_Constructor::parameter_types(oop constructor) { |
3127 | return constructor->obj_field(_parameterTypes_offset); |
3128 | } |
3129 | |
3130 | void java_lang_reflect_Constructor::set_parameter_types(oop constructor, oop value) { |
3131 | constructor->obj_field_put(_parameterTypes_offset, value); |
3132 | } |
3133 | |
3134 | void java_lang_reflect_Constructor::set_exception_types(oop constructor, oop value) { |
3135 | constructor->obj_field_put(_exceptionTypes_offset, value); |
3136 | } |
3137 | |
3138 | int java_lang_reflect_Constructor::slot(oop reflect) { |
3139 | return reflect->int_field(_slot_offset); |
3140 | } |
3141 | |
3142 | void java_lang_reflect_Constructor::set_slot(oop reflect, int value) { |
3143 | reflect->int_field_put(_slot_offset, value); |
3144 | } |
3145 | |
3146 | void java_lang_reflect_Constructor::set_modifiers(oop constructor, int value) { |
3147 | constructor->int_field_put(_modifiers_offset, value); |
3148 | } |
3149 | |
3150 | void java_lang_reflect_Constructor::set_signature(oop constructor, oop value) { |
3151 | constructor->obj_field_put(_signature_offset, value); |
3152 | } |
3153 | |
3154 | void java_lang_reflect_Constructor::set_annotations(oop constructor, oop value) { |
3155 | constructor->obj_field_put(_annotations_offset, value); |
3156 | } |
3157 | |
3158 | void java_lang_reflect_Constructor::set_parameter_annotations(oop method, oop value) { |
3159 | method->obj_field_put(_parameter_annotations_offset, value); |
3160 | } |
3161 | |
3162 | int java_lang_reflect_Field::_clazz_offset; |
3163 | int java_lang_reflect_Field::_name_offset; |
3164 | int java_lang_reflect_Field::_type_offset; |
3165 | int java_lang_reflect_Field::_slot_offset; |
3166 | int java_lang_reflect_Field::_modifiers_offset; |
3167 | int java_lang_reflect_Field::_trusted_final_offset; |
3168 | int java_lang_reflect_Field::_signature_offset; |
3169 | int java_lang_reflect_Field::_annotations_offset; |
3170 | |
3171 | #define FIELD_FIELDS_DO(macro)macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature , false); macro(_name_offset, k, vmSymbols::name_name(), string_signature , false); macro(_type_offset, k, vmSymbols::type_name(), class_signature , false); macro(_slot_offset, k, vmSymbols::slot_name(), int_signature , false); macro(_modifiers_offset, k, vmSymbols::modifiers_name (), int_signature, false); macro(_trusted_final_offset, k, vmSymbols ::trusted_final_name(), bool_signature, false); macro(_signature_offset , k, vmSymbols::signature_name(), string_signature, false); macro (_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature , false); \ |
3172 | macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \ |
3173 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \ |
3174 | macro(_type_offset, k, vmSymbols::type_name(), class_signature, false); \ |
3175 | macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \ |
3176 | macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \ |
3177 | macro(_trusted_final_offset, k, vmSymbols::trusted_final_name(), bool_signature, false); \ |
3178 | macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \ |
3179 | macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); |
3180 | |
3181 | void java_lang_reflect_Field::compute_offsets() { |
3182 | InstanceKlass* k = vmClasses::reflect_Field_klass(); |
3183 | FIELD_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols ::class_signature(), false); compute_offset(_name_offset, k, vmSymbols ::name_name(), vmSymbols::string_signature(), false); compute_offset (_type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature (), false); compute_offset(_slot_offset, k, vmSymbols::slot_name (), vmSymbols::int_signature(), false); compute_offset(_modifiers_offset , k, vmSymbols::modifiers_name(), vmSymbols::int_signature(), false); compute_offset(_trusted_final_offset, k, vmSymbols:: trusted_final_name(), vmSymbols::bool_signature(), false); compute_offset (_signature_offset, k, vmSymbols::signature_name(), vmSymbols ::string_signature(), false); compute_offset(_annotations_offset , k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature (), false);; |
3184 | } |
3185 | |
3186 | #if INCLUDE_CDS1 |
3187 | void java_lang_reflect_Field::serialize_offsets(SerializeClosure* f) { |
3188 | FIELD_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_clazz_offset); f->do_u4((u4*)&_name_offset ); f->do_u4((u4*)&_type_offset); f->do_u4((u4*)& _slot_offset); f->do_u4((u4*)&_modifiers_offset); f-> do_u4((u4*)&_trusted_final_offset); f->do_u4((u4*)& _signature_offset); f->do_u4((u4*)&_annotations_offset );; |
3189 | } |
3190 | #endif |
3191 | |
3192 | Handle java_lang_reflect_Field::create(TRAPSJavaThread* __the_thread__) { |
3193 | assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem")do { if (!(Universe::is_fully_initialized())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3193, "assert(" "Universe::is_fully_initialized()" ") failed" , "Need to find another solution to the reflection problem"); ::breakpoint(); } } while (0); |
3194 | Symbol* name = vmSymbols::java_lang_reflect_Field(); |
3195 | Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3196 | InstanceKlass* ik = InstanceKlass::cast(k); |
3197 | // Ensure it is initialized |
3198 | ik->initialize(CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3199 | return ik->allocate_instance_handle(THREAD__the_thread__); |
3200 | } |
3201 | |
3202 | oop java_lang_reflect_Field::clazz(oop reflect) { |
3203 | return reflect->obj_field(_clazz_offset); |
3204 | } |
3205 | |
3206 | void java_lang_reflect_Field::set_clazz(oop reflect, oop value) { |
3207 | reflect->obj_field_put(_clazz_offset, value); |
3208 | } |
3209 | |
3210 | oop java_lang_reflect_Field::name(oop field) { |
3211 | return field->obj_field(_name_offset); |
3212 | } |
3213 | |
3214 | void java_lang_reflect_Field::set_name(oop field, oop value) { |
3215 | field->obj_field_put(_name_offset, value); |
3216 | } |
3217 | |
3218 | oop java_lang_reflect_Field::type(oop field) { |
3219 | return field->obj_field(_type_offset); |
3220 | } |
3221 | |
3222 | void java_lang_reflect_Field::set_type(oop field, oop value) { |
3223 | field->obj_field_put(_type_offset, value); |
3224 | } |
3225 | |
3226 | int java_lang_reflect_Field::slot(oop reflect) { |
3227 | return reflect->int_field(_slot_offset); |
3228 | } |
3229 | |
3230 | void java_lang_reflect_Field::set_slot(oop reflect, int value) { |
3231 | reflect->int_field_put(_slot_offset, value); |
3232 | } |
3233 | |
3234 | int java_lang_reflect_Field::modifiers(oop field) { |
3235 | return field->int_field(_modifiers_offset); |
3236 | } |
3237 | |
3238 | void java_lang_reflect_Field::set_modifiers(oop field, int value) { |
3239 | field->int_field_put(_modifiers_offset, value); |
3240 | } |
3241 | |
3242 | void java_lang_reflect_Field::set_trusted_final(oop field) { |
3243 | field->bool_field_put(_trusted_final_offset, true); |
3244 | } |
3245 | |
3246 | void java_lang_reflect_Field::set_signature(oop field, oop value) { |
3247 | field->obj_field_put(_signature_offset, value); |
3248 | } |
3249 | |
3250 | void java_lang_reflect_Field::set_annotations(oop field, oop value) { |
3251 | field->obj_field_put(_annotations_offset, value); |
3252 | } |
3253 | |
3254 | oop java_lang_reflect_RecordComponent::create(InstanceKlass* holder, RecordComponent* component, TRAPSJavaThread* __the_thread__) { |
3255 | // Allocate java.lang.reflect.RecordComponent instance |
3256 | HandleMark hm(THREAD__the_thread__); |
3257 | InstanceKlass* ik = vmClasses::RecordComponent_klass(); |
3258 | assert(ik != NULL, "must be loaded")do { if (!(ik != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3258, "assert(" "ik != __null" ") failed", "must be loaded" ); ::breakpoint(); } } while (0); |
3259 | ik->initialize(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3260 | |
3261 | Handle element = ik->allocate_instance_handle(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3262 | |
3263 | Handle decl_class(THREAD__the_thread__, holder->java_mirror()); |
3264 | java_lang_reflect_RecordComponent::set_clazz(element(), decl_class()); |
3265 | |
3266 | Symbol* name = holder->constants()->symbol_at(component->name_index()); // name_index is a utf8 |
3267 | oop component_name = StringTable::intern(name, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3268 | java_lang_reflect_RecordComponent::set_name(element(), component_name); |
3269 | |
3270 | Symbol* type = holder->constants()->symbol_at(component->descriptor_index()); |
3271 | Handle component_type_h = |
3272 | SystemDictionary::find_java_mirror_for_type(type, holder, SignatureStream::NCDFError, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3273 | java_lang_reflect_RecordComponent::set_type(element(), component_type_h()); |
3274 | |
3275 | Method* accessor_method = NULL__null; |
3276 | { |
3277 | // Prepend "()" to type to create the full method signature. |
3278 | ResourceMark rm(THREAD__the_thread__); |
3279 | int sig_len = type->utf8_length() + 3; // "()" and null char |
3280 | char* sig = NEW_RESOURCE_ARRAY(char, sig_len)(char*) resource_allocate_bytes((sig_len) * sizeof(char)); |
3281 | jio_snprintf(sig, sig_len, "%c%c%s", JVM_SIGNATURE_FUNC, JVM_SIGNATURE_ENDFUNC, type->as_C_string()); |
3282 | TempNewSymbol full_sig = SymbolTable::new_symbol(sig); |
3283 | accessor_method = holder->find_instance_method(name, full_sig, Klass::PrivateLookupMode::find); |
3284 | } |
3285 | |
3286 | if (accessor_method != NULL__null) { |
3287 | methodHandle method(THREAD__the_thread__, accessor_method); |
3288 | oop m = Reflection::new_method(method, false, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3289 | java_lang_reflect_RecordComponent::set_accessor(element(), m); |
3290 | } else { |
3291 | java_lang_reflect_RecordComponent::set_accessor(element(), NULL__null); |
3292 | } |
3293 | |
3294 | int sig_index = component->generic_signature_index(); |
3295 | if (sig_index > 0) { |
3296 | Symbol* sig = holder->constants()->symbol_at(sig_index); // sig_index is a utf8 |
3297 | oop component_sig = StringTable::intern(sig, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3298 | java_lang_reflect_RecordComponent::set_signature(element(), component_sig); |
3299 | } else { |
3300 | java_lang_reflect_RecordComponent::set_signature(element(), NULL__null); |
3301 | } |
3302 | |
3303 | typeArrayOop annotation_oop = Annotations::make_java_array(component->annotations(), CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3304 | java_lang_reflect_RecordComponent::set_annotations(element(), annotation_oop); |
3305 | |
3306 | typeArrayOop type_annotation_oop = Annotations::make_java_array(component->type_annotations(), CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3307 | java_lang_reflect_RecordComponent::set_typeAnnotations(element(), type_annotation_oop); |
3308 | |
3309 | return element(); |
3310 | } |
3311 | |
3312 | int reflect_ConstantPool::_oop_offset; |
3313 | |
3314 | #define CONSTANTPOOL_FIELDS_DO(macro)macro(_oop_offset, k, "constantPoolOop", object_signature, false ) \ |
3315 | macro(_oop_offset, k, "constantPoolOop", object_signature, false) |
3316 | |
3317 | void reflect_ConstantPool::compute_offsets() { |
3318 | InstanceKlass* k = vmClasses::reflect_ConstantPool_klass(); |
3319 | // The field is called ConstantPool* in the sun.reflect.ConstantPool class. |
3320 | CONSTANTPOOL_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_oop_offset, k, "constantPoolOop", vmSymbols:: object_signature(), false); |
3321 | } |
3322 | |
3323 | #if INCLUDE_CDS1 |
3324 | void reflect_ConstantPool::serialize_offsets(SerializeClosure* f) { |
3325 | CONSTANTPOOL_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_oop_offset); |
3326 | } |
3327 | #endif |
3328 | |
3329 | int java_lang_reflect_Parameter::_name_offset; |
3330 | int java_lang_reflect_Parameter::_modifiers_offset; |
3331 | int java_lang_reflect_Parameter::_index_offset; |
3332 | int java_lang_reflect_Parameter::_executable_offset; |
3333 | |
3334 | #define PARAMETER_FIELDS_DO(macro)macro(_name_offset, k, vmSymbols::name_name(), string_signature , false); macro(_modifiers_offset, k, vmSymbols::modifiers_name (), int_signature, false); macro(_index_offset, k, vmSymbols:: index_name(), int_signature, false); macro(_executable_offset , k, vmSymbols::executable_name(), executable_signature, false ) \ |
3335 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \ |
3336 | macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \ |
3337 | macro(_index_offset, k, vmSymbols::index_name(), int_signature, false); \ |
3338 | macro(_executable_offset, k, vmSymbols::executable_name(), executable_signature, false) |
3339 | |
3340 | void java_lang_reflect_Parameter::compute_offsets() { |
3341 | InstanceKlass* k = vmClasses::reflect_Parameter_klass(); |
3342 | PARAMETER_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols ::string_signature(), false); compute_offset(_modifiers_offset , k, vmSymbols::modifiers_name(), vmSymbols::int_signature(), false); compute_offset(_index_offset, k, vmSymbols::index_name (), vmSymbols::int_signature(), false); compute_offset(_executable_offset , k, vmSymbols::executable_name(), vmSymbols::executable_signature (), false); |
3343 | } |
3344 | |
3345 | #if INCLUDE_CDS1 |
3346 | void java_lang_reflect_Parameter::serialize_offsets(SerializeClosure* f) { |
3347 | PARAMETER_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_name_offset); f->do_u4((u4*)&_modifiers_offset ); f->do_u4((u4*)&_index_offset); f->do_u4((u4*)& _executable_offset); |
3348 | } |
3349 | #endif |
3350 | |
3351 | Handle java_lang_reflect_Parameter::create(TRAPSJavaThread* __the_thread__) { |
3352 | assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem")do { if (!(Universe::is_fully_initialized())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3352, "assert(" "Universe::is_fully_initialized()" ") failed" , "Need to find another solution to the reflection problem"); ::breakpoint(); } } while (0); |
3353 | Symbol* name = vmSymbols::java_lang_reflect_Parameter(); |
3354 | Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3355 | InstanceKlass* ik = InstanceKlass::cast(k); |
3356 | // Ensure it is initialized |
3357 | ik->initialize(CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3358 | return ik->allocate_instance_handle(THREAD__the_thread__); |
3359 | } |
3360 | |
3361 | oop java_lang_reflect_Parameter::name(oop param) { |
3362 | return param->obj_field(_name_offset); |
3363 | } |
3364 | |
3365 | void java_lang_reflect_Parameter::set_name(oop param, oop value) { |
3366 | param->obj_field_put(_name_offset, value); |
3367 | } |
3368 | |
3369 | int java_lang_reflect_Parameter::modifiers(oop param) { |
3370 | return param->int_field(_modifiers_offset); |
3371 | } |
3372 | |
3373 | void java_lang_reflect_Parameter::set_modifiers(oop param, int value) { |
3374 | param->int_field_put(_modifiers_offset, value); |
3375 | } |
3376 | |
3377 | int java_lang_reflect_Parameter::index(oop param) { |
3378 | return param->int_field(_index_offset); |
3379 | } |
3380 | |
3381 | void java_lang_reflect_Parameter::set_index(oop param, int value) { |
3382 | param->int_field_put(_index_offset, value); |
3383 | } |
3384 | |
3385 | oop java_lang_reflect_Parameter::executable(oop param) { |
3386 | return param->obj_field(_executable_offset); |
3387 | } |
3388 | |
3389 | void java_lang_reflect_Parameter::set_executable(oop param, oop value) { |
3390 | param->obj_field_put(_executable_offset, value); |
3391 | } |
3392 | |
3393 | // java_lang_Module |
3394 | |
3395 | int java_lang_Module::_loader_offset; |
3396 | int java_lang_Module::_name_offset; |
3397 | int java_lang_Module::_module_entry_offset; |
3398 | |
3399 | Handle java_lang_Module::create(Handle loader, Handle module_name, TRAPSJavaThread* __the_thread__) { |
3400 | assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem")do { if (!(Universe::is_fully_initialized())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3400, "assert(" "Universe::is_fully_initialized()" ") failed" , "Need to find another solution to the reflection problem"); ::breakpoint(); } } while (0); |
3401 | return JavaCalls::construct_new_instance(vmClasses::Module_klass(), |
3402 | vmSymbols::java_lang_module_init_signature(), |
3403 | loader, module_name, CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3404 | } |
3405 | |
3406 | #define MODULE_FIELDS_DO(macro)macro(_loader_offset, k, vmSymbols::loader_name(), classloader_signature , false); macro(_name_offset, k, vmSymbols::name_name(), string_signature , false) \ |
3407 | macro(_loader_offset, k, vmSymbols::loader_name(), classloader_signature, false); \ |
3408 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false) |
3409 | |
3410 | void java_lang_Module::compute_offsets() { |
3411 | InstanceKlass* k = vmClasses::Module_klass(); |
3412 | MODULE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_loader_offset, k, vmSymbols::loader_name(), vmSymbols ::classloader_signature(), false); compute_offset(_name_offset , k, vmSymbols::name_name(), vmSymbols::string_signature(), false ); |
3413 | MODULE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_Module::_module_entry_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_Module_module_entry_enum);; |
3414 | } |
3415 | |
3416 | #if INCLUDE_CDS1 |
3417 | void java_lang_Module::serialize_offsets(SerializeClosure* f) { |
3418 | MODULE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_loader_offset); f->do_u4((u4*)& _name_offset); |
3419 | MODULE_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_module_entry_offset);; |
3420 | } |
3421 | #endif |
3422 | |
3423 | oop java_lang_Module::loader(oop module) { |
3424 | return module->obj_field(_loader_offset); |
3425 | } |
3426 | |
3427 | void java_lang_Module::set_loader(oop module, oop value) { |
3428 | module->obj_field_put(_loader_offset, value); |
3429 | } |
3430 | |
3431 | oop java_lang_Module::name(oop module) { |
3432 | return module->obj_field(_name_offset); |
3433 | } |
3434 | |
3435 | void java_lang_Module::set_name(oop module, oop value) { |
3436 | module->obj_field_put(_name_offset, value); |
3437 | } |
3438 | |
3439 | ModuleEntry* java_lang_Module::module_entry_raw(oop module) { |
3440 | assert(_module_entry_offset != 0, "Uninitialized module_entry_offset")do { if (!(_module_entry_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3440, "assert(" "_module_entry_offset != 0" ") failed", "Uninitialized module_entry_offset" ); ::breakpoint(); } } while (0); |
3441 | assert(module != NULL, "module can't be null")do { if (!(module != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3441, "assert(" "module != __null" ") failed", "module can't be null" ); ::breakpoint(); } } while (0); |
3442 | assert(oopDesc::is_oop(module), "module must be oop")do { if (!(oopDesc::is_oop(module))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3442, "assert(" "oopDesc::is_oop(module)" ") failed", "module must be oop" ); ::breakpoint(); } } while (0); |
3443 | |
3444 | ModuleEntry* module_entry = (ModuleEntry*)module->address_field(_module_entry_offset); |
3445 | return module_entry; |
3446 | } |
3447 | |
3448 | ModuleEntry* java_lang_Module::module_entry(oop module) { |
3449 | ModuleEntry* module_entry = module_entry_raw(module); |
3450 | if (module_entry == NULL__null) { |
3451 | // If the inject field containing the ModuleEntry* is null then return the |
3452 | // class loader's unnamed module. |
3453 | oop loader = java_lang_Module::loader(module); |
3454 | Handle h_loader = Handle(Thread::current(), loader); |
3455 | ClassLoaderData* loader_cld = SystemDictionary::register_loader(h_loader); |
3456 | return loader_cld->unnamed_module(); |
3457 | } |
3458 | return module_entry; |
3459 | } |
3460 | |
3461 | void java_lang_Module::set_module_entry(oop module, ModuleEntry* module_entry) { |
3462 | assert(_module_entry_offset != 0, "Uninitialized module_entry_offset")do { if (!(_module_entry_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3462, "assert(" "_module_entry_offset != 0" ") failed", "Uninitialized module_entry_offset" ); ::breakpoint(); } } while (0); |
3463 | assert(module != NULL, "module can't be null")do { if (!(module != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3463, "assert(" "module != __null" ") failed", "module can't be null" ); ::breakpoint(); } } while (0); |
3464 | assert(oopDesc::is_oop(module), "module must be oop")do { if (!(oopDesc::is_oop(module))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3464, "assert(" "oopDesc::is_oop(module)" ") failed", "module must be oop" ); ::breakpoint(); } } while (0); |
3465 | module->address_field_put(_module_entry_offset, (address)module_entry); |
3466 | } |
3467 | |
3468 | Handle reflect_ConstantPool::create(TRAPSJavaThread* __the_thread__) { |
3469 | assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem")do { if (!(Universe::is_fully_initialized())) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3469, "assert(" "Universe::is_fully_initialized()" ") failed" , "Need to find another solution to the reflection problem"); ::breakpoint(); } } while (0); |
3470 | InstanceKlass* k = vmClasses::reflect_ConstantPool_klass(); |
3471 | // Ensure it is initialized |
3472 | k->initialize(CHECK_NH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return Handle(); (void)(0); |
3473 | return k->allocate_instance_handle(THREAD__the_thread__); |
3474 | } |
3475 | |
3476 | |
3477 | void reflect_ConstantPool::set_cp(oop reflect, ConstantPool* value) { |
3478 | oop mirror = value->pool_holder()->java_mirror(); |
3479 | // Save the mirror to get back the constant pool. |
3480 | reflect->obj_field_put(_oop_offset, mirror); |
3481 | } |
3482 | |
3483 | ConstantPool* reflect_ConstantPool::get_cp(oop reflect) { |
3484 | |
3485 | oop mirror = reflect->obj_field(_oop_offset); |
3486 | Klass* k = java_lang_Class::as_Klass(mirror); |
3487 | assert(k->is_instance_klass(), "Must be")do { if (!(k->is_instance_klass())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3487, "assert(" "k->is_instance_klass()" ") failed", "Must be" ); ::breakpoint(); } } while (0); |
3488 | |
3489 | // Get the constant pool back from the klass. Since class redefinition |
3490 | // merges the new constant pool into the old, this is essentially the |
3491 | // same constant pool as the original. If constant pool merging is |
3492 | // no longer done in the future, this will have to change to save |
3493 | // the original. |
3494 | return InstanceKlass::cast(k)->constants(); |
3495 | } |
3496 | |
3497 | int reflect_UnsafeStaticFieldAccessorImpl::_base_offset; |
3498 | |
3499 | #define UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(macro)macro(_base_offset, k, "base", object_signature, false) \ |
3500 | macro(_base_offset, k, "base", object_signature, false) |
3501 | |
3502 | void reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() { |
3503 | InstanceKlass* k = vmClasses::reflect_UnsafeStaticFieldAccessorImpl_klass(); |
3504 | UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_base_offset, k, "base", vmSymbols::object_signature (), false); |
3505 | } |
3506 | |
3507 | #if INCLUDE_CDS1 |
3508 | void reflect_UnsafeStaticFieldAccessorImpl::serialize_offsets(SerializeClosure* f) { |
3509 | UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_base_offset); |
3510 | } |
3511 | #endif |
3512 | |
3513 | // Support for java_lang_ref_Reference |
3514 | |
3515 | bool java_lang_ref_Reference::_offsets_initialized; |
3516 | |
3517 | int java_lang_ref_Reference::_referent_offset; |
3518 | int java_lang_ref_Reference::_queue_offset; |
3519 | int java_lang_ref_Reference::_next_offset; |
3520 | int java_lang_ref_Reference::_discovered_offset; |
3521 | |
3522 | #define REFERENCE_FIELDS_DO(macro)macro(_referent_offset, k, "referent", object_signature, false ); macro(_queue_offset, k, "queue", referencequeue_signature, false); macro(_next_offset, k, "next", reference_signature, false ); macro(_discovered_offset, k, "discovered", reference_signature , false); \ |
3523 | macro(_referent_offset, k, "referent", object_signature, false); \ |
3524 | macro(_queue_offset, k, "queue", referencequeue_signature, false); \ |
3525 | macro(_next_offset, k, "next", reference_signature, false); \ |
3526 | macro(_discovered_offset, k, "discovered", reference_signature, false); |
3527 | |
3528 | void java_lang_ref_Reference::compute_offsets() { |
3529 | if (_offsets_initialized) { |
3530 | return; |
3531 | } |
3532 | _offsets_initialized = true; |
3533 | InstanceKlass* k = vmClasses::Reference_klass(); |
3534 | REFERENCE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_referent_offset, k, "referent", vmSymbols::object_signature (), false); compute_offset(_queue_offset, k, "queue", vmSymbols ::referencequeue_signature(), false); compute_offset(_next_offset , k, "next", vmSymbols::reference_signature(), false); compute_offset (_discovered_offset, k, "discovered", vmSymbols::reference_signature (), false);; |
3535 | } |
3536 | |
3537 | #if INCLUDE_CDS1 |
3538 | void java_lang_ref_Reference::serialize_offsets(SerializeClosure* f) { |
3539 | f->do_bool(&_offsets_initialized); |
3540 | REFERENCE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_referent_offset); f->do_u4((u4*)& _queue_offset); f->do_u4((u4*)&_next_offset); f->do_u4 ((u4*)&_discovered_offset);; |
3541 | } |
3542 | #endif |
3543 | |
3544 | bool java_lang_ref_Reference::is_referent_field(oop obj, ptrdiff_t offset) { |
3545 | assert(obj != NULL, "sanity")do { if (!(obj != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3545, "assert(" "obj != __null" ") failed", "sanity"); ::breakpoint (); } } while (0); |
3546 | if (offset != _referent_offset) { |
3547 | return false; |
3548 | } |
3549 | |
3550 | Klass* k = obj->klass(); |
3551 | if (!k->is_instance_klass()) { |
3552 | return false; |
3553 | } |
3554 | |
3555 | InstanceKlass* ik = InstanceKlass::cast(obj->klass()); |
3556 | bool is_reference = ik->reference_type() != REF_NONE; |
3557 | assert(!is_reference || ik->is_subclass_of(vmClasses::Reference_klass()), "sanity")do { if (!(!is_reference || ik->is_subclass_of(vmClasses:: Reference_klass()))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3557, "assert(" "!is_reference || ik->is_subclass_of(vmClasses::Reference_klass())" ") failed", "sanity"); ::breakpoint(); } } while (0); |
3558 | return is_reference; |
3559 | } |
3560 | |
3561 | int java_lang_boxing_object::_value_offset; |
3562 | int java_lang_boxing_object::_long_value_offset; |
3563 | |
3564 | #define BOXING_FIELDS_DO(macro)macro(_value_offset, integerKlass, "value", int_signature, false ); macro(_long_value_offset, longKlass, "value", long_signature , false); \ |
3565 | macro(_value_offset, integerKlass, "value", int_signature, false); \ |
3566 | macro(_long_value_offset, longKlass, "value", long_signature, false); |
3567 | |
3568 | void java_lang_boxing_object::compute_offsets() { |
3569 | InstanceKlass* integerKlass = vmClasses::Integer_klass(); |
3570 | InstanceKlass* longKlass = vmClasses::Long_klass(); |
3571 | BOXING_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_value_offset, integerKlass, "value", vmSymbols ::int_signature(), false); compute_offset(_long_value_offset, longKlass, "value", vmSymbols::long_signature(), false);; |
3572 | } |
3573 | |
3574 | #if INCLUDE_CDS1 |
3575 | void java_lang_boxing_object::serialize_offsets(SerializeClosure* f) { |
3576 | BOXING_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_value_offset); f->do_u4((u4*)&_long_value_offset );; |
3577 | } |
3578 | #endif |
3579 | |
3580 | oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPSJavaThread* __the_thread__) { |
3581 | Klass* k = vmClasses::box_klass(type); |
3582 | if (k == NULL__null) return NULL__null; |
3583 | InstanceKlass* ik = InstanceKlass::cast(k); |
3584 | if (!ik->is_initialized()) ik->initialize(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3585 | return ik->allocate_instance(THREAD__the_thread__); |
3586 | } |
3587 | |
3588 | |
3589 | oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPSJavaThread* __the_thread__) { |
3590 | oop box = initialize_and_allocate(type, CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
3591 | if (box == NULL__null) return NULL__null; |
3592 | switch (type) { |
3593 | case T_BOOLEAN: |
3594 | box->bool_field_put(_value_offset, value->z); |
3595 | break; |
3596 | case T_CHAR: |
3597 | box->char_field_put(_value_offset, value->c); |
3598 | break; |
3599 | case T_FLOAT: |
3600 | box->float_field_put(_value_offset, value->f); |
3601 | break; |
3602 | case T_DOUBLE: |
3603 | box->double_field_put(_long_value_offset, value->d); |
3604 | break; |
3605 | case T_BYTE: |
3606 | box->byte_field_put(_value_offset, value->b); |
3607 | break; |
3608 | case T_SHORT: |
3609 | box->short_field_put(_value_offset, value->s); |
3610 | break; |
3611 | case T_INT: |
3612 | box->int_field_put(_value_offset, value->i); |
3613 | break; |
3614 | case T_LONG: |
3615 | box->long_field_put(_long_value_offset, value->j); |
3616 | break; |
3617 | default: |
3618 | return NULL__null; |
3619 | } |
3620 | return box; |
3621 | } |
3622 | |
3623 | |
3624 | BasicType java_lang_boxing_object::basic_type(oop box) { |
3625 | if (box == NULL__null) return T_ILLEGAL; |
3626 | BasicType type = vmClasses::box_klass_type(box->klass()); |
3627 | if (type == T_OBJECT) // 'unknown' value returned by SD::bkt |
3628 | return T_ILLEGAL; |
3629 | return type; |
3630 | } |
3631 | |
3632 | |
3633 | BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) { |
3634 | BasicType type = vmClasses::box_klass_type(box->klass()); |
3635 | switch (type) { |
3636 | case T_BOOLEAN: |
3637 | value->z = box->bool_field(_value_offset); |
3638 | break; |
3639 | case T_CHAR: |
3640 | value->c = box->char_field(_value_offset); |
3641 | break; |
3642 | case T_FLOAT: |
3643 | value->f = box->float_field(_value_offset); |
3644 | break; |
3645 | case T_DOUBLE: |
3646 | value->d = box->double_field(_long_value_offset); |
3647 | break; |
3648 | case T_BYTE: |
3649 | value->b = box->byte_field(_value_offset); |
3650 | break; |
3651 | case T_SHORT: |
3652 | value->s = box->short_field(_value_offset); |
3653 | break; |
3654 | case T_INT: |
3655 | value->i = box->int_field(_value_offset); |
3656 | break; |
3657 | case T_LONG: |
3658 | value->j = box->long_field(_long_value_offset); |
3659 | break; |
3660 | default: |
3661 | return T_ILLEGAL; |
3662 | } // end switch |
3663 | return type; |
3664 | } |
3665 | |
3666 | |
3667 | BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) { |
3668 | BasicType type = vmClasses::box_klass_type(box->klass()); |
3669 | switch (type) { |
3670 | case T_BOOLEAN: |
3671 | box->bool_field_put(_value_offset, value->z); |
3672 | break; |
3673 | case T_CHAR: |
3674 | box->char_field_put(_value_offset, value->c); |
3675 | break; |
3676 | case T_FLOAT: |
3677 | box->float_field_put(_value_offset, value->f); |
3678 | break; |
3679 | case T_DOUBLE: |
3680 | box->double_field_put(_long_value_offset, value->d); |
3681 | break; |
3682 | case T_BYTE: |
3683 | box->byte_field_put(_value_offset, value->b); |
3684 | break; |
3685 | case T_SHORT: |
3686 | box->short_field_put(_value_offset, value->s); |
3687 | break; |
3688 | case T_INT: |
3689 | box->int_field_put(_value_offset, value->i); |
3690 | break; |
3691 | case T_LONG: |
3692 | box->long_field_put(_long_value_offset, value->j); |
3693 | break; |
3694 | default: |
3695 | return T_ILLEGAL; |
3696 | } // end switch |
3697 | return type; |
3698 | } |
3699 | |
3700 | |
3701 | void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) { |
3702 | switch (type) { |
3703 | case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break; |
3704 | case T_CHAR: st->print("%d", value->c); break; |
3705 | case T_BYTE: st->print("%d", value->b); break; |
3706 | case T_SHORT: st->print("%d", value->s); break; |
3707 | case T_INT: st->print("%d", value->i); break; |
3708 | case T_LONG: st->print(JLONG_FORMAT"%" "l" "d", value->j); break; |
3709 | case T_FLOAT: st->print("%f", value->f); break; |
3710 | case T_DOUBLE: st->print("%lf", value->d); break; |
3711 | default: st->print("type %d?", type); break; |
3712 | } |
3713 | } |
3714 | |
3715 | |
3716 | // Support for java_lang_ref_SoftReference |
3717 | // |
3718 | |
3719 | int java_lang_ref_SoftReference::_timestamp_offset; |
3720 | int java_lang_ref_SoftReference::_static_clock_offset; |
3721 | |
3722 | #define SOFTREFERENCE_FIELDS_DO(macro)macro(_timestamp_offset, k, "timestamp", long_signature, false ); macro(_static_clock_offset, k, "clock", long_signature, true ) \ |
3723 | macro(_timestamp_offset, k, "timestamp", long_signature, false); \ |
3724 | macro(_static_clock_offset, k, "clock", long_signature, true) |
3725 | |
3726 | void java_lang_ref_SoftReference::compute_offsets() { |
3727 | InstanceKlass* k = vmClasses::SoftReference_klass(); |
3728 | SOFTREFERENCE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_timestamp_offset, k, "timestamp", vmSymbols:: long_signature(), false); compute_offset(_static_clock_offset , k, "clock", vmSymbols::long_signature(), true); |
3729 | } |
3730 | |
3731 | #if INCLUDE_CDS1 |
3732 | void java_lang_ref_SoftReference::serialize_offsets(SerializeClosure* f) { |
3733 | SOFTREFERENCE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_timestamp_offset); f->do_u4((u4*)& _static_clock_offset); |
3734 | } |
3735 | #endif |
3736 | |
3737 | jlong java_lang_ref_SoftReference::timestamp(oop ref) { |
3738 | return ref->long_field(_timestamp_offset); |
3739 | } |
3740 | |
3741 | jlong java_lang_ref_SoftReference::clock() { |
3742 | InstanceKlass* ik = vmClasses::SoftReference_klass(); |
3743 | oop base = ik->static_field_base_raw(); |
3744 | return base->long_field(_static_clock_offset); |
3745 | } |
3746 | |
3747 | void java_lang_ref_SoftReference::set_clock(jlong value) { |
3748 | InstanceKlass* ik = vmClasses::SoftReference_klass(); |
3749 | oop base = ik->static_field_base_raw(); |
3750 | base->long_field_put(_static_clock_offset, value); |
3751 | } |
3752 | |
3753 | // Support for java_lang_invoke_DirectMethodHandle |
3754 | |
3755 | int java_lang_invoke_DirectMethodHandle::_member_offset; |
3756 | |
3757 | oop java_lang_invoke_DirectMethodHandle::member(oop dmh) { |
3758 | oop member_name = NULL__null; |
3759 | assert(oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle::is_instance(dmh),do { if (!(oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle ::is_instance(dmh))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3760, "assert(" "oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle::is_instance(dmh)" ") failed", "a DirectMethodHandle oop is expected"); ::breakpoint (); } } while (0) |
3760 | "a DirectMethodHandle oop is expected")do { if (!(oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle ::is_instance(dmh))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3760, "assert(" "oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle::is_instance(dmh)" ") failed", "a DirectMethodHandle oop is expected"); ::breakpoint (); } } while (0); |
3761 | return dmh->obj_field(_member_offset); |
3762 | } |
3763 | |
3764 | #define DIRECTMETHODHANDLE_FIELDS_DO(macro)macro(_member_offset, k, "member", java_lang_invoke_MemberName_signature , false) \ |
3765 | macro(_member_offset, k, "member", java_lang_invoke_MemberName_signature, false) |
3766 | |
3767 | void java_lang_invoke_DirectMethodHandle::compute_offsets() { |
3768 | InstanceKlass* k = vmClasses::DirectMethodHandle_klass(); |
3769 | DIRECTMETHODHANDLE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_member_offset, k, "member", vmSymbols::java_lang_invoke_MemberName_signature (), false); |
3770 | } |
3771 | |
3772 | #if INCLUDE_CDS1 |
3773 | void java_lang_invoke_DirectMethodHandle::serialize_offsets(SerializeClosure* f) { |
3774 | DIRECTMETHODHANDLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_member_offset); |
3775 | } |
3776 | #endif |
3777 | |
3778 | // Support for java_lang_invoke_MethodHandle |
3779 | |
3780 | int java_lang_invoke_MethodHandle::_type_offset; |
3781 | int java_lang_invoke_MethodHandle::_form_offset; |
3782 | |
3783 | int java_lang_invoke_MemberName::_clazz_offset; |
3784 | int java_lang_invoke_MemberName::_name_offset; |
3785 | int java_lang_invoke_MemberName::_type_offset; |
3786 | int java_lang_invoke_MemberName::_flags_offset; |
3787 | int java_lang_invoke_MemberName::_method_offset; |
3788 | int java_lang_invoke_MemberName::_vmindex_offset; |
3789 | |
3790 | int java_lang_invoke_ResolvedMethodName::_vmtarget_offset; |
3791 | int java_lang_invoke_ResolvedMethodName::_vmholder_offset; |
3792 | |
3793 | int java_lang_invoke_LambdaForm::_vmentry_offset; |
3794 | |
3795 | #define METHODHANDLE_FIELDS_DO(macro)macro(_type_offset, k, vmSymbols::type_name(), java_lang_invoke_MethodType_signature , false); macro(_form_offset, k, "form", java_lang_invoke_LambdaForm_signature , false) \ |
3796 | macro(_type_offset, k, vmSymbols::type_name(), java_lang_invoke_MethodType_signature, false); \ |
3797 | macro(_form_offset, k, "form", java_lang_invoke_LambdaForm_signature, false) |
3798 | |
3799 | void java_lang_invoke_MethodHandle::compute_offsets() { |
3800 | InstanceKlass* k = vmClasses::MethodHandle_klass(); |
3801 | METHODHANDLE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols ::java_lang_invoke_MethodType_signature(), false); compute_offset (_form_offset, k, "form", vmSymbols::java_lang_invoke_LambdaForm_signature (), false); |
3802 | } |
3803 | |
3804 | #if INCLUDE_CDS1 |
3805 | void java_lang_invoke_MethodHandle::serialize_offsets(SerializeClosure* f) { |
3806 | METHODHANDLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_type_offset); f->do_u4((u4*)&_form_offset ); |
3807 | } |
3808 | #endif |
3809 | |
3810 | #define MEMBERNAME_FIELDS_DO(macro)macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature , false); macro(_name_offset, k, vmSymbols::name_name(), string_signature , false); macro(_type_offset, k, vmSymbols::type_name(), object_signature , false); macro(_flags_offset, k, vmSymbols::flags_name(), int_signature , false); macro(_method_offset, k, vmSymbols::method_name(), java_lang_invoke_ResolvedMethodName_signature , false) \ |
3811 | macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \ |
3812 | macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \ |
3813 | macro(_type_offset, k, vmSymbols::type_name(), object_signature, false); \ |
3814 | macro(_flags_offset, k, vmSymbols::flags_name(), int_signature, false); \ |
3815 | macro(_method_offset, k, vmSymbols::method_name(), java_lang_invoke_ResolvedMethodName_signature, false) |
3816 | |
3817 | void java_lang_invoke_MemberName::compute_offsets() { |
3818 | InstanceKlass* k = vmClasses::MemberName_klass(); |
3819 | MEMBERNAME_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols ::class_signature(), false); compute_offset(_name_offset, k, vmSymbols ::name_name(), vmSymbols::string_signature(), false); compute_offset (_type_offset, k, vmSymbols::type_name(), vmSymbols::object_signature (), false); compute_offset(_flags_offset, k, vmSymbols::flags_name (), vmSymbols::int_signature(), false); compute_offset(_method_offset , k, vmSymbols::method_name(), vmSymbols::java_lang_invoke_ResolvedMethodName_signature (), false); |
3820 | MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_invoke_MemberName::_vmindex_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_invoke_MemberName_vmindex_enum);; |
3821 | } |
3822 | |
3823 | #if INCLUDE_CDS1 |
3824 | void java_lang_invoke_MemberName::serialize_offsets(SerializeClosure* f) { |
3825 | MEMBERNAME_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_clazz_offset); f->do_u4((u4*)&_name_offset ); f->do_u4((u4*)&_type_offset); f->do_u4((u4*)& _flags_offset); f->do_u4((u4*)&_method_offset); |
3826 | MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_vmindex_offset);; |
3827 | } |
3828 | #endif |
3829 | |
3830 | void java_lang_invoke_ResolvedMethodName::compute_offsets() { |
3831 | InstanceKlass* k = vmClasses::ResolvedMethodName_klass(); |
3832 | assert(k != NULL, "jdk mismatch")do { if (!(k != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3832, "assert(" "k != __null" ") failed", "jdk mismatch"); :: breakpoint(); } } while (0); |
3833 | RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_invoke_ResolvedMethodName::_vmholder_offset = JavaClasses ::compute_injected_offset(JavaClasses::java_lang_invoke_ResolvedMethodName_vmholder_enum ); java_lang_invoke_ResolvedMethodName::_vmtarget_offset = JavaClasses ::compute_injected_offset(JavaClasses::java_lang_invoke_ResolvedMethodName_vmtarget_enum );; |
3834 | } |
3835 | |
3836 | #if INCLUDE_CDS1 |
3837 | void java_lang_invoke_ResolvedMethodName::serialize_offsets(SerializeClosure* f) { |
3838 | RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_vmholder_offset); f->do_u4((u4*)& _vmtarget_offset);; |
3839 | } |
3840 | #endif |
3841 | |
3842 | #define LAMBDAFORM_FIELDS_DO(macro)macro(_vmentry_offset, k, "vmentry", java_lang_invoke_MemberName_signature , false) \ |
3843 | macro(_vmentry_offset, k, "vmentry", java_lang_invoke_MemberName_signature, false) |
3844 | |
3845 | void java_lang_invoke_LambdaForm::compute_offsets() { |
3846 | InstanceKlass* k = vmClasses::LambdaForm_klass(); |
3847 | assert (k != NULL, "jdk mismatch")do { if (!(k != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3847, "assert(" "k != __null" ") failed", "jdk mismatch"); :: breakpoint(); } } while (0); |
3848 | LAMBDAFORM_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_vmentry_offset, k, "vmentry", vmSymbols::java_lang_invoke_MemberName_signature (), false); |
3849 | } |
3850 | |
3851 | #if INCLUDE_CDS1 |
3852 | void java_lang_invoke_LambdaForm::serialize_offsets(SerializeClosure* f) { |
3853 | LAMBDAFORM_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_vmentry_offset); |
3854 | } |
3855 | #endif |
3856 | |
3857 | bool java_lang_invoke_LambdaForm::is_instance(oop obj) { |
3858 | return obj != NULL__null && is_subclass(obj->klass()); |
3859 | } |
3860 | |
3861 | int jdk_internal_invoke_NativeEntryPoint::_shadow_space_offset; |
3862 | int jdk_internal_invoke_NativeEntryPoint::_argMoves_offset; |
3863 | int jdk_internal_invoke_NativeEntryPoint::_returnMoves_offset; |
3864 | int jdk_internal_invoke_NativeEntryPoint::_need_transition_offset; |
3865 | int jdk_internal_invoke_NativeEntryPoint::_method_type_offset; |
3866 | int jdk_internal_invoke_NativeEntryPoint::_name_offset; |
3867 | |
3868 | #define NEP_FIELDS_DO(macro)macro(_shadow_space_offset, k, "shadowSpace", int_signature, false ); macro(_argMoves_offset, k, "argMoves", long_array_signature , false); macro(_returnMoves_offset, k, "returnMoves", long_array_signature , false); macro(_need_transition_offset, k, "needTransition", bool_signature, false); macro(_method_type_offset, k, "methodType" , java_lang_invoke_MethodType_signature, false); macro(_name_offset , k, "name", string_signature, false); \ |
3869 | macro(_shadow_space_offset, k, "shadowSpace", int_signature, false); \ |
3870 | macro(_argMoves_offset, k, "argMoves", long_array_signature, false); \ |
3871 | macro(_returnMoves_offset, k, "returnMoves", long_array_signature, false); \ |
3872 | macro(_need_transition_offset, k, "needTransition", bool_signature, false); \ |
3873 | macro(_method_type_offset, k, "methodType", java_lang_invoke_MethodType_signature, false); \ |
3874 | macro(_name_offset, k, "name", string_signature, false); |
3875 | |
3876 | bool jdk_internal_invoke_NativeEntryPoint::is_instance(oop obj) { |
3877 | return obj != NULL__null && is_subclass(obj->klass()); |
3878 | } |
3879 | |
3880 | void jdk_internal_invoke_NativeEntryPoint::compute_offsets() { |
3881 | InstanceKlass* k = vmClasses::NativeEntryPoint_klass(); |
3882 | NEP_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_shadow_space_offset, k, "shadowSpace", vmSymbols ::int_signature(), false); compute_offset(_argMoves_offset, k , "argMoves", vmSymbols::long_array_signature(), false); compute_offset (_returnMoves_offset, k, "returnMoves", vmSymbols::long_array_signature (), false); compute_offset(_need_transition_offset, k, "needTransition" , vmSymbols::bool_signature(), false); compute_offset(_method_type_offset , k, "methodType", vmSymbols::java_lang_invoke_MethodType_signature (), false); compute_offset(_name_offset, k, "name", vmSymbols ::string_signature(), false);; |
3883 | } |
3884 | |
3885 | #if INCLUDE_CDS1 |
3886 | void jdk_internal_invoke_NativeEntryPoint::serialize_offsets(SerializeClosure* f) { |
3887 | NEP_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_shadow_space_offset); f->do_u4((u4* )&_argMoves_offset); f->do_u4((u4*)&_returnMoves_offset ); f->do_u4((u4*)&_need_transition_offset); f->do_u4 ((u4*)&_method_type_offset); f->do_u4((u4*)&_name_offset );; |
3888 | } |
3889 | #endif |
3890 | |
3891 | jint jdk_internal_invoke_NativeEntryPoint::shadow_space(oop entry) { |
3892 | return entry->int_field(_shadow_space_offset); |
3893 | } |
3894 | |
3895 | oop jdk_internal_invoke_NativeEntryPoint::argMoves(oop entry) { |
3896 | return entry->obj_field(_argMoves_offset); |
3897 | } |
3898 | |
3899 | oop jdk_internal_invoke_NativeEntryPoint::returnMoves(oop entry) { |
3900 | return entry->obj_field(_returnMoves_offset); |
3901 | } |
3902 | |
3903 | jboolean jdk_internal_invoke_NativeEntryPoint::need_transition(oop entry) { |
3904 | return entry->bool_field(_need_transition_offset); |
3905 | } |
3906 | |
3907 | oop jdk_internal_invoke_NativeEntryPoint::method_type(oop entry) { |
3908 | return entry->obj_field(_method_type_offset); |
3909 | } |
3910 | |
3911 | oop jdk_internal_invoke_NativeEntryPoint::name(oop entry) { |
3912 | return entry->obj_field(_name_offset); |
3913 | } |
3914 | |
3915 | oop java_lang_invoke_MethodHandle::type(oop mh) { |
3916 | return mh->obj_field(_type_offset); |
3917 | } |
3918 | |
3919 | void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) { |
3920 | mh->obj_field_put(_type_offset, mtype); |
3921 | } |
3922 | |
3923 | oop java_lang_invoke_MethodHandle::form(oop mh) { |
3924 | assert(_form_offset != 0, "")do { if (!(_form_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3924, "assert(" "_form_offset != 0" ") failed", ""); ::breakpoint (); } } while (0); |
3925 | return mh->obj_field(_form_offset); |
3926 | } |
3927 | |
3928 | void java_lang_invoke_MethodHandle::set_form(oop mh, oop lform) { |
3929 | assert(_form_offset != 0, "")do { if (!(_form_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3929, "assert(" "_form_offset != 0" ") failed", ""); ::breakpoint (); } } while (0); |
3930 | mh->obj_field_put(_form_offset, lform); |
3931 | } |
3932 | |
3933 | /// MemberName accessors |
3934 | |
3935 | oop java_lang_invoke_MemberName::clazz(oop mname) { |
3936 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3936, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3937 | return mname->obj_field(_clazz_offset); |
3938 | } |
3939 | |
3940 | void java_lang_invoke_MemberName::set_clazz(oop mname, oop clazz) { |
3941 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3941, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3942 | mname->obj_field_put(_clazz_offset, clazz); |
3943 | } |
3944 | |
3945 | oop java_lang_invoke_MemberName::name(oop mname) { |
3946 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3946, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3947 | return mname->obj_field(_name_offset); |
3948 | } |
3949 | |
3950 | void java_lang_invoke_MemberName::set_name(oop mname, oop name) { |
3951 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3951, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3952 | mname->obj_field_put(_name_offset, name); |
3953 | } |
3954 | |
3955 | oop java_lang_invoke_MemberName::type(oop mname) { |
3956 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3956, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3957 | return mname->obj_field(_type_offset); |
3958 | } |
3959 | |
3960 | void java_lang_invoke_MemberName::set_type(oop mname, oop type) { |
3961 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3961, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3962 | mname->obj_field_put(_type_offset, type); |
3963 | } |
3964 | |
3965 | int java_lang_invoke_MemberName::flags(oop mname) { |
3966 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3966, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3967 | return mname->int_field(_flags_offset); |
3968 | } |
3969 | |
3970 | void java_lang_invoke_MemberName::set_flags(oop mname, int flags) { |
3971 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3971, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3972 | mname->int_field_put(_flags_offset, flags); |
3973 | } |
3974 | |
3975 | |
3976 | // Return vmtarget from ResolvedMethodName method field through indirection |
3977 | Method* java_lang_invoke_MemberName::vmtarget(oop mname) { |
3978 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3978, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3979 | oop method = mname->obj_field(_method_offset); |
3980 | return method == NULL__null ? NULL__null : java_lang_invoke_ResolvedMethodName::vmtarget(method); |
3981 | } |
3982 | |
3983 | bool java_lang_invoke_MemberName::is_method(oop mname) { |
3984 | assert(is_instance(mname), "must be MemberName")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3984, "assert(" "is_instance(mname)" ") failed", "must be MemberName" ); ::breakpoint(); } } while (0); |
3985 | return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0; |
3986 | } |
3987 | |
3988 | void java_lang_invoke_MemberName::set_method(oop mname, oop resolved_method) { |
3989 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3989, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3990 | mname->obj_field_put(_method_offset, resolved_method); |
3991 | } |
3992 | |
3993 | intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { |
3994 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3994, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
3995 | return (intptr_t) mname->address_field(_vmindex_offset); |
3996 | } |
3997 | |
3998 | void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) { |
3999 | assert(is_instance(mname), "wrong type")do { if (!(is_instance(mname))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 3999, "assert(" "is_instance(mname)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
4000 | mname->address_field_put(_vmindex_offset, (address) index); |
4001 | } |
4002 | |
4003 | |
4004 | Method* java_lang_invoke_ResolvedMethodName::vmtarget(oop resolved_method) { |
4005 | assert(is_instance(resolved_method), "wrong type")do { if (!(is_instance(resolved_method))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4005, "assert(" "is_instance(resolved_method)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
4006 | Method* m = (Method*)resolved_method->address_field(_vmtarget_offset); |
4007 | assert(m->is_method(), "must be")do { if (!(m->is_method())) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4007, "assert(" "m->is_method()" ") failed", "must be"); ::breakpoint(); } } while (0); |
4008 | return m; |
4009 | } |
4010 | |
4011 | // Used by redefinition to change Method* to new Method* with same hash (name, signature) |
4012 | void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) { |
4013 | assert(is_instance(resolved_method), "wrong type")do { if (!(is_instance(resolved_method))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4013, "assert(" "is_instance(resolved_method)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
4014 | resolved_method->address_field_put(_vmtarget_offset, (address)m); |
4015 | } |
4016 | |
4017 | void java_lang_invoke_ResolvedMethodName::set_vmholder(oop resolved_method, oop holder) { |
4018 | assert(is_instance(resolved_method), "wrong type")do { if (!(is_instance(resolved_method))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4018, "assert(" "is_instance(resolved_method)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
4019 | resolved_method->obj_field_put(_vmholder_offset, holder); |
4020 | } |
4021 | |
4022 | oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPSJavaThread* __the_thread__) { |
4023 | const Method* method = m(); |
4024 | |
4025 | // lookup ResolvedMethod oop in the table, or create a new one and intern it |
4026 | oop resolved_method = ResolvedMethodTable::find_method(method); |
4027 | if (resolved_method != NULL__null) { |
4028 | return resolved_method; |
4029 | } |
4030 | |
4031 | InstanceKlass* k = vmClasses::ResolvedMethodName_klass(); |
4032 | if (!k->is_initialized()) { |
4033 | k->initialize(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
4034 | } |
4035 | |
4036 | oop new_resolved_method = k->allocate_instance(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
4037 | |
4038 | NoSafepointVerifier nsv; |
4039 | |
4040 | if (method->is_old()) { |
4041 | method = (method->is_deleted()) ? Universe::throw_no_such_method_error() : |
4042 | method->get_new_method(); |
4043 | } |
4044 | |
4045 | InstanceKlass* holder = method->method_holder(); |
4046 | |
4047 | set_vmtarget(new_resolved_method, const_cast<Method*>(method)); |
4048 | // Add a reference to the loader (actually mirror because hidden classes may not have |
4049 | // distinct loaders) to ensure the metadata is kept alive. |
4050 | // This mirror may be different than the one in clazz field. |
4051 | set_vmholder(new_resolved_method, holder->java_mirror()); |
4052 | |
4053 | // Set flag in class to indicate this InstanceKlass has entries in the table |
4054 | // to avoid walking table during redefinition if none of the redefined classes |
4055 | // have any membernames in the table. |
4056 | holder->set_has_resolved_methods(); |
4057 | |
4058 | return ResolvedMethodTable::add_method(method, Handle(THREAD__the_thread__, new_resolved_method)); |
4059 | } |
4060 | |
4061 | oop java_lang_invoke_LambdaForm::vmentry(oop lform) { |
4062 | assert(is_instance(lform), "wrong type")do { if (!(is_instance(lform))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4062, "assert(" "is_instance(lform)" ") failed", "wrong type" ); ::breakpoint(); } } while (0); |
4063 | return lform->obj_field(_vmentry_offset); |
4064 | } |
4065 | |
4066 | |
4067 | // Support for java_lang_invoke_MethodType |
4068 | |
4069 | int java_lang_invoke_MethodType::_rtype_offset; |
4070 | int java_lang_invoke_MethodType::_ptypes_offset; |
4071 | |
4072 | #define METHODTYPE_FIELDS_DO(macro)macro(_rtype_offset, k, "rtype", class_signature, false); macro (_ptypes_offset, k, "ptypes", class_array_signature, false) \ |
4073 | macro(_rtype_offset, k, "rtype", class_signature, false); \ |
4074 | macro(_ptypes_offset, k, "ptypes", class_array_signature, false) |
4075 | |
4076 | void java_lang_invoke_MethodType::compute_offsets() { |
4077 | InstanceKlass* k = vmClasses::MethodType_klass(); |
4078 | METHODTYPE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_rtype_offset, k, "rtype", vmSymbols::class_signature (), false); compute_offset(_ptypes_offset, k, "ptypes", vmSymbols ::class_array_signature(), false); |
4079 | } |
4080 | |
4081 | #if INCLUDE_CDS1 |
4082 | void java_lang_invoke_MethodType::serialize_offsets(SerializeClosure* f) { |
4083 | METHODTYPE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_rtype_offset); f->do_u4((u4*)&_ptypes_offset ); |
4084 | } |
4085 | #endif |
4086 | |
4087 | void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) { |
4088 | st->print("("); |
4089 | objArrayOop pts = ptypes(mt); |
4090 | for (int i = 0, limit = pts->length(); i < limit; i++) { |
4091 | java_lang_Class::print_signature(pts->obj_at(i), st); |
4092 | } |
4093 | st->print(")"); |
4094 | java_lang_Class::print_signature(rtype(mt), st); |
4095 | } |
4096 | |
4097 | Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found) { |
4098 | ResourceMark rm; |
4099 | stringStream buffer(128); |
4100 | print_signature(mt, &buffer); |
4101 | const char* sigstr = buffer.base(); |
4102 | int siglen = (int) buffer.size(); |
4103 | Symbol *name; |
4104 | if (!intern_if_not_found) { |
4105 | name = SymbolTable::probe(sigstr, siglen); |
4106 | } else { |
4107 | name = SymbolTable::new_symbol(sigstr, siglen); |
4108 | } |
4109 | return name; |
4110 | } |
4111 | |
4112 | bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) { |
4113 | if (mt1 == mt2) |
4114 | return true; |
4115 | if (rtype(mt1) != rtype(mt2)) |
4116 | return false; |
4117 | if (ptype_count(mt1) != ptype_count(mt2)) |
4118 | return false; |
4119 | for (int i = ptype_count(mt1) - 1; i >= 0; i--) { |
4120 | if (ptype(mt1, i) != ptype(mt2, i)) |
4121 | return false; |
4122 | } |
4123 | return true; |
4124 | } |
4125 | |
4126 | oop java_lang_invoke_MethodType::rtype(oop mt) { |
4127 | assert(is_instance(mt), "must be a MethodType")do { if (!(is_instance(mt))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4127, "assert(" "is_instance(mt)" ") failed", "must be a MethodType" ); ::breakpoint(); } } while (0); |
4128 | return mt->obj_field(_rtype_offset); |
4129 | } |
4130 | |
4131 | objArrayOop java_lang_invoke_MethodType::ptypes(oop mt) { |
4132 | assert(is_instance(mt), "must be a MethodType")do { if (!(is_instance(mt))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4132, "assert(" "is_instance(mt)" ") failed", "must be a MethodType" ); ::breakpoint(); } } while (0); |
4133 | return (objArrayOop) mt->obj_field(_ptypes_offset); |
4134 | } |
4135 | |
4136 | oop java_lang_invoke_MethodType::ptype(oop mt, int idx) { |
4137 | return ptypes(mt)->obj_at(idx); |
4138 | } |
4139 | |
4140 | int java_lang_invoke_MethodType::ptype_count(oop mt) { |
4141 | return ptypes(mt)->length(); |
4142 | } |
4143 | |
4144 | int java_lang_invoke_MethodType::ptype_slot_count(oop mt) { |
4145 | objArrayOop pts = ptypes(mt); |
4146 | int count = pts->length(); |
4147 | int slots = 0; |
4148 | for (int i = 0; i < count; i++) { |
4149 | BasicType bt = java_lang_Class::as_BasicType(pts->obj_at(i)); |
4150 | slots += type2size[bt]; |
4151 | } |
4152 | return slots; |
4153 | } |
4154 | |
4155 | int java_lang_invoke_MethodType::rtype_slot_count(oop mt) { |
4156 | BasicType bt = java_lang_Class::as_BasicType(rtype(mt)); |
4157 | return type2size[bt]; |
4158 | } |
4159 | |
4160 | |
4161 | // Support for java_lang_invoke_CallSite |
4162 | |
4163 | int java_lang_invoke_CallSite::_target_offset; |
4164 | int java_lang_invoke_CallSite::_context_offset; |
4165 | |
4166 | #define CALLSITE_FIELDS_DO(macro)macro(_target_offset, k, "target", java_lang_invoke_MethodHandle_signature , false); macro(_context_offset, k, "context", java_lang_invoke_MethodHandleNatives_CallSiteContext_signature , false) \ |
4167 | macro(_target_offset, k, "target", java_lang_invoke_MethodHandle_signature, false); \ |
4168 | macro(_context_offset, k, "context", java_lang_invoke_MethodHandleNatives_CallSiteContext_signature, false) |
4169 | |
4170 | void java_lang_invoke_CallSite::compute_offsets() { |
4171 | InstanceKlass* k = vmClasses::CallSite_klass(); |
4172 | CALLSITE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_target_offset, k, "target", vmSymbols::java_lang_invoke_MethodHandle_signature (), false); compute_offset(_context_offset, k, "context", vmSymbols ::java_lang_invoke_MethodHandleNatives_CallSiteContext_signature (), false); |
4173 | } |
4174 | |
4175 | #if INCLUDE_CDS1 |
4176 | void java_lang_invoke_CallSite::serialize_offsets(SerializeClosure* f) { |
4177 | CALLSITE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_target_offset); f->do_u4((u4*)& _context_offset); |
4178 | } |
4179 | #endif |
4180 | |
4181 | oop java_lang_invoke_CallSite::context_no_keepalive(oop call_site) { |
4182 | assert(java_lang_invoke_CallSite::is_instance(call_site), "")do { if (!(java_lang_invoke_CallSite::is_instance(call_site)) ) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4182, "assert(" "java_lang_invoke_CallSite::is_instance(call_site)" ") failed", ""); ::breakpoint(); } } while (0); |
4183 | |
4184 | oop dep_oop = call_site->obj_field_access<AS_NO_KEEPALIVE>(_context_offset); |
4185 | return dep_oop; |
4186 | } |
4187 | |
4188 | // Support for java_lang_invoke_ConstantCallSite |
4189 | |
4190 | int java_lang_invoke_ConstantCallSite::_is_frozen_offset; |
4191 | |
4192 | #define CONSTANTCALLSITE_FIELDS_DO(macro)macro(_is_frozen_offset, k, "isFrozen", bool_signature, false ) \ |
4193 | macro(_is_frozen_offset, k, "isFrozen", bool_signature, false) |
4194 | |
4195 | void java_lang_invoke_ConstantCallSite::compute_offsets() { |
4196 | InstanceKlass* k = vmClasses::ConstantCallSite_klass(); |
4197 | CONSTANTCALLSITE_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_is_frozen_offset, k, "isFrozen", vmSymbols::bool_signature (), false); |
4198 | } |
4199 | |
4200 | #if INCLUDE_CDS1 |
4201 | void java_lang_invoke_ConstantCallSite::serialize_offsets(SerializeClosure* f) { |
4202 | CONSTANTCALLSITE_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_is_frozen_offset); |
4203 | } |
4204 | #endif |
4205 | |
4206 | // Support for java_lang_invoke_MethodHandleNatives_CallSiteContext |
4207 | |
4208 | int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset; |
4209 | int java_lang_invoke_MethodHandleNatives_CallSiteContext::_last_cleanup_offset; |
4210 | |
4211 | void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() { |
4212 | InstanceKlass* k = vmClasses::Context_klass(); |
Value stored to 'k' during its initialization is never read | |
4213 | CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset = JavaClasses::compute_injected_offset(JavaClasses::java_lang_invoke_MethodHandleNatives_CallSiteContext_vmdependencies_enum ); java_lang_invoke_MethodHandleNatives_CallSiteContext::_last_cleanup_offset = JavaClasses::compute_injected_offset(JavaClasses::java_lang_invoke_MethodHandleNatives_CallSiteContext_last_cleanup_enum );; |
4214 | } |
4215 | |
4216 | #if INCLUDE_CDS1 |
4217 | void java_lang_invoke_MethodHandleNatives_CallSiteContext::serialize_offsets(SerializeClosure* f) { |
4218 | CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_vmdependencies_offset); f->do_u4((u4 *)&_last_cleanup_offset);; |
4219 | } |
4220 | #endif |
4221 | |
4222 | DependencyContext java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) { |
4223 | assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "")do { if (!(java_lang_invoke_MethodHandleNatives_CallSiteContext ::is_instance(call_site))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4223, "assert(" "java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site)" ") failed", ""); ::breakpoint(); } } while (0); |
4224 | nmethodBucket* volatile* vmdeps_addr = call_site->field_addr<nmethodBucket* volatile>(_vmdependencies_offset); |
4225 | volatile uint64_t* last_cleanup_addr = call_site->field_addr<volatile uint64_t>(_last_cleanup_offset); |
4226 | DependencyContext dep_ctx(vmdeps_addr, last_cleanup_addr); |
4227 | return dep_ctx; |
4228 | } |
4229 | |
4230 | // Support for java_security_AccessControlContext |
4231 | |
4232 | int java_security_AccessControlContext::_context_offset; |
4233 | int java_security_AccessControlContext::_privilegedContext_offset; |
4234 | int java_security_AccessControlContext::_isPrivileged_offset; |
4235 | int java_security_AccessControlContext::_isAuthorized_offset; |
4236 | |
4237 | #define ACCESSCONTROLCONTEXT_FIELDS_DO(macro)macro(_context_offset, k, "context", protectiondomain_signature , false); macro(_privilegedContext_offset, k, "privilegedContext" , accesscontrolcontext_signature, false); macro(_isPrivileged_offset , k, "isPrivileged", bool_signature, false); macro(_isAuthorized_offset , k, "isAuthorized", bool_signature, false) \ |
4238 | macro(_context_offset, k, "context", protectiondomain_signature, false); \ |
4239 | macro(_privilegedContext_offset, k, "privilegedContext", accesscontrolcontext_signature, false); \ |
4240 | macro(_isPrivileged_offset, k, "isPrivileged", bool_signature, false); \ |
4241 | macro(_isAuthorized_offset, k, "isAuthorized", bool_signature, false) |
4242 | |
4243 | void java_security_AccessControlContext::compute_offsets() { |
4244 | assert(_isPrivileged_offset == 0, "offsets should be initialized only once")do { if (!(_isPrivileged_offset == 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4244, "assert(" "_isPrivileged_offset == 0" ") failed", "offsets should be initialized only once" ); ::breakpoint(); } } while (0); |
4245 | InstanceKlass* k = vmClasses::AccessControlContext_klass(); |
4246 | ACCESSCONTROLCONTEXT_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_context_offset, k, "context", vmSymbols::protectiondomain_signature (), false); compute_offset(_privilegedContext_offset, k, "privilegedContext" , vmSymbols::accesscontrolcontext_signature(), false); compute_offset (_isPrivileged_offset, k, "isPrivileged", vmSymbols::bool_signature (), false); compute_offset(_isAuthorized_offset, k, "isAuthorized" , vmSymbols::bool_signature(), false); |
4247 | } |
4248 | |
4249 | #if INCLUDE_CDS1 |
4250 | void java_security_AccessControlContext::serialize_offsets(SerializeClosure* f) { |
4251 | ACCESSCONTROLCONTEXT_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_context_offset); f->do_u4((u4*)& _privilegedContext_offset); f->do_u4((u4*)&_isPrivileged_offset ); f->do_u4((u4*)&_isAuthorized_offset); |
4252 | } |
4253 | #endif |
4254 | |
4255 | oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPSJavaThread* __the_thread__) { |
4256 | assert(_isPrivileged_offset != 0, "offsets should have been initialized")do { if (!(_isPrivileged_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4256, "assert(" "_isPrivileged_offset != 0" ") failed", "offsets should have been initialized" ); ::breakpoint(); } } while (0); |
4257 | assert(_isAuthorized_offset != 0, "offsets should have been initialized")do { if (!(_isAuthorized_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4257, "assert(" "_isAuthorized_offset != 0" ") failed", "offsets should have been initialized" ); ::breakpoint(); } } while (0); |
4258 | // Ensure klass is initialized |
4259 | vmClasses::AccessControlContext_klass()->initialize(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
4260 | // Allocate result |
4261 | oop result = vmClasses::AccessControlContext_klass()->allocate_instance(CHECK_NULL__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) return __null; (void)(0); |
4262 | // Fill in values |
4263 | result->obj_field_put(_context_offset, context()); |
4264 | result->obj_field_put(_privilegedContext_offset, privileged_context()); |
4265 | result->bool_field_put(_isPrivileged_offset, isPrivileged); |
4266 | result->bool_field_put(_isAuthorized_offset, true); |
4267 | return result; |
4268 | } |
4269 | |
4270 | |
4271 | // Support for java_lang_ClassLoader |
4272 | |
4273 | int java_lang_ClassLoader::_loader_data_offset; |
4274 | int java_lang_ClassLoader::_parallelCapable_offset; |
4275 | int java_lang_ClassLoader::_name_offset; |
4276 | int java_lang_ClassLoader::_nameAndId_offset; |
4277 | int java_lang_ClassLoader::_unnamedModule_offset; |
4278 | int java_lang_ClassLoader::_parent_offset; |
4279 | |
4280 | ClassLoaderData* java_lang_ClassLoader::loader_data_acquire(oop loader) { |
4281 | assert(loader != NULL, "loader must not be NULL")do { if (!(loader != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4281, "assert(" "loader != __null" ") failed", "loader must not be NULL" ); ::breakpoint(); } } while (0); |
4282 | assert(oopDesc::is_oop(loader), "loader must be oop")do { if (!(oopDesc::is_oop(loader))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4282, "assert(" "oopDesc::is_oop(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4283 | return Atomic::load_acquire(loader->field_addr<ClassLoaderData*>(_loader_data_offset)); |
4284 | } |
4285 | |
4286 | ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) { |
4287 | assert(loader != NULL, "loader must not be NULL")do { if (!(loader != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4287, "assert(" "loader != __null" ") failed", "loader must not be NULL" ); ::breakpoint(); } } while (0); |
4288 | assert(oopDesc::is_oop(loader), "loader must be oop")do { if (!(oopDesc::is_oop(loader))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4288, "assert(" "oopDesc::is_oop(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4289 | return *loader->field_addr<ClassLoaderData*>(_loader_data_offset); |
4290 | } |
4291 | |
4292 | void java_lang_ClassLoader::release_set_loader_data(oop loader, ClassLoaderData* new_data) { |
4293 | assert(loader != NULL, "loader must not be NULL")do { if (!(loader != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4293, "assert(" "loader != __null" ") failed", "loader must not be NULL" ); ::breakpoint(); } } while (0); |
4294 | assert(oopDesc::is_oop(loader), "loader must be oop")do { if (!(oopDesc::is_oop(loader))) { (*g_assert_poison) = 'X' ;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4294, "assert(" "oopDesc::is_oop(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4295 | Atomic::release_store(loader->field_addr<ClassLoaderData*>(_loader_data_offset), new_data); |
4296 | } |
4297 | |
4298 | #define CLASSLOADER_FIELDS_DO(macro)macro(_parallelCapable_offset, k1, "parallelLockMap", concurrenthashmap_signature , false); macro(_name_offset, k1, vmSymbols::name_name(), string_signature , false); macro(_nameAndId_offset, k1, "nameAndId", string_signature , false); macro(_unnamedModule_offset, k1, "unnamedModule", module_signature , false); macro(_parent_offset, k1, "parent", classloader_signature , false) \ |
4299 | macro(_parallelCapable_offset, k1, "parallelLockMap", concurrenthashmap_signature, false); \ |
4300 | macro(_name_offset, k1, vmSymbols::name_name(), string_signature, false); \ |
4301 | macro(_nameAndId_offset, k1, "nameAndId", string_signature, false); \ |
4302 | macro(_unnamedModule_offset, k1, "unnamedModule", module_signature, false); \ |
4303 | macro(_parent_offset, k1, "parent", classloader_signature, false) |
4304 | |
4305 | void java_lang_ClassLoader::compute_offsets() { |
4306 | InstanceKlass* k1 = vmClasses::ClassLoader_klass(); |
4307 | CLASSLOADER_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_parallelCapable_offset, k1, "parallelLockMap" , vmSymbols::concurrenthashmap_signature(), false); compute_offset (_name_offset, k1, vmSymbols::name_name(), vmSymbols::string_signature (), false); compute_offset(_nameAndId_offset, k1, "nameAndId" , vmSymbols::string_signature(), false); compute_offset(_unnamedModule_offset , k1, "unnamedModule", vmSymbols::module_signature(), false); compute_offset(_parent_offset, k1, "parent", vmSymbols::classloader_signature (), false); |
4308 | |
4309 | CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_ClassLoader::_loader_data_offset = JavaClasses::compute_injected_offset (JavaClasses::java_lang_ClassLoader_loader_data_enum);; |
4310 | } |
4311 | |
4312 | #if INCLUDE_CDS1 |
4313 | void java_lang_ClassLoader::serialize_offsets(SerializeClosure* f) { |
4314 | CLASSLOADER_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_parallelCapable_offset); f->do_u4(( u4*)&_name_offset); f->do_u4((u4*)&_nameAndId_offset ); f->do_u4((u4*)&_unnamedModule_offset); f->do_u4( (u4*)&_parent_offset); |
4315 | CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_loader_data_offset);; |
4316 | } |
4317 | #endif |
4318 | |
4319 | oop java_lang_ClassLoader::parent(oop loader) { |
4320 | assert(is_instance(loader), "loader must be oop")do { if (!(is_instance(loader))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4320, "assert(" "is_instance(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4321 | return loader->obj_field(_parent_offset); |
4322 | } |
4323 | |
4324 | // Returns the name field of this class loader. If the name field has not |
4325 | // been set, null will be returned. |
4326 | oop java_lang_ClassLoader::name(oop loader) { |
4327 | assert(is_instance(loader), "loader must be oop")do { if (!(is_instance(loader))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4327, "assert(" "is_instance(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4328 | return loader->obj_field(_name_offset); |
4329 | } |
4330 | |
4331 | // Returns the nameAndId field of this class loader. The format is |
4332 | // as follows: |
4333 | // If the defining loader has a name explicitly set then '<loader-name>' @<id> |
4334 | // If the defining loader has no name then <qualified-class-name> @<id> |
4335 | // If built-in loader, then omit '@<id>' as there is only one instance. |
4336 | // Use ClassLoader::loader_name_id() to obtain this String as a char*. |
4337 | oop java_lang_ClassLoader::nameAndId(oop loader) { |
4338 | assert(is_instance(loader), "loader must be oop")do { if (!(is_instance(loader))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4338, "assert(" "is_instance(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4339 | return loader->obj_field(_nameAndId_offset); |
4340 | } |
4341 | |
4342 | bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) { |
4343 | assert(is_instance(loader), "loader must be oop")do { if (!(is_instance(loader))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4343, "assert(" "is_instance(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4344 | assert(cl == NULL || is_instance(cl), "cl argument must be oop")do { if (!(cl == __null || is_instance(cl))) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4344, "assert(" "cl == __null || is_instance(cl)" ") failed" , "cl argument must be oop"); ::breakpoint(); } } while (0); |
4345 | oop acl = loader; |
4346 | debug_only(jint loop_count = 0)jint loop_count = 0; |
4347 | // This loop taken verbatim from ClassLoader.java: |
4348 | do { |
4349 | acl = parent(acl); |
4350 | if (cl == acl) { |
4351 | return true; |
4352 | } |
4353 | assert(++loop_count > 0, "loop_count overflow")do { if (!(++loop_count > 0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4353, "assert(" "++loop_count > 0" ") failed", "loop_count overflow" ); ::breakpoint(); } } while (0); |
4354 | } while (acl != NULL__null); |
4355 | return false; |
4356 | } |
4357 | |
4358 | bool java_lang_ClassLoader::is_instance(oop obj) { |
4359 | return obj != NULL__null && is_subclass(obj->klass()); |
4360 | } |
4361 | |
4362 | |
4363 | // For class loader classes, parallelCapable defined |
4364 | // based on non-null field |
4365 | // Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it |
4366 | bool java_lang_ClassLoader::parallelCapable(oop class_loader) { |
4367 | assert(_parallelCapable_offset != 0, "offsets should have been initialized")do { if (!(_parallelCapable_offset != 0)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4367, "assert(" "_parallelCapable_offset != 0" ") failed", "offsets should have been initialized" ); ::breakpoint(); } } while (0); |
4368 | return (class_loader->obj_field(_parallelCapable_offset) != NULL__null); |
4369 | } |
4370 | |
4371 | bool java_lang_ClassLoader::is_trusted_loader(oop loader) { |
4372 | // Fix for 4474172; see evaluation for more details |
4373 | loader = non_reflection_class_loader(loader); |
4374 | |
4375 | oop cl = SystemDictionary::java_system_loader(); |
4376 | while(cl != NULL__null) { |
4377 | if (cl == loader) return true; |
4378 | cl = parent(cl); |
4379 | } |
4380 | return false; |
4381 | } |
4382 | |
4383 | // Return true if this is one of the class loaders associated with |
4384 | // the generated bytecodes for reflection. |
4385 | bool java_lang_ClassLoader::is_reflection_class_loader(oop loader) { |
4386 | if (loader != NULL__null) { |
4387 | Klass* delegating_cl_class = vmClasses::reflect_DelegatingClassLoader_klass(); |
4388 | // This might be null in non-1.4 JDKs |
4389 | return (delegating_cl_class != NULL__null && loader->is_a(delegating_cl_class)); |
4390 | } |
4391 | return false; |
4392 | } |
4393 | |
4394 | oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) { |
4395 | // See whether this is one of the class loaders associated with |
4396 | // the generated bytecodes for reflection, and if so, "magically" |
4397 | // delegate to its parent to prevent class loading from occurring |
4398 | // in places where applications using reflection didn't expect it. |
4399 | if (is_reflection_class_loader(loader)) { |
4400 | return parent(loader); |
4401 | } |
4402 | return loader; |
4403 | } |
4404 | |
4405 | oop java_lang_ClassLoader::unnamedModule(oop loader) { |
4406 | assert(is_instance(loader), "loader must be oop")do { if (!(is_instance(loader))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4406, "assert(" "is_instance(loader)" ") failed", "loader must be oop" ); ::breakpoint(); } } while (0); |
4407 | return loader->obj_field(_unnamedModule_offset); |
4408 | } |
4409 | |
4410 | // Support for java_lang_System |
4411 | // |
4412 | |
4413 | int java_lang_System::_static_in_offset; |
4414 | int java_lang_System::_static_out_offset; |
4415 | int java_lang_System::_static_err_offset; |
4416 | int java_lang_System::_static_security_offset; |
4417 | int java_lang_System::_static_allow_security_offset; |
4418 | int java_lang_System::_static_never_offset; |
4419 | |
4420 | #define SYSTEM_FIELDS_DO(macro)macro(_static_in_offset, k, "in", input_stream_signature, true ); macro(_static_out_offset, k, "out", print_stream_signature , true); macro(_static_err_offset, k, "err", print_stream_signature , true); macro(_static_security_offset, k, "security", security_manager_signature , true); macro(_static_allow_security_offset, k, "allowSecurityManager" , int_signature, true); macro(_static_never_offset, k, "NEVER" , int_signature, true) \ |
4421 | macro(_static_in_offset, k, "in", input_stream_signature, true); \ |
4422 | macro(_static_out_offset, k, "out", print_stream_signature, true); \ |
4423 | macro(_static_err_offset, k, "err", print_stream_signature, true); \ |
4424 | macro(_static_security_offset, k, "security", security_manager_signature, true); \ |
4425 | macro(_static_allow_security_offset, k, "allowSecurityManager", int_signature, true); \ |
4426 | macro(_static_never_offset, k, "NEVER", int_signature, true) |
4427 | |
4428 | void java_lang_System::compute_offsets() { |
4429 | InstanceKlass* k = vmClasses::System_klass(); |
4430 | SYSTEM_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_static_in_offset, k, "in", vmSymbols::input_stream_signature (), true); compute_offset(_static_out_offset, k, "out", vmSymbols ::print_stream_signature(), true); compute_offset(_static_err_offset , k, "err", vmSymbols::print_stream_signature(), true); compute_offset (_static_security_offset, k, "security", vmSymbols::security_manager_signature (), true); compute_offset(_static_allow_security_offset, k, "allowSecurityManager" , vmSymbols::int_signature(), true); compute_offset(_static_never_offset , k, "NEVER", vmSymbols::int_signature(), true); |
4431 | } |
4432 | |
4433 | // This field tells us that a security manager can never be installed so we |
4434 | // can completely skip populating the ProtectionDomainCacheTable. |
4435 | bool java_lang_System::allow_security_manager() { |
4436 | static int initialized = false; |
4437 | static bool allowed = true; // default |
4438 | if (!initialized) { |
4439 | oop base = vmClasses::System_klass()->static_field_base_raw(); |
4440 | int never = base->int_field(_static_never_offset); |
4441 | allowed = (base->int_field(_static_allow_security_offset) != never); |
4442 | initialized = true; |
4443 | } |
4444 | return allowed; |
4445 | } |
4446 | |
4447 | // This field tells us that a security manager is installed. |
4448 | bool java_lang_System::has_security_manager() { |
4449 | oop base = vmClasses::System_klass()->static_field_base_raw(); |
4450 | return base->obj_field(_static_security_offset) != NULL__null; |
4451 | } |
4452 | |
4453 | #if INCLUDE_CDS1 |
4454 | void java_lang_System::serialize_offsets(SerializeClosure* f) { |
4455 | SYSTEM_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_static_in_offset); f->do_u4((u4*)& _static_out_offset); f->do_u4((u4*)&_static_err_offset ); f->do_u4((u4*)&_static_security_offset); f->do_u4 ((u4*)&_static_allow_security_offset); f->do_u4((u4*)& _static_never_offset); |
4456 | } |
4457 | #endif |
4458 | |
4459 | // Support for jdk_internal_misc_UnsafeConstants |
4460 | // |
4461 | class UnsafeConstantsFixup : public FieldClosure { |
4462 | private: |
4463 | int _address_size; |
4464 | int _page_size; |
4465 | bool _big_endian; |
4466 | bool _use_unaligned_access; |
4467 | int _data_cache_line_flush_size; |
4468 | public: |
4469 | UnsafeConstantsFixup() { |
4470 | // round up values for all static final fields |
4471 | _address_size = sizeof(void*); |
4472 | _page_size = os::vm_page_size(); |
4473 | _big_endian = LITTLE_ENDIAN_ONLY(false)false BIG_ENDIAN_ONLY(true); |
4474 | _use_unaligned_access = UseUnalignedAccesses; |
4475 | _data_cache_line_flush_size = (int)VM_Version::data_cache_line_flush_size(); |
4476 | } |
4477 | |
4478 | void do_field(fieldDescriptor* fd) { |
4479 | oop mirror = fd->field_holder()->java_mirror(); |
4480 | assert(mirror != NULL, "UnsafeConstants must have mirror already")do { if (!(mirror != __null)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4480, "assert(" "mirror != __null" ") failed", "UnsafeConstants must have mirror already" ); ::breakpoint(); } } while (0); |
4481 | assert(fd->field_holder() == vmClasses::UnsafeConstants_klass(), "Should be UnsafeConstants")do { if (!(fd->field_holder() == vmClasses::UnsafeConstants_klass ())) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4481, "assert(" "fd->field_holder() == vmClasses::UnsafeConstants_klass()" ") failed", "Should be UnsafeConstants"); ::breakpoint(); } } while (0); |
4482 | assert(fd->is_final(), "fields of UnsafeConstants must be final")do { if (!(fd->is_final())) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4482, "assert(" "fd->is_final()" ") failed", "fields of UnsafeConstants must be final" ); ::breakpoint(); } } while (0); |
4483 | assert(fd->is_static(), "fields of UnsafeConstants must be static")do { if (!(fd->is_static())) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4483, "assert(" "fd->is_static()" ") failed", "fields of UnsafeConstants must be static" ); ::breakpoint(); } } while (0); |
4484 | if (fd->name() == vmSymbols::address_size_name()) { |
4485 | mirror->int_field_put(fd->offset(), _address_size); |
4486 | } else if (fd->name() == vmSymbols::page_size_name()) { |
4487 | mirror->int_field_put(fd->offset(), _page_size); |
4488 | } else if (fd->name() == vmSymbols::big_endian_name()) { |
4489 | mirror->bool_field_put(fd->offset(), _big_endian); |
4490 | } else if (fd->name() == vmSymbols::use_unaligned_access_name()) { |
4491 | mirror->bool_field_put(fd->offset(), _use_unaligned_access); |
4492 | } else if (fd->name() == vmSymbols::data_cache_line_flush_size_name()) { |
4493 | mirror->int_field_put(fd->offset(), _data_cache_line_flush_size); |
4494 | } else { |
4495 | assert(false, "unexpected UnsafeConstants field")do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4495, "assert(" "false" ") failed", "unexpected UnsafeConstants field" ); ::breakpoint(); } } while (0); |
4496 | } |
4497 | } |
4498 | }; |
4499 | |
4500 | void jdk_internal_misc_UnsafeConstants::set_unsafe_constants() { |
4501 | UnsafeConstantsFixup fixup; |
4502 | vmClasses::UnsafeConstants_klass()->do_local_static_fields(&fixup); |
4503 | } |
4504 | |
4505 | |
4506 | // java_lang_StackTraceElement |
4507 | |
4508 | int java_lang_StackTraceElement::_methodName_offset; |
4509 | int java_lang_StackTraceElement::_fileName_offset; |
4510 | int java_lang_StackTraceElement::_lineNumber_offset; |
4511 | int java_lang_StackTraceElement::_moduleName_offset; |
4512 | int java_lang_StackTraceElement::_moduleVersion_offset; |
4513 | int java_lang_StackTraceElement::_classLoaderName_offset; |
4514 | int java_lang_StackTraceElement::_declaringClass_offset; |
4515 | int java_lang_StackTraceElement::_declaringClassObject_offset; |
4516 | |
4517 | #define STACKTRACEELEMENT_FIELDS_DO(macro)macro(_declaringClassObject_offset, k, "declaringClassObject" , class_signature, false); macro(_classLoaderName_offset, k, "classLoaderName" , string_signature, false); macro(_moduleName_offset, k, "moduleName" , string_signature, false); macro(_moduleVersion_offset, k, "moduleVersion" , string_signature, false); macro(_declaringClass_offset, k, "declaringClass" , string_signature, false); macro(_methodName_offset, k, "methodName" , string_signature, false); macro(_fileName_offset, k, "fileName" , string_signature, false); macro(_lineNumber_offset, k, "lineNumber" , int_signature, false) \ |
4518 | macro(_declaringClassObject_offset, k, "declaringClassObject", class_signature, false); \ |
4519 | macro(_classLoaderName_offset, k, "classLoaderName", string_signature, false); \ |
4520 | macro(_moduleName_offset, k, "moduleName", string_signature, false); \ |
4521 | macro(_moduleVersion_offset, k, "moduleVersion", string_signature, false); \ |
4522 | macro(_declaringClass_offset, k, "declaringClass", string_signature, false); \ |
4523 | macro(_methodName_offset, k, "methodName", string_signature, false); \ |
4524 | macro(_fileName_offset, k, "fileName", string_signature, false); \ |
4525 | macro(_lineNumber_offset, k, "lineNumber", int_signature, false) |
4526 | |
4527 | // Support for java_lang_StackTraceElement |
4528 | void java_lang_StackTraceElement::compute_offsets() { |
4529 | InstanceKlass* k = vmClasses::StackTraceElement_klass(); |
4530 | STACKTRACEELEMENT_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_declaringClassObject_offset, k, "declaringClassObject" , vmSymbols::class_signature(), false); compute_offset(_classLoaderName_offset , k, "classLoaderName", vmSymbols::string_signature(), false) ; compute_offset(_moduleName_offset, k, "moduleName", vmSymbols ::string_signature(), false); compute_offset(_moduleVersion_offset , k, "moduleVersion", vmSymbols::string_signature(), false); compute_offset (_declaringClass_offset, k, "declaringClass", vmSymbols::string_signature (), false); compute_offset(_methodName_offset, k, "methodName" , vmSymbols::string_signature(), false); compute_offset(_fileName_offset , k, "fileName", vmSymbols::string_signature(), false); compute_offset (_lineNumber_offset, k, "lineNumber", vmSymbols::int_signature (), false); |
4531 | } |
4532 | |
4533 | #if INCLUDE_CDS1 |
4534 | void java_lang_StackTraceElement::serialize_offsets(SerializeClosure* f) { |
4535 | STACKTRACEELEMENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_declaringClassObject_offset); f->do_u4 ((u4*)&_classLoaderName_offset); f->do_u4((u4*)&_moduleName_offset ); f->do_u4((u4*)&_moduleVersion_offset); f->do_u4( (u4*)&_declaringClass_offset); f->do_u4((u4*)&_methodName_offset ); f->do_u4((u4*)&_fileName_offset); f->do_u4((u4*) &_lineNumber_offset); |
4536 | } |
4537 | #endif |
4538 | |
4539 | void java_lang_StackTraceElement::set_fileName(oop element, oop value) { |
4540 | element->obj_field_put(_fileName_offset, value); |
4541 | } |
4542 | |
4543 | void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) { |
4544 | element->obj_field_put(_declaringClass_offset, value); |
4545 | } |
4546 | |
4547 | void java_lang_StackTraceElement::set_methodName(oop element, oop value) { |
4548 | element->obj_field_put(_methodName_offset, value); |
4549 | } |
4550 | |
4551 | void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { |
4552 | element->int_field_put(_lineNumber_offset, value); |
4553 | } |
4554 | |
4555 | void java_lang_StackTraceElement::set_moduleName(oop element, oop value) { |
4556 | element->obj_field_put(_moduleName_offset, value); |
4557 | } |
4558 | |
4559 | void java_lang_StackTraceElement::set_moduleVersion(oop element, oop value) { |
4560 | element->obj_field_put(_moduleVersion_offset, value); |
4561 | } |
4562 | |
4563 | void java_lang_StackTraceElement::set_classLoaderName(oop element, oop value) { |
4564 | element->obj_field_put(_classLoaderName_offset, value); |
4565 | } |
4566 | |
4567 | void java_lang_StackTraceElement::set_declaringClassObject(oop element, oop value) { |
4568 | element->obj_field_put(_declaringClassObject_offset, value); |
4569 | } |
4570 | |
4571 | |
4572 | // java_lang_AssertionStatusDirectives |
4573 | |
4574 | int java_lang_AssertionStatusDirectives::_classes_offset; |
4575 | int java_lang_AssertionStatusDirectives::_classEnabled_offset; |
4576 | int java_lang_AssertionStatusDirectives::_packages_offset; |
4577 | int java_lang_AssertionStatusDirectives::_packageEnabled_offset; |
4578 | int java_lang_AssertionStatusDirectives::_deflt_offset; |
4579 | |
4580 | // Support for java Assertions - java_lang_AssertionStatusDirectives. |
4581 | #define ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(macro)macro(_classes_offset, k, "classes", string_array_signature, false ); macro(_classEnabled_offset, k, "classEnabled", bool_array_signature , false); macro(_packages_offset, k, "packages", string_array_signature , false); macro(_packageEnabled_offset, k, "packageEnabled", bool_array_signature , false); macro(_deflt_offset, k, "deflt", bool_signature, false ) \ |
4582 | macro(_classes_offset, k, "classes", string_array_signature, false); \ |
4583 | macro(_classEnabled_offset, k, "classEnabled", bool_array_signature, false); \ |
4584 | macro(_packages_offset, k, "packages", string_array_signature, false); \ |
4585 | macro(_packageEnabled_offset, k, "packageEnabled", bool_array_signature, false); \ |
4586 | macro(_deflt_offset, k, "deflt", bool_signature, false) |
4587 | |
4588 | void java_lang_AssertionStatusDirectives::compute_offsets() { |
4589 | InstanceKlass* k = vmClasses::AssertionStatusDirectives_klass(); |
4590 | ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_classes_offset, k, "classes", vmSymbols::string_array_signature (), false); compute_offset(_classEnabled_offset, k, "classEnabled" , vmSymbols::bool_array_signature(), false); compute_offset(_packages_offset , k, "packages", vmSymbols::string_array_signature(), false); compute_offset(_packageEnabled_offset, k, "packageEnabled", vmSymbols ::bool_array_signature(), false); compute_offset(_deflt_offset , k, "deflt", vmSymbols::bool_signature(), false); |
4591 | } |
4592 | |
4593 | #if INCLUDE_CDS1 |
4594 | void java_lang_AssertionStatusDirectives::serialize_offsets(SerializeClosure* f) { |
4595 | ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_classes_offset); f->do_u4((u4*)& _classEnabled_offset); f->do_u4((u4*)&_packages_offset ); f->do_u4((u4*)&_packageEnabled_offset); f->do_u4 ((u4*)&_deflt_offset); |
4596 | } |
4597 | #endif |
4598 | |
4599 | void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { |
4600 | o->obj_field_put(_classes_offset, val); |
4601 | } |
4602 | |
4603 | void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) { |
4604 | o->obj_field_put(_classEnabled_offset, val); |
4605 | } |
4606 | |
4607 | void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) { |
4608 | o->obj_field_put(_packages_offset, val); |
4609 | } |
4610 | |
4611 | void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) { |
4612 | o->obj_field_put(_packageEnabled_offset, val); |
4613 | } |
4614 | |
4615 | void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) { |
4616 | o->bool_field_put(_deflt_offset, val); |
4617 | } |
4618 | |
4619 | int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset; |
4620 | |
4621 | #define AOS_FIELDS_DO(macro)macro(_owner_offset, k, "exclusiveOwnerThread", thread_signature , false) \ |
4622 | macro(_owner_offset, k, "exclusiveOwnerThread", thread_signature, false) |
4623 | |
4624 | void java_util_concurrent_locks_AbstractOwnableSynchronizer::compute_offsets() { |
4625 | InstanceKlass* k = vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass(); |
4626 | AOS_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_owner_offset, k, "exclusiveOwnerThread", vmSymbols ::thread_signature(), false); |
4627 | } |
4628 | |
4629 | oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { |
4630 | assert(_owner_offset != 0, "Must be initialized")do { if (!(_owner_offset != 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4630, "assert(" "_owner_offset != 0" ") failed", "Must be initialized" ); ::breakpoint(); } } while (0); |
4631 | return obj->obj_field(_owner_offset); |
4632 | } |
4633 | |
4634 | #if INCLUDE_CDS1 |
4635 | void java_util_concurrent_locks_AbstractOwnableSynchronizer::serialize_offsets(SerializeClosure* f) { |
4636 | AOS_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_owner_offset); |
4637 | } |
4638 | #endif |
4639 | |
4640 | int vector_VectorPayload::_payload_offset; |
4641 | |
4642 | #define VECTORPAYLOAD_FIELDS_DO(macro)macro(_payload_offset, k, "payload", object_signature, false) \ |
4643 | macro(_payload_offset, k, "payload", object_signature, false) |
4644 | |
4645 | void vector_VectorPayload::compute_offsets() { |
4646 | InstanceKlass* k = vmClasses::vector_VectorPayload_klass(); |
4647 | VECTORPAYLOAD_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_payload_offset, k, "payload", vmSymbols::object_signature (), false); |
4648 | } |
4649 | |
4650 | #if INCLUDE_CDS1 |
4651 | void vector_VectorPayload::serialize_offsets(SerializeClosure* f) { |
4652 | VECTORPAYLOAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_payload_offset); |
4653 | } |
4654 | #endif |
4655 | |
4656 | void vector_VectorPayload::set_payload(oop o, oop val) { |
4657 | o->obj_field_put(_payload_offset, val); |
4658 | } |
4659 | |
4660 | bool vector_VectorPayload::is_instance(oop obj) { |
4661 | return obj != NULL__null && is_subclass(obj->klass()); |
4662 | } |
4663 | |
4664 | int java_lang_Integer_IntegerCache::_static_cache_offset; |
4665 | int java_lang_Long_LongCache::_static_cache_offset; |
4666 | int java_lang_Character_CharacterCache::_static_cache_offset; |
4667 | int java_lang_Short_ShortCache::_static_cache_offset; |
4668 | int java_lang_Byte_ByteCache::_static_cache_offset; |
4669 | |
4670 | #define INTEGER_CACHE_FIELDS_DO(macro) \ |
4671 | macro(_static_cache_offset, k, "cache", java_lang_Integer_array_signature, true) |
4672 | |
4673 | void java_lang_Integer_IntegerCache::compute_offsets(InstanceKlass *k) { |
4674 | guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized")do { if (!(k != __null && k->is_initialized())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4674, "guarantee(" "k != NULL && k->is_initialized()" ") failed", "must be loaded and initialized"); ::breakpoint( ); } } while (0); |
4675 | INTEGER_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET); |
4676 | } |
4677 | |
4678 | objArrayOop java_lang_Integer_IntegerCache::cache(InstanceKlass *ik) { |
4679 | oop base = ik->static_field_base_raw(); |
4680 | return objArrayOop(base->obj_field(_static_cache_offset)); |
4681 | } |
4682 | |
4683 | Symbol* java_lang_Integer_IntegerCache::symbol() { |
4684 | return vmSymbols::java_lang_Integer_IntegerCache(); |
4685 | } |
4686 | |
4687 | #if INCLUDE_CDS1 |
4688 | void java_lang_Integer_IntegerCache::serialize_offsets(SerializeClosure* f) { |
4689 | INTEGER_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET); |
4690 | } |
4691 | #endif |
4692 | #undef INTEGER_CACHE_FIELDS_DO |
4693 | |
4694 | jint java_lang_Integer::value(oop obj) { |
4695 | jvalue v; |
4696 | java_lang_boxing_object::get_value(obj, &v); |
4697 | return v.i; |
4698 | } |
4699 | |
4700 | #define LONG_CACHE_FIELDS_DO(macro) \ |
4701 | macro(_static_cache_offset, k, "cache", java_lang_Long_array_signature, true) |
4702 | |
4703 | void java_lang_Long_LongCache::compute_offsets(InstanceKlass *k) { |
4704 | guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized")do { if (!(k != __null && k->is_initialized())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4704, "guarantee(" "k != NULL && k->is_initialized()" ") failed", "must be loaded and initialized"); ::breakpoint( ); } } while (0); |
4705 | LONG_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET); |
4706 | } |
4707 | |
4708 | objArrayOop java_lang_Long_LongCache::cache(InstanceKlass *ik) { |
4709 | oop base = ik->static_field_base_raw(); |
4710 | return objArrayOop(base->obj_field(_static_cache_offset)); |
4711 | } |
4712 | |
4713 | Symbol* java_lang_Long_LongCache::symbol() { |
4714 | return vmSymbols::java_lang_Long_LongCache(); |
4715 | } |
4716 | |
4717 | #if INCLUDE_CDS1 |
4718 | void java_lang_Long_LongCache::serialize_offsets(SerializeClosure* f) { |
4719 | LONG_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET); |
4720 | } |
4721 | #endif |
4722 | #undef LONG_CACHE_FIELDS_DO |
4723 | |
4724 | jlong java_lang_Long::value(oop obj) { |
4725 | jvalue v; |
4726 | java_lang_boxing_object::get_value(obj, &v); |
4727 | return v.j; |
4728 | } |
4729 | |
4730 | #define CHARACTER_CACHE_FIELDS_DO(macro) \ |
4731 | macro(_static_cache_offset, k, "cache", java_lang_Character_array_signature, true) |
4732 | |
4733 | void java_lang_Character_CharacterCache::compute_offsets(InstanceKlass *k) { |
4734 | guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized")do { if (!(k != __null && k->is_initialized())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4734, "guarantee(" "k != NULL && k->is_initialized()" ") failed", "must be loaded and initialized"); ::breakpoint( ); } } while (0); |
4735 | CHARACTER_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET); |
4736 | } |
4737 | |
4738 | objArrayOop java_lang_Character_CharacterCache::cache(InstanceKlass *ik) { |
4739 | oop base = ik->static_field_base_raw(); |
4740 | return objArrayOop(base->obj_field(_static_cache_offset)); |
4741 | } |
4742 | |
4743 | Symbol* java_lang_Character_CharacterCache::symbol() { |
4744 | return vmSymbols::java_lang_Character_CharacterCache(); |
4745 | } |
4746 | |
4747 | #if INCLUDE_CDS1 |
4748 | void java_lang_Character_CharacterCache::serialize_offsets(SerializeClosure* f) { |
4749 | CHARACTER_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET); |
4750 | } |
4751 | #endif |
4752 | #undef CHARACTER_CACHE_FIELDS_DO |
4753 | |
4754 | jchar java_lang_Character::value(oop obj) { |
4755 | jvalue v; |
4756 | java_lang_boxing_object::get_value(obj, &v); |
4757 | return v.c; |
4758 | } |
4759 | |
4760 | #define SHORT_CACHE_FIELDS_DO(macro) \ |
4761 | macro(_static_cache_offset, k, "cache", java_lang_Short_array_signature, true) |
4762 | |
4763 | void java_lang_Short_ShortCache::compute_offsets(InstanceKlass *k) { |
4764 | guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized")do { if (!(k != __null && k->is_initialized())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4764, "guarantee(" "k != NULL && k->is_initialized()" ") failed", "must be loaded and initialized"); ::breakpoint( ); } } while (0); |
4765 | SHORT_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET); |
4766 | } |
4767 | |
4768 | objArrayOop java_lang_Short_ShortCache::cache(InstanceKlass *ik) { |
4769 | oop base = ik->static_field_base_raw(); |
4770 | return objArrayOop(base->obj_field(_static_cache_offset)); |
4771 | } |
4772 | |
4773 | Symbol* java_lang_Short_ShortCache::symbol() { |
4774 | return vmSymbols::java_lang_Short_ShortCache(); |
4775 | } |
4776 | |
4777 | #if INCLUDE_CDS1 |
4778 | void java_lang_Short_ShortCache::serialize_offsets(SerializeClosure* f) { |
4779 | SHORT_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET); |
4780 | } |
4781 | #endif |
4782 | #undef SHORT_CACHE_FIELDS_DO |
4783 | |
4784 | jshort java_lang_Short::value(oop obj) { |
4785 | jvalue v; |
4786 | java_lang_boxing_object::get_value(obj, &v); |
4787 | return v.s; |
4788 | } |
4789 | |
4790 | #define BYTE_CACHE_FIELDS_DO(macro) \ |
4791 | macro(_static_cache_offset, k, "cache", java_lang_Byte_array_signature, true) |
4792 | |
4793 | void java_lang_Byte_ByteCache::compute_offsets(InstanceKlass *k) { |
4794 | guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized")do { if (!(k != __null && k->is_initialized())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4794, "guarantee(" "k != NULL && k->is_initialized()" ") failed", "must be loaded and initialized"); ::breakpoint( ); } } while (0); |
4795 | BYTE_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET); |
4796 | } |
4797 | |
4798 | objArrayOop java_lang_Byte_ByteCache::cache(InstanceKlass *ik) { |
4799 | oop base = ik->static_field_base_raw(); |
4800 | return objArrayOop(base->obj_field(_static_cache_offset)); |
4801 | } |
4802 | |
4803 | Symbol* java_lang_Byte_ByteCache::symbol() { |
4804 | return vmSymbols::java_lang_Byte_ByteCache(); |
4805 | } |
4806 | |
4807 | #if INCLUDE_CDS1 |
4808 | void java_lang_Byte_ByteCache::serialize_offsets(SerializeClosure* f) { |
4809 | BYTE_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET); |
4810 | } |
4811 | #endif |
4812 | #undef BYTE_CACHE_FIELDS_DO |
4813 | |
4814 | jbyte java_lang_Byte::value(oop obj) { |
4815 | jvalue v; |
4816 | java_lang_boxing_object::get_value(obj, &v); |
4817 | return v.b; |
4818 | } |
4819 | |
4820 | int java_lang_Boolean::_static_TRUE_offset; |
4821 | int java_lang_Boolean::_static_FALSE_offset; |
4822 | |
4823 | #define BOOLEAN_FIELDS_DO(macro)macro(_static_TRUE_offset, k, "TRUE", java_lang_Boolean_signature , true); macro(_static_FALSE_offset, k, "FALSE", java_lang_Boolean_signature , true) \ |
4824 | macro(_static_TRUE_offset, k, "TRUE", java_lang_Boolean_signature, true); \ |
4825 | macro(_static_FALSE_offset, k, "FALSE", java_lang_Boolean_signature, true) |
4826 | |
4827 | |
4828 | void java_lang_Boolean::compute_offsets(InstanceKlass *k) { |
4829 | guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized")do { if (!(k != __null && k->is_initialized())) { ( *g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4829, "guarantee(" "k != NULL && k->is_initialized()" ") failed", "must be loaded and initialized"); ::breakpoint( ); } } while (0); |
4830 | BOOLEAN_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_static_TRUE_offset, k, "TRUE", vmSymbols::java_lang_Boolean_signature (), true); compute_offset(_static_FALSE_offset, k, "FALSE", vmSymbols ::java_lang_Boolean_signature(), true); |
4831 | } |
4832 | |
4833 | oop java_lang_Boolean::get_TRUE(InstanceKlass *ik) { |
4834 | oop base = ik->static_field_base_raw(); |
4835 | return base->obj_field(_static_TRUE_offset); |
4836 | } |
4837 | |
4838 | oop java_lang_Boolean::get_FALSE(InstanceKlass *ik) { |
4839 | oop base = ik->static_field_base_raw(); |
4840 | return base->obj_field(_static_FALSE_offset); |
4841 | } |
4842 | |
4843 | Symbol* java_lang_Boolean::symbol() { |
4844 | return vmSymbols::java_lang_Boolean(); |
4845 | } |
4846 | |
4847 | #if INCLUDE_CDS1 |
4848 | void java_lang_Boolean::serialize_offsets(SerializeClosure* f) { |
4849 | BOOLEAN_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_static_TRUE_offset); f->do_u4((u4*) &_static_FALSE_offset); |
4850 | } |
4851 | #endif |
4852 | #undef BOOLEAN_CACHE_FIELDS_DO |
4853 | |
4854 | jboolean java_lang_Boolean::value(oop obj) { |
4855 | jvalue v; |
4856 | java_lang_boxing_object::get_value(obj, &v); |
4857 | return v.z; |
4858 | } |
4859 | |
4860 | // java_lang_reflect_RecordComponent |
4861 | |
4862 | int java_lang_reflect_RecordComponent::_clazz_offset; |
4863 | int java_lang_reflect_RecordComponent::_name_offset; |
4864 | int java_lang_reflect_RecordComponent::_type_offset; |
4865 | int java_lang_reflect_RecordComponent::_accessor_offset; |
4866 | int java_lang_reflect_RecordComponent::_signature_offset; |
4867 | int java_lang_reflect_RecordComponent::_annotations_offset; |
4868 | int java_lang_reflect_RecordComponent::_typeAnnotations_offset; |
4869 | |
4870 | #define RECORDCOMPONENT_FIELDS_DO(macro)macro(_clazz_offset, k, "clazz", class_signature, false); macro (_name_offset, k, "name", string_signature, false); macro(_type_offset , k, "type", class_signature, false); macro(_accessor_offset, k, "accessor", reflect_method_signature, false); macro(_signature_offset , k, "signature", string_signature, false); macro(_annotations_offset , k, "annotations", byte_array_signature, false); macro(_typeAnnotations_offset , k, "typeAnnotations", byte_array_signature, false); \ |
4871 | macro(_clazz_offset, k, "clazz", class_signature, false); \ |
4872 | macro(_name_offset, k, "name", string_signature, false); \ |
4873 | macro(_type_offset, k, "type", class_signature, false); \ |
4874 | macro(_accessor_offset, k, "accessor", reflect_method_signature, false); \ |
4875 | macro(_signature_offset, k, "signature", string_signature, false); \ |
4876 | macro(_annotations_offset, k, "annotations", byte_array_signature, false); \ |
4877 | macro(_typeAnnotations_offset, k, "typeAnnotations", byte_array_signature, false); |
4878 | |
4879 | // Support for java_lang_reflect_RecordComponent |
4880 | void java_lang_reflect_RecordComponent::compute_offsets() { |
4881 | InstanceKlass* k = vmClasses::RecordComponent_klass(); |
4882 | RECORDCOMPONENT_FIELDS_DO(FIELD_COMPUTE_OFFSET)compute_offset(_clazz_offset, k, "clazz", vmSymbols::class_signature (), false); compute_offset(_name_offset, k, "name", vmSymbols ::string_signature(), false); compute_offset(_type_offset, k, "type", vmSymbols::class_signature(), false); compute_offset (_accessor_offset, k, "accessor", vmSymbols::reflect_method_signature (), false); compute_offset(_signature_offset, k, "signature", vmSymbols::string_signature(), false); compute_offset(_annotations_offset , k, "annotations", vmSymbols::byte_array_signature(), false) ; compute_offset(_typeAnnotations_offset, k, "typeAnnotations" , vmSymbols::byte_array_signature(), false);; |
4883 | } |
4884 | |
4885 | #if INCLUDE_CDS1 |
4886 | void java_lang_reflect_RecordComponent::serialize_offsets(SerializeClosure* f) { |
4887 | RECORDCOMPONENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_clazz_offset); f->do_u4((u4*)&_name_offset ); f->do_u4((u4*)&_type_offset); f->do_u4((u4*)& _accessor_offset); f->do_u4((u4*)&_signature_offset); f ->do_u4((u4*)&_annotations_offset); f->do_u4((u4*)& _typeAnnotations_offset);; |
4888 | } |
4889 | #endif |
4890 | |
4891 | void java_lang_reflect_RecordComponent::set_clazz(oop element, oop value) { |
4892 | element->obj_field_put(_clazz_offset, value); |
4893 | } |
4894 | |
4895 | void java_lang_reflect_RecordComponent::set_name(oop element, oop value) { |
4896 | element->obj_field_put(_name_offset, value); |
4897 | } |
4898 | |
4899 | void java_lang_reflect_RecordComponent::set_type(oop element, oop value) { |
4900 | element->obj_field_put(_type_offset, value); |
4901 | } |
4902 | |
4903 | void java_lang_reflect_RecordComponent::set_accessor(oop element, oop value) { |
4904 | element->obj_field_put(_accessor_offset, value); |
4905 | } |
4906 | |
4907 | void java_lang_reflect_RecordComponent::set_signature(oop element, oop value) { |
4908 | element->obj_field_put(_signature_offset, value); |
4909 | } |
4910 | |
4911 | void java_lang_reflect_RecordComponent::set_annotations(oop element, oop value) { |
4912 | element->obj_field_put(_annotations_offset, value); |
4913 | } |
4914 | |
4915 | void java_lang_reflect_RecordComponent::set_typeAnnotations(oop element, oop value) { |
4916 | element->obj_field_put(_typeAnnotations_offset, value); |
4917 | } |
4918 | |
4919 | // java_lang_InternalError |
4920 | int java_lang_InternalError::_during_unsafe_access_offset; |
4921 | |
4922 | void java_lang_InternalError::set_during_unsafe_access(oop internal_error) { |
4923 | internal_error->bool_field_put(_during_unsafe_access_offset, true); |
4924 | } |
4925 | |
4926 | jboolean java_lang_InternalError::during_unsafe_access(oop internal_error) { |
4927 | return internal_error->bool_field(_during_unsafe_access_offset); |
4928 | } |
4929 | |
4930 | void java_lang_InternalError::compute_offsets() { |
4931 | INTERNALERROR_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET)java_lang_InternalError::_during_unsafe_access_offset = JavaClasses ::compute_injected_offset(JavaClasses::java_lang_InternalError_during_unsafe_access_enum );; |
4932 | } |
4933 | |
4934 | #if INCLUDE_CDS1 |
4935 | void java_lang_InternalError::serialize_offsets(SerializeClosure* f) { |
4936 | INTERNALERROR_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET)f->do_u4((u4*)&_during_unsafe_access_offset);; |
4937 | } |
4938 | #endif |
4939 | |
4940 | #define DO_COMPUTE_OFFSETS(k)k::compute_offsets(); k::compute_offsets(); |
4941 | |
4942 | // Compute field offsets of all the classes in this file |
4943 | void JavaClasses::compute_offsets() { |
4944 | if (UseSharedSpaces) { |
4945 | JVMTI_ONLY(assert(JvmtiExport::is_early_phase() && !(JvmtiExport::should_post_class_file_load_hook() &&do { if (!(JvmtiExport::is_early_phase() && !(JvmtiExport ::should_post_class_file_load_hook() && JvmtiExport:: has_early_class_hook_env()))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4947, "assert(" "JvmtiExport::is_early_phase() && !(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env())" ") failed", "JavaClasses::compute_offsets() must be called in early JVMTI phase." ); ::breakpoint(); } } while (0) |
4946 | JvmtiExport::has_early_class_hook_env()),do { if (!(JvmtiExport::is_early_phase() && !(JvmtiExport ::should_post_class_file_load_hook() && JvmtiExport:: has_early_class_hook_env()))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4947, "assert(" "JvmtiExport::is_early_phase() && !(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env())" ") failed", "JavaClasses::compute_offsets() must be called in early JVMTI phase." ); ::breakpoint(); } } while (0) |
4947 | "JavaClasses::compute_offsets() must be called in early JVMTI phase."))do { if (!(JvmtiExport::is_early_phase() && !(JvmtiExport ::should_post_class_file_load_hook() && JvmtiExport:: has_early_class_hook_env()))) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 4947, "assert(" "JvmtiExport::is_early_phase() && !(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env())" ") failed", "JavaClasses::compute_offsets() must be called in early JVMTI phase." ); ::breakpoint(); } } while (0); |
4948 | // None of the classes used by the rest of this function can be replaced by |
4949 | // JVMTI ClassFileLoadHook. |
4950 | // We are safe to use the archived offsets, which have already been restored |
4951 | // by JavaClasses::serialize_offsets, without computing the offsets again. |
4952 | return; |
4953 | } |
4954 | |
4955 | // We have already called the compute_offsets() of the |
4956 | // BASIC_JAVA_CLASSES_DO_PART1 classes (java_lang_String, java_lang_Class and |
4957 | // java_lang_ref_Reference) earlier inside vmClasses::resolve_all() |
4958 | BASIC_JAVA_CLASSES_DO_PART2(DO_COMPUTE_OFFSETS)java_lang_System::compute_offsets(); java_lang_ClassLoader::compute_offsets (); java_lang_Throwable::compute_offsets(); java_lang_Thread:: compute_offsets(); java_lang_ThreadGroup::compute_offsets(); java_lang_InternalError ::compute_offsets(); java_lang_AssertionStatusDirectives::compute_offsets (); java_lang_ref_SoftReference::compute_offsets(); java_lang_invoke_MethodHandle ::compute_offsets(); java_lang_invoke_DirectMethodHandle::compute_offsets (); java_lang_invoke_MemberName::compute_offsets(); java_lang_invoke_ResolvedMethodName ::compute_offsets(); java_lang_invoke_LambdaForm::compute_offsets (); java_lang_invoke_MethodType::compute_offsets(); java_lang_invoke_CallSite ::compute_offsets(); java_lang_invoke_ConstantCallSite::compute_offsets (); java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets (); java_security_AccessControlContext::compute_offsets(); java_lang_reflect_AccessibleObject ::compute_offsets(); java_lang_reflect_Method::compute_offsets (); java_lang_reflect_Constructor::compute_offsets(); java_lang_reflect_Field ::compute_offsets(); java_lang_reflect_RecordComponent::compute_offsets (); reflect_ConstantPool::compute_offsets(); reflect_UnsafeStaticFieldAccessorImpl ::compute_offsets(); java_lang_reflect_Parameter::compute_offsets (); java_lang_Module::compute_offsets(); java_lang_StackTraceElement ::compute_offsets(); java_lang_StackFrameInfo::compute_offsets (); java_lang_LiveStackFrameInfo::compute_offsets(); java_util_concurrent_locks_AbstractOwnableSynchronizer ::compute_offsets(); jdk_internal_invoke_NativeEntryPoint::compute_offsets (); jdk_internal_misc_UnsafeConstants::compute_offsets(); java_lang_boxing_object ::compute_offsets(); vector_VectorPayload::compute_offsets();; |
4959 | } |
4960 | |
4961 | #if INCLUDE_CDS1 |
4962 | #define DO_SERIALIZE_OFFSETS(k)k::serialize_offsets(soc); k::serialize_offsets(soc); |
4963 | |
4964 | void JavaClasses::serialize_offsets(SerializeClosure* soc) { |
4965 | BASIC_JAVA_CLASSES_DO(DO_SERIALIZE_OFFSETS)java_lang_Class::serialize_offsets(soc); java_lang_String::serialize_offsets (soc); java_lang_ref_Reference::serialize_offsets(soc); java_lang_System ::serialize_offsets(soc); java_lang_ClassLoader::serialize_offsets (soc); java_lang_Throwable::serialize_offsets(soc); java_lang_Thread ::serialize_offsets(soc); java_lang_ThreadGroup::serialize_offsets (soc); java_lang_InternalError::serialize_offsets(soc); java_lang_AssertionStatusDirectives ::serialize_offsets(soc); java_lang_ref_SoftReference::serialize_offsets (soc); java_lang_invoke_MethodHandle::serialize_offsets(soc); java_lang_invoke_DirectMethodHandle::serialize_offsets(soc); java_lang_invoke_MemberName::serialize_offsets(soc); java_lang_invoke_ResolvedMethodName ::serialize_offsets(soc); java_lang_invoke_LambdaForm::serialize_offsets (soc); java_lang_invoke_MethodType::serialize_offsets(soc); java_lang_invoke_CallSite ::serialize_offsets(soc); java_lang_invoke_ConstantCallSite:: serialize_offsets(soc); java_lang_invoke_MethodHandleNatives_CallSiteContext ::serialize_offsets(soc); java_security_AccessControlContext:: serialize_offsets(soc); java_lang_reflect_AccessibleObject::serialize_offsets (soc); java_lang_reflect_Method::serialize_offsets(soc); java_lang_reflect_Constructor ::serialize_offsets(soc); java_lang_reflect_Field::serialize_offsets (soc); java_lang_reflect_RecordComponent::serialize_offsets(soc ); reflect_ConstantPool::serialize_offsets(soc); reflect_UnsafeStaticFieldAccessorImpl ::serialize_offsets(soc); java_lang_reflect_Parameter::serialize_offsets (soc); java_lang_Module::serialize_offsets(soc); java_lang_StackTraceElement ::serialize_offsets(soc); java_lang_StackFrameInfo::serialize_offsets (soc); java_lang_LiveStackFrameInfo::serialize_offsets(soc); java_util_concurrent_locks_AbstractOwnableSynchronizer ::serialize_offsets(soc); jdk_internal_invoke_NativeEntryPoint ::serialize_offsets(soc); jdk_internal_misc_UnsafeConstants:: serialize_offsets(soc); java_lang_boxing_object::serialize_offsets (soc); vector_VectorPayload::serialize_offsets(soc);; |
4966 | } |
4967 | #endif |
4968 | |
4969 | #if INCLUDE_CDS_JAVA_HEAP1 |
4970 | bool JavaClasses::is_supported_for_archiving(oop obj) { |
4971 | Klass* klass = obj->klass(); |
4972 | |
4973 | if (klass == vmClasses::ClassLoader_klass() || // ClassLoader::loader_data is malloc'ed. |
4974 | // The next 3 classes are used to implement java.lang.invoke, and are not used directly in |
4975 | // regular Java code. The implementation of java.lang.invoke uses generated hidden classes |
4976 | // (e.g., as referenced by ResolvedMethodName::vmholder) that are not yet supported by CDS. |
4977 | // So for now we cannot not support these classes for archiving. |
4978 | // |
4979 | // These objects typically are not referenced by static fields, but rather by resolved |
4980 | // constant pool entries, so excluding them shouldn't affect the archiving of static fields. |
4981 | klass == vmClasses::ResolvedMethodName_klass() || |
4982 | klass == vmClasses::MemberName_klass() || |
4983 | klass == vmClasses::Context_klass()) { |
4984 | return false; |
4985 | } |
4986 | |
4987 | return true; |
4988 | } |
4989 | #endif |
4990 | |
4991 | #ifndef PRODUCT |
4992 | |
4993 | // These functions exist to assert the validity of de-serialized offsets in boxing object as a sanity check. |
4994 | |
4995 | bool JavaClasses::check_offset(const char *klass_name, int deserialized_offset, const char *field_name, |
4996 | const char* field_sig) { |
4997 | EXCEPTION_MARKExceptionMark __em; JavaThread* __the_thread__ = __em.thread( );; |
4998 | fieldDescriptor fd; |
4999 | TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name); |
5000 | Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception ())) { oop ex = (((ThreadShadow*)__the_thread__)->pending_exception ()); (((ThreadShadow*)__the_thread__)->clear_pending_exception ()); ex->print(); do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/classfile/javaClasses.cpp" , 5000, "assert(" "false" ") failed", "CATCH"); ::breakpoint( ); } } while (0); } (void)(0); |
5001 | InstanceKlass* ik = InstanceKlass::cast(k); |
5002 | TempNewSymbol f_name = SymbolTable::new_symbol(field_name); |
5003 | TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig); |
5004 | if (!ik->find_local_field(f_name, f_sig, &fd)) { |
5005 | tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name); |
5006 | return false; |
5007 | } |
5008 | if (fd.is_static()) { |
5009 | tty->print_cr("Nonstatic field %s.%s appears to be static", klass_name, field_name); |
5010 | return false; |
5011 | } |
5012 | if (fd.offset() == deserialized_offset ) { |
5013 | return true; |
5014 | } else { |
5015 | tty->print_cr("Offset of nonstatic field %s.%s is deserialized as %d but should really be %d.", |
5016 | klass_name, field_name, deserialized_offset, fd.offset()); |
5017 | return false; |
5018 | } |
5019 | } |
5020 | |
5021 | void JavaClasses::check_offsets() { |
5022 | bool valid = true; |
5023 | |
5024 | #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig)valid &= check_offset(klass_name, cpp_klass_name :: _field_name_offset , "field_name", field_sig) \ |
5025 | valid &= check_offset(klass_name, cpp_klass_name :: _##field_name ## _offset, #field_name, field_sig) |
5026 | |
5027 | #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig)valid &= check_offset(klass_name, cpp_klass_name :: _long_field_name_offset , "field_name", field_sig) \ |
5028 | valid &= check_offset(klass_name, cpp_klass_name :: _##long_ ## field_name ## _offset, #field_name, field_sig) |
5029 | |
5030 | // Boxed primitive objects (java_lang_boxing_object) |
5031 | |
5032 | CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z")valid &= check_offset("java/lang/Boolean", java_lang_boxing_object :: _value_offset, "value", "Z"); |
5033 | CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C")valid &= check_offset("java/lang/Character", java_lang_boxing_object :: _value_offset, "value", "C"); |
5034 | CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F")valid &= check_offset("java/lang/Float", java_lang_boxing_object :: _value_offset, "value", "F"); |
5035 | CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D")valid &= check_offset("java/lang/Double", java_lang_boxing_object :: _long_value_offset, "value", "D"); |
5036 | CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B")valid &= check_offset("java/lang/Byte", java_lang_boxing_object :: _value_offset, "value", "B"); |
5037 | CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S")valid &= check_offset("java/lang/Short", java_lang_boxing_object :: _value_offset, "value", "S"); |
5038 | CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I")valid &= check_offset("java/lang/Integer", java_lang_boxing_object :: _value_offset, "value", "I"); |
5039 | CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J")valid &= check_offset("java/lang/Long", java_lang_boxing_object :: _long_value_offset, "value", "J"); |
5040 | |
5041 | if (!valid) vm_exit_during_initialization("Field offset verification failed"); |
5042 | } |
5043 | |
5044 | #endif // PRODUCT |
5045 | |
5046 | int InjectedField::compute_offset() { |
5047 | InstanceKlass* ik = InstanceKlass::cast(klass()); |
5048 | for (AllFieldStream fs(ik); !fs.done(); fs.next()) { |
5049 | if (!may_be_java && !fs.access_flags().is_internal()) { |
5050 | // Only look at injected fields |
5051 | continue; |
5052 | } |
5053 | if (fs.name() == name() && fs.signature() == signature()) { |
5054 | return fs.offset(); |
5055 | } |
5056 | } |
5057 | ResourceMark rm; |
5058 | tty->print_cr("Invalid layout of %s at %s/%s%s", ik->external_name(), name()->as_C_string(), signature()->as_C_string(), may_be_java ? " (may_be_java)" : ""); |
5059 | #ifndef PRODUCT |
5060 | ik->print(); |
5061 | tty->print_cr("all fields:"); |
5062 | for (AllFieldStream fs(ik); !fs.done(); fs.next()) { |
5063 | tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int()); |
5064 | } |
5065 | #endif //PRODUCT |
5066 | vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class"); |
5067 | return -1; |
5068 | } |
5069 | |
5070 | void javaClasses_init() { |
5071 | JavaClasses::compute_offsets(); |
5072 | JavaClasses::check_offsets(); |
5073 | FilteredFieldsMap::initialize(); // must be done after computing offsets. |
5074 | } |