| File: | jdk/src/hotspot/share/classfile/javaClasses.cpp |
| Warning: | line 4787, column 4 Undefined or garbage value returned to caller |
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(); | |||
| 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 | } |