Path: blob/master/src/hotspot/share/classfile/javaClasses.cpp
40949 views
/*1* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "jvm.h"26#include "cds/archiveBuilder.hpp"27#include "cds/heapShared.inline.hpp"28#include "cds/metaspaceShared.hpp"29#include "classfile/altHashing.hpp"30#include "classfile/classLoaderData.inline.hpp"31#include "classfile/javaClasses.inline.hpp"32#include "classfile/javaThreadStatus.hpp"33#include "classfile/moduleEntry.hpp"34#include "classfile/stringTable.hpp"35#include "classfile/symbolTable.hpp"36#include "classfile/systemDictionary.hpp"37#include "classfile/vmClasses.hpp"38#include "classfile/vmSymbols.hpp"39#include "code/debugInfo.hpp"40#include "code/dependencyContext.hpp"41#include "code/pcDesc.hpp"42#include "interpreter/interpreter.hpp"43#include "interpreter/linkResolver.hpp"44#include "logging/log.hpp"45#include "logging/logStream.hpp"46#include "memory/oopFactory.hpp"47#include "memory/resourceArea.hpp"48#include "memory/universe.hpp"49#include "oops/fieldStreams.inline.hpp"50#include "oops/instanceKlass.inline.hpp"51#include "oops/instanceMirrorKlass.hpp"52#include "oops/klass.hpp"53#include "oops/klass.inline.hpp"54#include "oops/method.inline.hpp"55#include "oops/objArrayOop.inline.hpp"56#include "oops/oop.inline.hpp"57#include "oops/symbol.hpp"58#include "oops/recordComponent.hpp"59#include "oops/typeArrayOop.inline.hpp"60#include "prims/jvmtiExport.hpp"61#include "prims/methodHandles.hpp"62#include "prims/resolvedMethodTable.hpp"63#include "runtime/fieldDescriptor.inline.hpp"64#include "runtime/frame.inline.hpp"65#include "runtime/handles.inline.hpp"66#include "runtime/init.hpp"67#include "runtime/interfaceSupport.inline.hpp"68#include "runtime/java.hpp"69#include "runtime/javaCalls.hpp"70#include "runtime/jniHandles.inline.hpp"71#include "runtime/reflectionUtils.hpp"72#include "runtime/safepoint.hpp"73#include "runtime/safepointVerifiers.hpp"74#include "runtime/thread.inline.hpp"75#include "runtime/vframe.inline.hpp"76#include "runtime/vm_version.hpp"77#include "utilities/align.hpp"78#include "utilities/preserveException.hpp"79#include "utilities/utf8.hpp"80#if INCLUDE_JVMCI81#include "jvmci/jvmciJavaClasses.hpp"82#endif8384#define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \85klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);8687#if INCLUDE_CDS88#define INJECTED_FIELD_SERIALIZE_OFFSET(klass, name, signature, may_be_java) \89f->do_u4((u4*)&_##name##_offset);90#endif9192#define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java) \93{ VM_CLASS_ID(klass), VM_SYMBOL_ENUM_NAME(name##_name), VM_SYMBOL_ENUM_NAME(signature), may_be_java },9495InjectedField JavaClasses::_injected_fields[] = {96ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)97};9899// Register native methods of Object100void java_lang_Object::register_natives(TRAPS) {101InstanceKlass* obj = vmClasses::Object_klass();102Method::register_native(obj, vmSymbols::hashCode_name(),103vmSymbols::void_int_signature(), (address) &JVM_IHashCode, CHECK);104Method::register_native(obj, vmSymbols::wait_name(),105vmSymbols::long_void_signature(), (address) &JVM_MonitorWait, CHECK);106Method::register_native(obj, vmSymbols::notify_name(),107vmSymbols::void_method_signature(), (address) &JVM_MonitorNotify, CHECK);108Method::register_native(obj, vmSymbols::notifyAll_name(),109vmSymbols::void_method_signature(), (address) &JVM_MonitorNotifyAll, CHECK);110Method::register_native(obj, vmSymbols::clone_name(),111vmSymbols::void_object_signature(), (address) &JVM_Clone, THREAD);112}113114int JavaClasses::compute_injected_offset(InjectedFieldID id) {115return _injected_fields[id].compute_offset();116}117118InjectedField* JavaClasses::get_injected(Symbol* class_name, int* field_count) {119*field_count = 0;120121vmSymbolID sid = vmSymbols::find_sid(class_name);122if (sid == vmSymbolID::NO_SID) {123// Only well known classes can inject fields124return NULL;125}126127int count = 0;128int start = -1;129130#define LOOKUP_INJECTED_FIELD(klass, name, signature, may_be_java) \131if (sid == VM_SYMBOL_ENUM_NAME(klass)) { \132count++; \133if (start == -1) start = klass##_##name##_enum; \134}135ALL_INJECTED_FIELDS(LOOKUP_INJECTED_FIELD);136#undef LOOKUP_INJECTED_FIELD137138if (start != -1) {139*field_count = count;140return _injected_fields + start;141}142return NULL;143}144145146// Helpful routine for computing field offsets at run time rather than hardcoding them147// Finds local fields only, including static fields. Static field offsets are from the148// beginning of the mirror.149static void compute_offset(int &dest_offset,150InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol,151bool is_static = false) {152fieldDescriptor fd;153if (ik == NULL) {154ResourceMark rm;155log_error(class)("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string());156vm_exit_during_initialization("Invalid layout of well-known class");157}158159if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) {160ResourceMark rm;161log_error(class)("Invalid layout of %s field: %s type: %s", ik->external_name(),162name_symbol->as_C_string(), signature_symbol->as_C_string());163#ifndef PRODUCT164// Prints all fields and offsets165Log(class) lt;166LogStream ls(lt.error());167ik->print_on(&ls);168#endif //PRODUCT169vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class");170}171dest_offset = fd.offset();172}173174// Overloading to pass name as a string.175static void compute_offset(int& dest_offset, InstanceKlass* ik,176const char* name_string, Symbol* signature_symbol,177bool is_static = false) {178TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string));179if (name == NULL) {180ResourceMark rm;181log_error(class)("Name %s should be in the SymbolTable since its class is loaded", name_string);182vm_exit_during_initialization("Invalid layout of well-known class", ik->external_name());183}184compute_offset(dest_offset, ik, name, signature_symbol, is_static);185}186187188#if INCLUDE_CDS189#define FIELD_SERIALIZE_OFFSET(offset, klass, name, signature, is_static) \190f->do_u4((u4*)&offset)191#endif192193#define FIELD_COMPUTE_OFFSET(offset, klass, name, signature, is_static) \194compute_offset(offset, klass, name, vmSymbols::signature(), is_static)195196197// java_lang_String198199int java_lang_String::_value_offset;200int java_lang_String::_hash_offset;201int java_lang_String::_hashIsZero_offset;202int java_lang_String::_coder_offset;203int java_lang_String::_flags_offset;204205bool java_lang_String::_initialized;206207bool java_lang_String::is_instance(oop obj) {208return is_instance_inlined(obj);209}210211bool java_lang_String::test_and_set_flag(oop java_string, uint8_t flag_mask) {212uint8_t* addr = flags_addr(java_string);213uint8_t value = Atomic::load(addr);214while ((value & flag_mask) == 0) {215uint8_t old_value = value;216value |= flag_mask;217value = Atomic::cmpxchg(addr, old_value, value);218if (value == old_value) return false; // Flag bit changed from 0 to 1.219}220return true; // Flag bit is already 1.221}222223#define STRING_FIELDS_DO(macro) \224macro(_value_offset, k, vmSymbols::value_name(), byte_array_signature, false); \225macro(_hash_offset, k, "hash", int_signature, false); \226macro(_hashIsZero_offset, k, "hashIsZero", bool_signature, false); \227macro(_coder_offset, k, "coder", byte_signature, false);228229void java_lang_String::compute_offsets() {230if (_initialized) {231return;232}233234InstanceKlass* k = vmClasses::String_klass();235STRING_FIELDS_DO(FIELD_COMPUTE_OFFSET);236STRING_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);237238_initialized = true;239}240241#if INCLUDE_CDS242void java_lang_String::serialize_offsets(SerializeClosure* f) {243STRING_FIELDS_DO(FIELD_SERIALIZE_OFFSET);244STRING_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);245f->do_bool(&_initialized);246}247#endif248249class CompactStringsFixup : public FieldClosure {250private:251bool _value;252253public:254CompactStringsFixup(bool value) : _value(value) {}255256void do_field(fieldDescriptor* fd) {257if (fd->name() == vmSymbols::compact_strings_name()) {258oop mirror = fd->field_holder()->java_mirror();259assert(fd->field_holder() == vmClasses::String_klass(), "Should be String");260assert(mirror != NULL, "String must have mirror already");261mirror->bool_field_put(fd->offset(), _value);262}263}264};265266void java_lang_String::set_compact_strings(bool value) {267CompactStringsFixup fix(value);268vmClasses::String_klass()->do_local_static_fields(&fix);269}270271Handle java_lang_String::basic_create(int length, bool is_latin1, TRAPS) {272assert(_initialized, "Must be initialized");273assert(CompactStrings || !is_latin1, "Must be UTF16 without CompactStrings");274275// Create the String object first, so there's a chance that the String276// and the char array it points to end up in the same cache line.277oop obj;278obj = vmClasses::String_klass()->allocate_instance(CHECK_NH);279280// Create the char array. The String object must be handlized here281// because GC can happen as a result of the allocation attempt.282Handle h_obj(THREAD, obj);283int arr_length = is_latin1 ? length : length << 1; // 2 bytes per UTF16.284typeArrayOop buffer = oopFactory::new_byteArray(arr_length, CHECK_NH);;285286// Point the String at the char array287obj = h_obj();288set_value(obj, buffer);289// No need to zero the offset, allocation zero'ed the entire String object290set_coder(obj, is_latin1 ? CODER_LATIN1 : CODER_UTF16);291return h_obj;292}293294Handle java_lang_String::create_from_unicode(const jchar* unicode, int length, TRAPS) {295bool is_latin1 = CompactStrings && UNICODE::is_latin1(unicode, length);296Handle h_obj = basic_create(length, is_latin1, CHECK_NH);297typeArrayOop buffer = value(h_obj());298assert(TypeArrayKlass::cast(buffer->klass())->element_type() == T_BYTE, "only byte[]");299if (is_latin1) {300for (int index = 0; index < length; index++) {301buffer->byte_at_put(index, (jbyte)unicode[index]);302}303} else {304for (int index = 0; index < length; index++) {305buffer->char_at_put(index, unicode[index]);306}307}308309#ifdef ASSERT310{311ResourceMark rm;312char* expected = UNICODE::as_utf8(unicode, length);313char* actual = as_utf8_string(h_obj());314if (strcmp(expected, actual) != 0) {315fatal("Unicode conversion failure: %s --> %s", expected, actual);316}317}318#endif319320return h_obj;321}322323oop java_lang_String::create_oop_from_unicode(const jchar* unicode, int length, TRAPS) {324Handle h_obj = create_from_unicode(unicode, length, CHECK_NULL);325return h_obj();326}327328Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {329if (utf8_str == NULL) {330return Handle();331}332bool has_multibyte, is_latin1;333int length = UTF8::unicode_length(utf8_str, is_latin1, has_multibyte);334if (!CompactStrings) {335has_multibyte = true;336is_latin1 = false;337}338339Handle h_obj = basic_create(length, is_latin1, CHECK_NH);340if (length > 0) {341if (!has_multibyte) {342const jbyte* src = reinterpret_cast<const jbyte*>(utf8_str);343ArrayAccess<>::arraycopy_from_native(src, value(h_obj()), typeArrayOopDesc::element_offset<jbyte>(0), length);344} else if (is_latin1) {345UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);346} else {347UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);348}349}350351#ifdef ASSERT352// This check is too strict when the input string is not a valid UTF8.353// For example, it may be created with arbitrary content via jni_NewStringUTF.354if (UTF8::is_legal_utf8((const unsigned char*)utf8_str, (int)strlen(utf8_str), false)) {355ResourceMark rm;356const char* expected = utf8_str;357char* actual = as_utf8_string(h_obj());358if (strcmp(expected, actual) != 0) {359fatal("String conversion failure: %s --> %s", expected, actual);360}361}362#endif363364return h_obj;365}366367oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {368Handle h_obj = create_from_str(utf8_str, CHECK_NULL);369return h_obj();370}371372Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {373const char* utf8_str = (char*)symbol->bytes();374int utf8_len = symbol->utf8_length();375376bool has_multibyte, is_latin1;377int length = UTF8::unicode_length(utf8_str, utf8_len, is_latin1, has_multibyte);378if (!CompactStrings) {379has_multibyte = true;380is_latin1 = false;381}382383Handle h_obj = basic_create(length, is_latin1, CHECK_NH);384if (length > 0) {385if (!has_multibyte) {386const jbyte* src = reinterpret_cast<const jbyte*>(utf8_str);387ArrayAccess<>::arraycopy_from_native(src, value(h_obj()), typeArrayOopDesc::element_offset<jbyte>(0), length);388} else if (is_latin1) {389UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);390} else {391UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);392}393}394395#ifdef ASSERT396{397ResourceMark rm;398const char* expected = symbol->as_utf8();399char* actual = as_utf8_string(h_obj());400if (strncmp(expected, actual, utf8_len) != 0) {401fatal("Symbol conversion failure: %s --> %s", expected, actual);402}403}404#endif405406return h_obj;407}408409// Converts a C string to a Java String based on current encoding410Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {411assert(str != NULL, "bad arguments");412413typedef jstring (JNICALL *to_java_string_fn_t)(JNIEnv*, const char *);414static to_java_string_fn_t _to_java_string_fn = NULL;415416if (_to_java_string_fn == NULL) {417void *lib_handle = os::native_java_library();418_to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "JNU_NewStringPlatform"));419#if defined(_WIN32) && !defined(_WIN64)420if (_to_java_string_fn == NULL) {421// On 32 bit Windows, also try __stdcall decorated name422_to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "_JNU_NewStringPlatform@8"));423}424#endif425if (_to_java_string_fn == NULL) {426fatal("JNU_NewStringPlatform missing");427}428}429430jstring js = NULL;431{432JavaThread* thread = THREAD;433HandleMark hm(thread);434ThreadToNativeFromVM ttn(thread);435js = (_to_java_string_fn)(thread->jni_environment(), str);436}437438Handle native_platform_string(THREAD, JNIHandles::resolve(js));439JNIHandles::destroy_local(js); // destroy local JNIHandle.440return native_platform_string;441}442443// Converts a Java String to a native C string that can be used for444// native OS calls.445char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {446typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);447static to_platform_string_fn_t _to_platform_string_fn = NULL;448449if (_to_platform_string_fn == NULL) {450void *lib_handle = os::native_java_library();451_to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));452if (_to_platform_string_fn == NULL) {453fatal("GetStringPlatformChars missing");454}455}456457char *native_platform_string;458{ JavaThread* thread = THREAD;459jstring js = (jstring) JNIHandles::make_local(thread, java_string());460bool is_copy;461HandleMark hm(thread);462ThreadToNativeFromVM ttn(thread);463JNIEnv *env = thread->jni_environment();464native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);465assert(is_copy == JNI_TRUE, "is_copy value changed");466JNIHandles::destroy_local(js);467}468return native_platform_string;469}470471Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {472oop obj = java_string();473// Typical usage is to convert all '/' to '.' in string.474typeArrayOop value = java_lang_String::value(obj);475int length = java_lang_String::length(obj, value);476bool is_latin1 = java_lang_String::is_latin1(obj);477478// First check if any from_char exist479int index; // Declared outside, used later480for (index = 0; index < length; index++) {481jchar c = !is_latin1 ? value->char_at(index) :482((jchar) value->byte_at(index)) & 0xff;483if (c == from_char) {484break;485}486}487if (index == length) {488// No from_char, so do not copy.489return java_string;490}491492// Check if result string will be latin1493bool to_is_latin1 = false;494495// Replacement char must be latin1496if (CompactStrings && UNICODE::is_latin1(to_char)) {497if (is_latin1) {498// Source string is latin1 as well499to_is_latin1 = true;500} else if (!UNICODE::is_latin1(from_char)) {501// We are replacing an UTF16 char. Scan string to502// check if result can be latin1 encoded.503to_is_latin1 = true;504for (index = 0; index < length; index++) {505jchar c = value->char_at(index);506if (c != from_char && !UNICODE::is_latin1(c)) {507to_is_latin1 = false;508break;509}510}511}512}513514// Create new UNICODE (or byte) buffer. Must handlize value because GC515// may happen during String and char array creation.516typeArrayHandle h_value(THREAD, value);517Handle string = basic_create(length, to_is_latin1, CHECK_NH);518typeArrayOop from_buffer = h_value();519typeArrayOop to_buffer = java_lang_String::value(string());520521// Copy contents522for (index = 0; index < length; index++) {523jchar c = (!is_latin1) ? from_buffer->char_at(index) :524((jchar) from_buffer->byte_at(index)) & 0xff;525if (c == from_char) {526c = to_char;527}528if (!to_is_latin1) {529to_buffer->char_at_put(index, c);530} else {531to_buffer->byte_at_put(index, (jbyte) c);532}533}534return string;535}536537jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {538jchar* result = as_unicode_string_or_null(java_string, length);539if (result == NULL) {540THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");541}542return result;543}544545jchar* java_lang_String::as_unicode_string_or_null(oop java_string, int& length) {546typeArrayOop value = java_lang_String::value(java_string);547length = java_lang_String::length(java_string, value);548bool is_latin1 = java_lang_String::is_latin1(java_string);549550jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);551if (result != NULL) {552if (!is_latin1) {553for (int index = 0; index < length; index++) {554result[index] = value->char_at(index);555}556} else {557for (int index = 0; index < length; index++) {558result[index] = ((jchar) value->byte_at(index)) & 0xff;559}560}561}562return result;563}564565unsigned int java_lang_String::hash_code(oop java_string) {566// The hash and hashIsZero fields are subject to a benign data race,567// making it crucial to ensure that any observable result of the568// calculation in this method stays correct under any possible read of569// these fields. Necessary restrictions to allow this to be correct570// without explicit memory fences or similar concurrency primitives is571// that we can ever only write to one of these two fields for a given572// String instance, and that the computation is idempotent and derived573// from immutable state574assert(_initialized && (_hash_offset > 0) && (_hashIsZero_offset > 0), "Must be initialized");575if (java_lang_String::hash_is_set(java_string)) {576return java_string->int_field(_hash_offset);577}578579typeArrayOop value = java_lang_String::value(java_string);580int length = java_lang_String::length(java_string, value);581bool is_latin1 = java_lang_String::is_latin1(java_string);582583unsigned int hash = 0;584if (length > 0) {585if (is_latin1) {586hash = java_lang_String::hash_code(value->byte_at_addr(0), length);587} else {588hash = java_lang_String::hash_code(value->char_at_addr(0), length);589}590}591592if (hash != 0) {593java_string->int_field_put(_hash_offset, hash);594} else {595java_string->bool_field_put(_hashIsZero_offset, true);596}597return hash;598}599600char* java_lang_String::as_quoted_ascii(oop java_string) {601typeArrayOop value = java_lang_String::value(java_string);602int length = java_lang_String::length(java_string, value);603bool is_latin1 = java_lang_String::is_latin1(java_string);604605if (length == 0) return NULL;606607char* result;608int result_length;609if (!is_latin1) {610jchar* base = value->char_at_addr(0);611result_length = UNICODE::quoted_ascii_length(base, length) + 1;612result = NEW_RESOURCE_ARRAY(char, result_length);613UNICODE::as_quoted_ascii(base, length, result, result_length);614} else {615jbyte* base = value->byte_at_addr(0);616result_length = UNICODE::quoted_ascii_length(base, length) + 1;617result = NEW_RESOURCE_ARRAY(char, result_length);618UNICODE::as_quoted_ascii(base, length, result, result_length);619}620assert(result_length >= length + 1, "must not be shorter");621assert(result_length == (int)strlen(result) + 1, "must match");622return result;623}624625Symbol* java_lang_String::as_symbol(oop java_string) {626typeArrayOop value = java_lang_String::value(java_string);627int length = java_lang_String::length(java_string, value);628bool is_latin1 = java_lang_String::is_latin1(java_string);629if (!is_latin1) {630jchar* base = (length == 0) ? NULL : value->char_at_addr(0);631Symbol* sym = SymbolTable::new_symbol(base, length);632return sym;633} else {634ResourceMark rm;635jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);636const char* base = UNICODE::as_utf8(position, length);637Symbol* sym = SymbolTable::new_symbol(base, length);638return sym;639}640}641642Symbol* java_lang_String::as_symbol_or_null(oop java_string) {643typeArrayOop value = java_lang_String::value(java_string);644int length = java_lang_String::length(java_string, value);645bool is_latin1 = java_lang_String::is_latin1(java_string);646if (!is_latin1) {647jchar* base = (length == 0) ? NULL : value->char_at_addr(0);648return SymbolTable::probe_unicode(base, length);649} else {650ResourceMark rm;651jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);652const char* base = UNICODE::as_utf8(position, length);653return SymbolTable::probe(base, length);654}655}656657int java_lang_String::utf8_length(oop java_string, typeArrayOop value) {658assert(value_equals(value, java_lang_String::value(java_string)),659"value must be same as java_lang_String::value(java_string)");660int length = java_lang_String::length(java_string, value);661if (length == 0) {662return 0;663}664if (!java_lang_String::is_latin1(java_string)) {665return UNICODE::utf8_length(value->char_at_addr(0), length);666} else {667return UNICODE::utf8_length(value->byte_at_addr(0), length);668}669}670671int java_lang_String::utf8_length(oop java_string) {672typeArrayOop value = java_lang_String::value(java_string);673return utf8_length(java_string, value);674}675676char* java_lang_String::as_utf8_string(oop java_string) {677int length;678return as_utf8_string(java_string, length);679}680681char* java_lang_String::as_utf8_string(oop java_string, int& length) {682typeArrayOop value = java_lang_String::value(java_string);683length = java_lang_String::length(java_string, value);684bool is_latin1 = java_lang_String::is_latin1(java_string);685if (!is_latin1) {686jchar* position = (length == 0) ? NULL : value->char_at_addr(0);687return UNICODE::as_utf8(position, length);688} else {689jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);690return UNICODE::as_utf8(position, length);691}692}693694// Uses a provided buffer if it's sufficiently large, otherwise allocates695// a resource array to fit696char* java_lang_String::as_utf8_string_full(oop java_string, char* buf, int buflen, int& utf8_len) {697typeArrayOop value = java_lang_String::value(java_string);698int len = java_lang_String::length(java_string, value);699bool is_latin1 = java_lang_String::is_latin1(java_string);700if (!is_latin1) {701jchar *position = (len == 0) ? NULL : value->char_at_addr(0);702utf8_len = UNICODE::utf8_length(position, len);703if (utf8_len >= buflen) {704buf = NEW_RESOURCE_ARRAY(char, utf8_len + 1);705}706return UNICODE::as_utf8(position, len, buf, utf8_len + 1);707} else {708jbyte *position = (len == 0) ? NULL : value->byte_at_addr(0);709utf8_len = UNICODE::utf8_length(position, len);710if (utf8_len >= buflen) {711buf = NEW_RESOURCE_ARRAY(char, utf8_len + 1);712}713return UNICODE::as_utf8(position, len, buf, utf8_len + 1);714}715}716717char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) {718assert(value_equals(value, java_lang_String::value(java_string)),719"value must be same as java_lang_String::value(java_string)");720int length = java_lang_String::length(java_string, value);721bool is_latin1 = java_lang_String::is_latin1(java_string);722if (!is_latin1) {723jchar* position = (length == 0) ? NULL : value->char_at_addr(0);724return UNICODE::as_utf8(position, length, buf, buflen);725} else {726jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);727return UNICODE::as_utf8(position, length, buf, buflen);728}729}730731char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {732typeArrayOop value = java_lang_String::value(java_string);733return as_utf8_string(java_string, value, buf, buflen);734}735736char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {737typeArrayOop value = java_lang_String::value(java_string);738bool is_latin1 = java_lang_String::is_latin1(java_string);739assert(start + len <= java_lang_String::length(java_string), "just checking");740if (!is_latin1) {741jchar* position = value->char_at_addr(start);742return UNICODE::as_utf8(position, len);743} else {744jbyte* position = value->byte_at_addr(start);745return UNICODE::as_utf8(position, len);746}747}748749char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) {750assert(value_equals(value, java_lang_String::value(java_string)),751"value must be same as java_lang_String::value(java_string)");752assert(start + len <= java_lang_String::length(java_string), "just checking");753bool is_latin1 = java_lang_String::is_latin1(java_string);754if (!is_latin1) {755jchar* position = value->char_at_addr(start);756return UNICODE::as_utf8(position, len, buf, buflen);757} else {758jbyte* position = value->byte_at_addr(start);759return UNICODE::as_utf8(position, len, buf, buflen);760}761}762763bool java_lang_String::equals(oop java_string, const jchar* chars, int len) {764assert(java_string->klass() == vmClasses::String_klass(),765"must be java_string");766typeArrayOop value = java_lang_String::value_no_keepalive(java_string);767int length = java_lang_String::length(java_string, value);768if (length != len) {769return false;770}771bool is_latin1 = java_lang_String::is_latin1(java_string);772if (!is_latin1) {773for (int i = 0; i < len; i++) {774if (value->char_at(i) != chars[i]) {775return false;776}777}778} else {779for (int i = 0; i < len; i++) {780if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) {781return false;782}783}784}785return true;786}787788bool java_lang_String::equals(oop str1, oop str2) {789assert(str1->klass() == vmClasses::String_klass(),790"must be java String");791assert(str2->klass() == vmClasses::String_klass(),792"must be java String");793typeArrayOop value1 = java_lang_String::value_no_keepalive(str1);794bool is_latin1 = java_lang_String::is_latin1(str1);795typeArrayOop value2 = java_lang_String::value_no_keepalive(str2);796bool is_latin2 = java_lang_String::is_latin1(str2);797798if (is_latin1 != is_latin2) {799// Strings with different coders are never equal.800return false;801}802return value_equals(value1, value2);803}804805void java_lang_String::print(oop java_string, outputStream* st) {806assert(java_string->klass() == vmClasses::String_klass(), "must be java_string");807typeArrayOop value = java_lang_String::value_no_keepalive(java_string);808809if (value == NULL) {810// This can happen if, e.g., printing a String811// object before its initializer has been called812st->print("NULL");813return;814}815816int length = java_lang_String::length(java_string, value);817bool is_latin1 = java_lang_String::is_latin1(java_string);818819st->print("\"");820for (int index = 0; index < length; index++) {821st->print("%c", (!is_latin1) ? value->char_at(index) :822((jchar) value->byte_at(index)) & 0xff );823}824st->print("\"");825}826827// java_lang_Class828829int java_lang_Class::_klass_offset;830int java_lang_Class::_array_klass_offset;831int java_lang_Class::_oop_size_offset;832int java_lang_Class::_static_oop_field_count_offset;833int java_lang_Class::_class_loader_offset;834int java_lang_Class::_module_offset;835int java_lang_Class::_protection_domain_offset;836int java_lang_Class::_component_mirror_offset;837int java_lang_Class::_init_lock_offset;838int java_lang_Class::_signers_offset;839int java_lang_Class::_name_offset;840int java_lang_Class::_source_file_offset;841int java_lang_Class::_classData_offset;842int java_lang_Class::_classRedefinedCount_offset;843844bool java_lang_Class::_offsets_computed = false;845GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;846GrowableArray<Klass*>* java_lang_Class::_fixup_module_field_list = NULL;847848#ifdef ASSERT849inline static void assert_valid_static_string_field(fieldDescriptor* fd) {850assert(fd->has_initial_value(), "caller should have checked this");851assert(fd->field_type() == T_OBJECT, "caller should have checked this");852// Can't use vmSymbols::string_signature() as fd->signature() may have been relocated853// during DumpSharedSpaces854assert(fd->signature()->equals("Ljava/lang/String;"), "just checking");855}856#endif857858static void initialize_static_string_field(fieldDescriptor* fd, Handle mirror, TRAPS) {859DEBUG_ONLY(assert_valid_static_string_field(fd);)860oop string = fd->string_initial_value(CHECK);861mirror()->obj_field_put(fd->offset(), string);862}863864#if INCLUDE_CDS_JAVA_HEAP865static void initialize_static_string_field_for_dump(fieldDescriptor* fd, Handle mirror) {866DEBUG_ONLY(assert_valid_static_string_field(fd);)867assert(DumpSharedSpaces, "must be");868if (HeapShared::is_archived_object(mirror())) {869// Archive the String field and update the pointer.870oop s = mirror()->obj_field(fd->offset());871oop archived_s = StringTable::create_archived_string(s);872mirror()->obj_field_put(fd->offset(), archived_s);873} else {874guarantee(false, "Unexpected");875}876}877#endif878879static void initialize_static_primitive_field(fieldDescriptor* fd, Handle mirror) {880assert(fd->has_initial_value(), "caller should have checked this");881BasicType t = fd->field_type();882switch (t) {883case T_BYTE:884mirror()->byte_field_put(fd->offset(), fd->int_initial_value());885break;886case T_BOOLEAN:887mirror()->bool_field_put(fd->offset(), fd->int_initial_value());888break;889case T_CHAR:890mirror()->char_field_put(fd->offset(), fd->int_initial_value());891break;892case T_SHORT:893mirror()->short_field_put(fd->offset(), fd->int_initial_value());894break;895case T_INT:896mirror()->int_field_put(fd->offset(), fd->int_initial_value());897break;898case T_FLOAT:899mirror()->float_field_put(fd->offset(), fd->float_initial_value());900break;901case T_DOUBLE:902mirror()->double_field_put(fd->offset(), fd->double_initial_value());903break;904case T_LONG:905mirror()->long_field_put(fd->offset(), fd->long_initial_value());906break;907default:908// Illegal ConstantValue attribute in class file should have been909// caught during classfile parsing.910ShouldNotReachHere();911}912}913914static void initialize_static_field(fieldDescriptor* fd, Handle mirror, TRAPS) {915assert(mirror.not_null() && fd->is_static(), "just checking");916if (fd->has_initial_value()) {917if (fd->field_type() != T_OBJECT) {918initialize_static_primitive_field(fd, mirror);919} else {920initialize_static_string_field(fd, mirror, CHECK);921}922}923}924925#if INCLUDE_CDS_JAVA_HEAP926static void initialize_static_field_for_dump(fieldDescriptor* fd, Handle mirror) {927assert(mirror.not_null() && fd->is_static(), "just checking");928if (fd->has_initial_value()) {929if (fd->field_type() != T_OBJECT) {930initialize_static_primitive_field(fd, mirror);931} else {932initialize_static_string_field_for_dump(fd, mirror);933}934}935}936#endif937938void java_lang_Class::fixup_mirror(Klass* k, TRAPS) {939assert(InstanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already");940941// If the offset was read from the shared archive, it was fixed up already942if (!k->is_shared()) {943if (k->is_instance_klass()) {944// During bootstrap, java.lang.Class wasn't loaded so static field945// offsets were computed without the size added it. Go back and946// update all the static field offsets to included the size.947for (JavaFieldStream fs(InstanceKlass::cast(k)); !fs.done(); fs.next()) {948if (fs.access_flags().is_static()) {949int real_offset = fs.offset() + InstanceMirrorKlass::offset_of_static_fields();950fs.set_offset(real_offset);951}952}953}954}955956if (k->is_shared() && k->has_archived_mirror_index()) {957if (HeapShared::open_archive_heap_region_mapped()) {958bool present = restore_archived_mirror(k, Handle(), Handle(), Handle(), CHECK);959assert(present, "Missing archived mirror for %s", k->external_name());960return;961} else {962k->clear_java_mirror_handle();963k->clear_archived_mirror_index();964}965}966create_mirror(k, Handle(), Handle(), Handle(), Handle(), CHECK);967}968969void java_lang_Class::initialize_mirror_fields(Klass* k,970Handle mirror,971Handle protection_domain,972Handle classData,973TRAPS) {974// Allocate a simple java object for a lock.975// This needs to be a java object because during class initialization976// it can be held across a java call.977typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK);978set_init_lock(mirror(), r);979980// Set protection domain also981set_protection_domain(mirror(), protection_domain());982983// Initialize static fields984InstanceKlass::cast(k)->do_local_static_fields(&initialize_static_field, mirror, CHECK);985986// Set classData987set_class_data(mirror(), classData());988}989990// Set the java.lang.Module module field in the java_lang_Class mirror991void java_lang_Class::set_mirror_module_field(JavaThread* current, Klass* k, Handle mirror, Handle module) {992if (module.is_null()) {993// During startup, the module may be NULL only if java.base has not been defined yet.994// Put the class on the fixup_module_list to patch later when the java.lang.Module995// for java.base is known. But note that since we captured the NULL module another996// thread may have completed that initialization.997998bool javabase_was_defined = false;999{1000MutexLocker m1(current, Module_lock);1001// Keep list of classes needing java.base module fixup1002if (!ModuleEntryTable::javabase_defined()) {1003assert(k->java_mirror() != NULL, "Class's mirror is null");1004k->class_loader_data()->inc_keep_alive();1005assert(fixup_module_field_list() != NULL, "fixup_module_field_list not initialized");1006fixup_module_field_list()->push(k);1007} else {1008javabase_was_defined = true;1009}1010}10111012// If java.base was already defined then patch this particular class with java.base.1013if (javabase_was_defined) {1014ModuleEntry *javabase_entry = ModuleEntryTable::javabase_moduleEntry();1015assert(javabase_entry != NULL && javabase_entry->module() != NULL,1016"Setting class module field, " JAVA_BASE_NAME " should be defined");1017Handle javabase_handle(current, javabase_entry->module());1018set_module(mirror(), javabase_handle());1019}1020} else {1021assert(Universe::is_module_initialized() ||1022(ModuleEntryTable::javabase_defined() &&1023(module() == ModuleEntryTable::javabase_moduleEntry()->module())),1024"Incorrect java.lang.Module specification while creating mirror");1025set_module(mirror(), module());1026}1027}10281029// Statically allocate fixup lists because they always get created.1030void java_lang_Class::allocate_fixup_lists() {1031GrowableArray<Klass*>* mirror_list =1032new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, mtClass);1033set_fixup_mirror_list(mirror_list);10341035GrowableArray<Klass*>* module_list =1036new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, mtModule);1037set_fixup_module_field_list(module_list);1038}10391040void java_lang_Class::create_mirror(Klass* k, Handle class_loader,1041Handle module, Handle protection_domain,1042Handle classData, TRAPS) {1043assert(k != NULL, "Use create_basic_type_mirror for primitive types");1044assert(k->java_mirror() == NULL, "should only assign mirror once");10451046// Use this moment of initialization to cache modifier_flags also,1047// to support Class.getModifiers(). Instance classes recalculate1048// the cached flags after the class file is parsed, but before the1049// class is put into the system dictionary.1050int computed_modifiers = k->compute_modifier_flags();1051k->set_modifier_flags(computed_modifiers);1052// Class_klass has to be loaded because it is used to allocate1053// the mirror.1054if (vmClasses::Class_klass_loaded()) {1055// Allocate mirror (java.lang.Class instance)1056oop mirror_oop = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(k, CHECK);1057Handle mirror(THREAD, mirror_oop);1058Handle comp_mirror;10591060// Setup indirection from mirror->klass1061java_lang_Class::set_klass(mirror(), k);10621063InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());1064assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");10651066java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));10671068// It might also have a component mirror. This mirror must already exist.1069if (k->is_array_klass()) {1070if (k->is_typeArray_klass()) {1071BasicType type = TypeArrayKlass::cast(k)->element_type();1072comp_mirror = Handle(THREAD, Universe::java_mirror(type));1073} else {1074assert(k->is_objArray_klass(), "Must be");1075Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();1076assert(element_klass != NULL, "Must have an element klass");1077comp_mirror = Handle(THREAD, element_klass->java_mirror());1078}1079assert(comp_mirror() != NULL, "must have a mirror");10801081// Two-way link between the array klass and its component mirror:1082// (array_klass) k -> mirror -> component_mirror -> array_klass -> k1083set_component_mirror(mirror(), comp_mirror());1084// See below for ordering dependencies between field array_klass in component mirror1085// and java_mirror in this klass.1086} else {1087assert(k->is_instance_klass(), "Must be");10881089initialize_mirror_fields(k, mirror, protection_domain, classData, THREAD);1090if (HAS_PENDING_EXCEPTION) {1091// If any of the fields throws an exception like OOM remove the klass field1092// from the mirror so GC doesn't follow it after the klass has been deallocated.1093// This mirror looks like a primitive type, which logically it is because it1094// it represents no class.1095java_lang_Class::set_klass(mirror(), NULL);1096return;1097}1098}10991100// set the classLoader field in the java_lang_Class instance1101assert(class_loader() == k->class_loader(), "should be same");1102set_class_loader(mirror(), class_loader());11031104// Setup indirection from klass->mirror1105// after any exceptions can happen during allocations.1106k->set_java_mirror(mirror);11071108// Set the module field in the java_lang_Class instance. This must be done1109// after the mirror is set.1110set_mirror_module_field(THREAD, k, mirror, module);11111112if (comp_mirror() != NULL) {1113// Set after k->java_mirror() is published, because compiled code running1114// concurrently doesn't expect a k to have a null java_mirror.1115release_set_array_klass(comp_mirror(), k);1116}1117} else {1118assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");1119fixup_mirror_list()->push(k);1120}1121}11221123#if INCLUDE_CDS_JAVA_HEAP1124// Clears mirror fields. Static final fields with initial values are reloaded1125// from constant pool. The object identity hash is in the object header and is1126// not affected.1127class ResetMirrorField: public FieldClosure {1128private:1129Handle _m;11301131public:1132ResetMirrorField(Handle mirror) : _m(mirror) {}11331134void do_field(fieldDescriptor* fd) {1135assert(DumpSharedSpaces, "dump time only");1136assert(_m.not_null(), "Mirror cannot be NULL");11371138if (fd->is_static() && fd->has_initial_value()) {1139initialize_static_field_for_dump(fd, _m);1140return;1141}11421143BasicType ft = fd->field_type();1144switch (ft) {1145case T_BYTE:1146_m()->byte_field_put(fd->offset(), 0);1147break;1148case T_CHAR:1149_m()->char_field_put(fd->offset(), 0);1150break;1151case T_DOUBLE:1152_m()->double_field_put(fd->offset(), 0);1153break;1154case T_FLOAT:1155_m()->float_field_put(fd->offset(), 0);1156break;1157case T_INT:1158_m()->int_field_put(fd->offset(), 0);1159break;1160case T_LONG:1161_m()->long_field_put(fd->offset(), 0);1162break;1163case T_SHORT:1164_m()->short_field_put(fd->offset(), 0);1165break;1166case T_BOOLEAN:1167_m()->bool_field_put(fd->offset(), false);1168break;1169case T_ARRAY:1170case T_OBJECT: {1171// It might be useful to cache the String field, but1172// for now just clear out any reference field1173oop o = _m()->obj_field(fd->offset());1174_m()->obj_field_put(fd->offset(), NULL);1175break;1176}1177default:1178ShouldNotReachHere();1179break;1180}1181}1182};11831184static void set_klass_field_in_archived_mirror(oop mirror_obj, int offset, Klass* k) {1185assert(java_lang_Class::is_instance(mirror_obj), "must be");1186// this is the copy of k in the output buffer1187Klass* copy = ArchiveBuilder::get_relocated_klass(k);11881189// This is the address of k, if the archive is loaded at the requested location1190Klass* def = ArchiveBuilder::current()->to_requested(copy);11911192log_debug(cds, heap, mirror)(1193"Relocate mirror metadata field at %d from " PTR_FORMAT " ==> " PTR_FORMAT,1194offset, p2i(k), p2i(def));11951196mirror_obj->metadata_field_put(offset, def);1197}11981199void java_lang_Class::archive_basic_type_mirrors() {1200assert(HeapShared::is_heap_object_archiving_allowed(),1201"HeapShared::is_heap_object_archiving_allowed() must be true");12021203for (int t = T_BOOLEAN; t < T_VOID+1; t++) {1204BasicType bt = (BasicType)t;1205oop m = Universe::_mirrors[t].resolve();1206if (m != NULL) {1207// Update the field at _array_klass_offset to point to the relocated array klass.1208oop archived_m = HeapShared::archive_heap_object(m);1209assert(archived_m != NULL, "sanity");1210Klass *ak = (Klass*)(archived_m->metadata_field(_array_klass_offset));1211assert(ak != NULL || t == T_VOID, "should not be NULL");1212if (ak != NULL) {1213set_klass_field_in_archived_mirror(archived_m, _array_klass_offset, ak);1214}12151216// Clear the fields. Just to be safe1217Klass *k = m->klass();1218Handle archived_mirror_h(Thread::current(), archived_m);1219ResetMirrorField reset(archived_mirror_h);1220InstanceKlass::cast(k)->do_nonstatic_fields(&reset);12211222log_trace(cds, heap, mirror)(1223"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,1224type2name(bt), p2i(m), p2i(archived_m));12251226Universe::replace_mirror(bt, archived_m);1227}1228}1229}1230//1231// After the mirror object is successfully archived, the archived1232// klass is set with _has_archived_raw_mirror flag.1233//1234// The _has_archived_raw_mirror flag is cleared at runtime when the1235// archived mirror is restored. If archived java heap data cannot1236// be used at runtime, new mirror object is created for the shared1237// class. The _has_archived_raw_mirror is cleared also during the process.1238oop java_lang_Class::archive_mirror(Klass* k) {1239assert(HeapShared::is_heap_object_archiving_allowed(),1240"HeapShared::is_heap_object_archiving_allowed() must be true");12411242// Mirror is already archived1243if (k->has_archived_mirror_index()) {1244assert(k->archived_java_mirror() != NULL, "no archived mirror");1245return k->archived_java_mirror();1246}12471248// No mirror1249oop mirror = k->java_mirror();1250if (mirror == NULL) {1251return NULL;1252}12531254if (k->is_instance_klass()) {1255InstanceKlass *ik = InstanceKlass::cast(k);1256assert(ik->signers() == NULL, "class with signer should have been excluded");12571258if (!(ik->is_shared_boot_class() || ik->is_shared_platform_class() ||1259ik->is_shared_app_class())) {1260// Archiving mirror for classes from non-builtin loaders is not1261// supported.1262return NULL;1263}1264}12651266// Now start archiving the mirror object1267oop archived_mirror = HeapShared::archive_heap_object(mirror);1268if (archived_mirror == NULL) {1269return NULL;1270}12711272archived_mirror = process_archived_mirror(k, mirror, archived_mirror);1273if (archived_mirror == NULL) {1274return NULL;1275}12761277k->set_archived_java_mirror(archived_mirror);12781279ResourceMark rm;1280log_trace(cds, heap, mirror)(1281"Archived %s mirror object from " PTR_FORMAT " ==> " PTR_FORMAT,1282k->external_name(), p2i(mirror), p2i(archived_mirror));12831284return archived_mirror;1285}12861287// The process is based on create_mirror().1288oop java_lang_Class::process_archived_mirror(Klass* k, oop mirror,1289oop archived_mirror) {1290// Clear nonstatic fields in archived mirror. Some of the fields will be set1291// to archived metadata and objects below.1292Klass *c = archived_mirror->klass();1293Handle archived_mirror_h(Thread::current(), archived_mirror);1294ResetMirrorField reset(archived_mirror_h);1295InstanceKlass::cast(c)->do_nonstatic_fields(&reset);12961297if (k->is_array_klass()) {1298oop archived_comp_mirror;1299if (k->is_typeArray_klass()) {1300// The primitive type mirrors are already archived. Get the archived mirror.1301oop comp_mirror = java_lang_Class::component_mirror(mirror);1302archived_comp_mirror = HeapShared::find_archived_heap_object(comp_mirror);1303assert(archived_comp_mirror != NULL, "Must be");1304} else {1305assert(k->is_objArray_klass(), "Must be");1306Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();1307assert(element_klass != NULL, "Must have an element klass");1308archived_comp_mirror = archive_mirror(element_klass);1309if (archived_comp_mirror == NULL) {1310return NULL;1311}1312}1313java_lang_Class::set_component_mirror(archived_mirror, archived_comp_mirror);1314} else {1315assert(k->is_instance_klass(), "Must be");13161317// Reset local static fields in the mirror1318InstanceKlass::cast(k)->do_local_static_fields(&reset);13191320java_lang_Class:set_init_lock(archived_mirror, NULL);13211322set_protection_domain(archived_mirror, NULL);1323set_signers(archived_mirror, NULL);1324set_source_file(archived_mirror, NULL);1325}13261327// clear class loader and mirror_module_field1328set_class_loader(archived_mirror, NULL);1329set_module(archived_mirror, NULL);13301331// The archived mirror's field at _klass_offset is still pointing to the original1332// klass. Updated the field in the archived mirror to point to the relocated1333// klass in the archive.1334set_klass_field_in_archived_mirror(archived_mirror, _klass_offset, as_Klass(mirror));13351336// The field at _array_klass_offset is pointing to the original one dimension1337// higher array klass if exists. Relocate the pointer.1338Klass *arr = array_klass_acquire(mirror);1339if (arr != NULL) {1340set_klass_field_in_archived_mirror(archived_mirror, _array_klass_offset, arr);1341}1342return archived_mirror;1343}13441345void java_lang_Class::update_archived_primitive_mirror_native_pointers(oop archived_mirror) {1346if (MetaspaceShared::relocation_delta() != 0) {1347assert(archived_mirror->metadata_field(_klass_offset) == NULL, "must be for primitive class");13481349Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));1350if (ak != NULL) {1351archived_mirror->metadata_field_put(_array_klass_offset,1352(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));1353}1354}1355}13561357void java_lang_Class::update_archived_mirror_native_pointers(oop archived_mirror) {1358assert(MetaspaceShared::relocation_delta() != 0, "must be");13591360Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));1361archived_mirror->metadata_field_put(_klass_offset,1362(Klass*)(address(k) + MetaspaceShared::relocation_delta()));13631364Klass* ak = ((Klass*)archived_mirror->metadata_field(_array_klass_offset));1365if (ak != NULL) {1366archived_mirror->metadata_field_put(_array_klass_offset,1367(Klass*)(address(ak) + MetaspaceShared::relocation_delta()));1368}1369}137013711372// Returns true if the mirror is updated, false if no archived mirror1373// data is present. After the archived mirror object is restored, the1374// shared klass' _has_raw_archived_mirror flag is cleared.1375bool java_lang_Class::restore_archived_mirror(Klass *k,1376Handle class_loader, Handle module,1377Handle protection_domain, TRAPS) {1378// Postpone restoring archived mirror until java.lang.Class is loaded. Please1379// see more details in vmClasses::resolve_all().1380if (!vmClasses::Class_klass_loaded()) {1381assert(fixup_mirror_list() != NULL, "fixup_mirror_list not initialized");1382fixup_mirror_list()->push(k);1383return true;1384}13851386oop m = k->archived_java_mirror();1387assert(m != NULL, "must have stored non-null archived mirror");13881389// Sanity: clear it now to prevent re-initialization if any of the following fails1390k->clear_archived_mirror_index();13911392// mirror is archived, restore1393log_debug(cds, mirror)("Archived mirror is: " PTR_FORMAT, p2i(m));1394assert(HeapShared::is_archived_object(m), "must be archived mirror object");1395assert(as_Klass(m) == k, "must be");1396Handle mirror(THREAD, m);13971398if (!k->is_array_klass()) {1399// - local static final fields with initial values were initialized at dump time14001401// create the init_lock1402typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));1403set_init_lock(mirror(), r);14041405if (protection_domain.not_null()) {1406set_protection_domain(mirror(), protection_domain());1407}1408}14091410assert(class_loader() == k->class_loader(), "should be same");1411if (class_loader.not_null()) {1412set_class_loader(mirror(), class_loader());1413}14141415k->set_java_mirror(mirror);14161417set_mirror_module_field(THREAD, k, mirror, module);14181419if (log_is_enabled(Trace, cds, heap, mirror)) {1420ResourceMark rm(THREAD);1421log_trace(cds, heap, mirror)(1422"Restored %s archived mirror " PTR_FORMAT, k->external_name(), p2i(mirror()));1423}14241425return true;1426}1427#endif // INCLUDE_CDS_JAVA_HEAP14281429void java_lang_Class::fixup_module_field(Klass* k, Handle module) {1430assert(_module_offset != 0, "must have been computed already");1431java_lang_Class::set_module(k->java_mirror(), module());1432}14331434int java_lang_Class::oop_size(oop java_class) {1435assert(_oop_size_offset != 0, "must be set");1436int size = java_class->int_field(_oop_size_offset);1437assert(size > 0, "Oop size must be greater than zero, not %d", size);1438return size;1439}144014411442void java_lang_Class::set_oop_size(HeapWord* java_class, int size) {1443assert(_oop_size_offset != 0, "must be set");1444assert(size > 0, "Oop size must be greater than zero, not %d", size);1445*(int*)(((char*)java_class) + _oop_size_offset) = size;1446}14471448int java_lang_Class::static_oop_field_count(oop java_class) {1449assert(_static_oop_field_count_offset != 0, "must be set");1450return java_class->int_field(_static_oop_field_count_offset);1451}14521453int java_lang_Class::static_oop_field_count_raw(oop java_class) {1454assert(_static_oop_field_count_offset != 0, "must be set");1455return java_class->int_field_raw(_static_oop_field_count_offset);1456}14571458void java_lang_Class::set_static_oop_field_count(oop java_class, int size) {1459assert(_static_oop_field_count_offset != 0, "must be set");1460java_class->int_field_put(_static_oop_field_count_offset, size);1461}14621463oop java_lang_Class::protection_domain(oop java_class) {1464assert(_protection_domain_offset != 0, "must be set");1465return java_class->obj_field(_protection_domain_offset);1466}1467void java_lang_Class::set_protection_domain(oop java_class, oop pd) {1468assert(_protection_domain_offset != 0, "must be set");1469java_class->obj_field_put(_protection_domain_offset, pd);1470}14711472void java_lang_Class::set_component_mirror(oop java_class, oop comp_mirror) {1473assert(_component_mirror_offset != 0, "must be set");1474java_class->obj_field_put(_component_mirror_offset, comp_mirror);1475}1476oop java_lang_Class::component_mirror(oop java_class) {1477assert(_component_mirror_offset != 0, "must be set");1478return java_class->obj_field(_component_mirror_offset);1479}14801481oop java_lang_Class::init_lock(oop java_class) {1482assert(_init_lock_offset != 0, "must be set");1483return java_class->obj_field(_init_lock_offset);1484}1485void java_lang_Class::set_init_lock(oop java_class, oop init_lock) {1486assert(_init_lock_offset != 0, "must be set");1487java_class->obj_field_put(_init_lock_offset, init_lock);1488}14891490objArrayOop java_lang_Class::signers(oop java_class) {1491assert(_signers_offset != 0, "must be set");1492return (objArrayOop)java_class->obj_field(_signers_offset);1493}1494void java_lang_Class::set_signers(oop java_class, objArrayOop signers) {1495assert(_signers_offset != 0, "must be set");1496java_class->obj_field_put(_signers_offset, signers);1497}14981499oop java_lang_Class::class_data(oop java_class) {1500assert(_classData_offset != 0, "must be set");1501return java_class->obj_field(_classData_offset);1502}1503void java_lang_Class::set_class_data(oop java_class, oop class_data) {1504assert(_classData_offset != 0, "must be set");1505java_class->obj_field_put(_classData_offset, class_data);1506}15071508void java_lang_Class::set_class_loader(oop java_class, oop loader) {1509assert(_class_loader_offset != 0, "offsets should have been initialized");1510java_class->obj_field_put(_class_loader_offset, loader);1511}15121513oop java_lang_Class::class_loader(oop java_class) {1514assert(_class_loader_offset != 0, "must be set");1515return java_class->obj_field(_class_loader_offset);1516}15171518oop java_lang_Class::module(oop java_class) {1519assert(_module_offset != 0, "must be set");1520return java_class->obj_field(_module_offset);1521}15221523void java_lang_Class::set_module(oop java_class, oop module) {1524assert(_module_offset != 0, "must be set");1525java_class->obj_field_put(_module_offset, module);1526}15271528oop java_lang_Class::name(Handle java_class, TRAPS) {1529assert(_name_offset != 0, "must be set");1530oop o = java_class->obj_field(_name_offset);1531if (o == NULL) {1532o = StringTable::intern(java_lang_Class::as_external_name(java_class()), THREAD);1533java_class->obj_field_put(_name_offset, o);1534}1535return o;1536}15371538oop java_lang_Class::source_file(oop java_class) {1539assert(_source_file_offset != 0, "must be set");1540return java_class->obj_field(_source_file_offset);1541}15421543void java_lang_Class::set_source_file(oop java_class, oop source_file) {1544assert(_source_file_offset != 0, "must be set");1545java_class->obj_field_put(_source_file_offset, source_file);1546}15471548oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {1549// This should be improved by adding a field at the Java level or by1550// introducing a new VM klass (see comment in ClassFileParser)1551oop java_class = InstanceMirrorKlass::cast(vmClasses::Class_klass())->allocate_instance(NULL, CHECK_NULL);1552if (type != T_VOID) {1553Klass* aklass = Universe::typeArrayKlassObj(type);1554assert(aklass != NULL, "correct bootstrap");1555release_set_array_klass(java_class, aklass);1556}1557#ifdef ASSERT1558InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(vmClasses::Class_klass());1559assert(java_lang_Class::static_oop_field_count(java_class) == 0, "should have been zeroed by allocation");1560#endif1561return java_class;1562}156315641565Klass* java_lang_Class::as_Klass_raw(oop java_class) {1566//%note memory_21567assert(java_lang_Class::is_instance(java_class), "must be a Class object");1568Klass* k = ((Klass*)java_class->metadata_field_raw(_klass_offset));1569assert(k == NULL || k->is_klass(), "type check");1570return k;1571}157215731574void java_lang_Class::set_klass(oop java_class, Klass* klass) {1575assert(java_lang_Class::is_instance(java_class), "must be a Class object");1576java_class->metadata_field_put(_klass_offset, klass);1577}157815791580void java_lang_Class::print_signature(oop java_class, outputStream* st) {1581assert(java_lang_Class::is_instance(java_class), "must be a Class object");1582Symbol* name = NULL;1583bool is_instance = false;1584if (is_primitive(java_class)) {1585name = vmSymbols::type_signature(primitive_type(java_class));1586} else {1587Klass* k = as_Klass(java_class);1588is_instance = k->is_instance_klass();1589name = k->name();1590}1591if (name == NULL) {1592st->print("<null>");1593return;1594}1595if (is_instance) st->print("L");1596st->write((char*) name->base(), (int) name->utf8_length());1597if (is_instance) st->print(";");1598}15991600Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found) {1601assert(java_lang_Class::is_instance(java_class), "must be a Class object");1602Symbol* name;1603if (is_primitive(java_class)) {1604name = vmSymbols::type_signature(primitive_type(java_class));1605// Because this can create a new symbol, the caller has to decrement1606// the refcount, so make adjustment here and below for symbols returned1607// that are not created or incremented due to a successful lookup.1608name->increment_refcount();1609} else {1610Klass* k = as_Klass(java_class);1611if (!k->is_instance_klass()) {1612name = k->name();1613name->increment_refcount();1614} else {1615ResourceMark rm;1616const char* sigstr = k->signature_name();1617int siglen = (int) strlen(sigstr);1618if (!intern_if_not_found) {1619name = SymbolTable::probe(sigstr, siglen);1620} else {1621name = SymbolTable::new_symbol(sigstr, siglen);1622}1623}1624}1625return name;1626}16271628// Returns the Java name for this Java mirror (Resource allocated)1629// See Klass::external_name().1630// For primitive type Java mirrors, its type name is returned.1631const char* java_lang_Class::as_external_name(oop java_class) {1632assert(java_lang_Class::is_instance(java_class), "must be a Class object");1633const char* name = NULL;1634if (is_primitive(java_class)) {1635name = type2name(primitive_type(java_class));1636} else {1637name = as_Klass(java_class)->external_name();1638}1639if (name == NULL) {1640name = "<null>";1641}1642return name;1643}16441645Klass* java_lang_Class::array_klass_acquire(oop java_class) {1646Klass* k = ((Klass*)java_class->metadata_field_acquire(_array_klass_offset));1647assert(k == NULL || k->is_klass() && k->is_array_klass(), "should be array klass");1648return k;1649}165016511652void java_lang_Class::release_set_array_klass(oop java_class, Klass* klass) {1653assert(klass->is_klass() && klass->is_array_klass(), "should be array klass");1654java_class->release_metadata_field_put(_array_klass_offset, klass);1655}165616571658BasicType java_lang_Class::primitive_type(oop java_class) {1659assert(java_lang_Class::is_primitive(java_class), "just checking");1660Klass* ak = ((Klass*)java_class->metadata_field(_array_klass_offset));1661BasicType type = T_VOID;1662if (ak != NULL) {1663// Note: create_basic_type_mirror above initializes ak to a non-null value.1664type = ArrayKlass::cast(ak)->element_type();1665} else {1666assert(java_class == Universe::void_mirror(), "only valid non-array primitive");1667}1668assert(Universe::java_mirror(type) == java_class, "must be consistent");1669return type;1670}16711672BasicType java_lang_Class::as_BasicType(oop java_class, Klass** reference_klass) {1673assert(java_lang_Class::is_instance(java_class), "must be a Class object");1674if (is_primitive(java_class)) {1675if (reference_klass != NULL)1676(*reference_klass) = NULL;1677return primitive_type(java_class);1678} else {1679if (reference_klass != NULL)1680(*reference_klass) = as_Klass(java_class);1681return T_OBJECT;1682}1683}168416851686oop java_lang_Class::primitive_mirror(BasicType t) {1687oop mirror = Universe::java_mirror(t);1688assert(mirror != NULL && mirror->is_a(vmClasses::Class_klass()), "must be a Class");1689assert(java_lang_Class::is_primitive(mirror), "must be primitive");1690return mirror;1691}16921693#define CLASS_FIELDS_DO(macro) \1694macro(_classRedefinedCount_offset, k, "classRedefinedCount", int_signature, false); \1695macro(_class_loader_offset, k, "classLoader", classloader_signature, false); \1696macro(_component_mirror_offset, k, "componentType", class_signature, false); \1697macro(_module_offset, k, "module", module_signature, false); \1698macro(_name_offset, k, "name", string_signature, false); \1699macro(_classData_offset, k, "classData", object_signature, false);17001701void java_lang_Class::compute_offsets() {1702if (_offsets_computed) {1703return;1704}17051706_offsets_computed = true;17071708InstanceKlass* k = vmClasses::Class_klass();1709CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET);17101711// Init lock is a C union with component_mirror. Only instanceKlass mirrors have1712// init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops1713// GC treats them the same.1714_init_lock_offset = _component_mirror_offset;17151716CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);1717}17181719#if INCLUDE_CDS1720void java_lang_Class::serialize_offsets(SerializeClosure* f) {1721f->do_bool(&_offsets_computed);1722f->do_u4((u4*)&_init_lock_offset);17231724CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);17251726CLASS_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);1727}1728#endif17291730int java_lang_Class::classRedefinedCount(oop the_class_mirror) {1731assert(_classRedefinedCount_offset != 0, "offsets should have been initialized");1732return the_class_mirror->int_field(_classRedefinedCount_offset);1733}17341735void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {1736assert(_classRedefinedCount_offset != 0, "offsets should have been initialized");1737the_class_mirror->int_field_put(_classRedefinedCount_offset, value);1738}173917401741// Note: JDK1.1 and before had a privateInfo_offset field which was used for the1742// platform thread structure, and a eetop offset which was used for thread1743// local storage (and unused by the HotSpot VM). In JDK1.2 the two structures1744// merged, so in the HotSpot VM we just use the eetop field for the thread1745// instead of the privateInfo_offset.1746//1747// Note: The stackSize field is only present starting in 1.4.17481749int java_lang_Thread::_name_offset;1750int java_lang_Thread::_group_offset;1751int java_lang_Thread::_contextClassLoader_offset;1752int java_lang_Thread::_inheritedAccessControlContext_offset;1753int java_lang_Thread::_priority_offset;1754int java_lang_Thread::_eetop_offset;1755int java_lang_Thread::_interrupted_offset;1756int java_lang_Thread::_daemon_offset;1757int java_lang_Thread::_stillborn_offset;1758int java_lang_Thread::_stackSize_offset;1759int java_lang_Thread::_tid_offset;1760int java_lang_Thread::_thread_status_offset;1761int java_lang_Thread::_park_blocker_offset;17621763#define THREAD_FIELDS_DO(macro) \1764macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \1765macro(_group_offset, k, vmSymbols::group_name(), threadgroup_signature, false); \1766macro(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), classloader_signature, false); \1767macro(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), accesscontrolcontext_signature, false); \1768macro(_priority_offset, k, vmSymbols::priority_name(), int_signature, false); \1769macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature, false); \1770macro(_eetop_offset, k, "eetop", long_signature, false); \1771macro(_interrupted_offset, k, "interrupted", bool_signature, false); \1772macro(_stillborn_offset, k, "stillborn", bool_signature, false); \1773macro(_stackSize_offset, k, "stackSize", long_signature, false); \1774macro(_tid_offset, k, "tid", long_signature, false); \1775macro(_thread_status_offset, k, "threadStatus", int_signature, false); \1776macro(_park_blocker_offset, k, "parkBlocker", object_signature, false)17771778void java_lang_Thread::compute_offsets() {1779assert(_group_offset == 0, "offsets should be initialized only once");17801781InstanceKlass* k = vmClasses::Thread_klass();1782THREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);1783}17841785#if INCLUDE_CDS1786void java_lang_Thread::serialize_offsets(SerializeClosure* f) {1787THREAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);1788}1789#endif17901791JavaThread* java_lang_Thread::thread(oop java_thread) {1792return (JavaThread*)java_thread->address_field(_eetop_offset);1793}179417951796void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) {1797java_thread->address_field_put(_eetop_offset, (address)thread);1798}17991800bool java_lang_Thread::interrupted(oop java_thread) {1801// Make sure the caller can safely access oops.1802assert(Thread::current()->is_VM_thread() ||1803(JavaThread::current()->thread_state() != _thread_blocked &&1804JavaThread::current()->thread_state() != _thread_in_native),1805"Unsafe access to oop");1806return java_thread->bool_field_volatile(_interrupted_offset);1807}18081809void java_lang_Thread::set_interrupted(oop java_thread, bool val) {1810// Make sure the caller can safely access oops.1811assert(Thread::current()->is_VM_thread() ||1812(JavaThread::current()->thread_state() != _thread_blocked &&1813JavaThread::current()->thread_state() != _thread_in_native),1814"Unsafe access to oop");1815java_thread->bool_field_put_volatile(_interrupted_offset, val);1816}181718181819oop java_lang_Thread::name(oop java_thread) {1820return java_thread->obj_field(_name_offset);1821}182218231824void java_lang_Thread::set_name(oop java_thread, oop name) {1825java_thread->obj_field_put(_name_offset, name);1826}182718281829ThreadPriority java_lang_Thread::priority(oop java_thread) {1830return (ThreadPriority)java_thread->int_field(_priority_offset);1831}183218331834void java_lang_Thread::set_priority(oop java_thread, ThreadPriority priority) {1835java_thread->int_field_put(_priority_offset, priority);1836}183718381839oop java_lang_Thread::threadGroup(oop java_thread) {1840return java_thread->obj_field(_group_offset);1841}184218431844bool java_lang_Thread::is_stillborn(oop java_thread) {1845return java_thread->bool_field(_stillborn_offset) != 0;1846}184718481849// We never have reason to turn the stillborn bit off1850void java_lang_Thread::set_stillborn(oop java_thread) {1851java_thread->bool_field_put(_stillborn_offset, true);1852}185318541855bool java_lang_Thread::is_alive(oop java_thread) {1856JavaThread* thr = java_lang_Thread::thread(java_thread);1857return (thr != NULL);1858}185918601861bool java_lang_Thread::is_daemon(oop java_thread) {1862return java_thread->bool_field(_daemon_offset) != 0;1863}186418651866void java_lang_Thread::set_daemon(oop java_thread) {1867java_thread->bool_field_put(_daemon_offset, true);1868}18691870oop java_lang_Thread::context_class_loader(oop java_thread) {1871return java_thread->obj_field(_contextClassLoader_offset);1872}18731874oop java_lang_Thread::inherited_access_control_context(oop java_thread) {1875return java_thread->obj_field(_inheritedAccessControlContext_offset);1876}187718781879jlong java_lang_Thread::stackSize(oop java_thread) {1880return java_thread->long_field(_stackSize_offset);1881}18821883// Write the thread status value to threadStatus field in java.lang.Thread java class.1884void java_lang_Thread::set_thread_status(oop java_thread,1885JavaThreadStatus status) {1886java_thread->int_field_put(_thread_status_offset, static_cast<int>(status));1887}18881889// Read thread status value from threadStatus field in java.lang.Thread java class.1890JavaThreadStatus java_lang_Thread::get_thread_status(oop java_thread) {1891// Make sure the caller is operating on behalf of the VM or is1892// running VM code (state == _thread_in_vm).1893assert(Threads_lock->owned_by_self() || Thread::current()->is_VM_thread() ||1894JavaThread::current()->thread_state() == _thread_in_vm,1895"Java Thread is not running in vm");1896return static_cast<JavaThreadStatus>(java_thread->int_field(_thread_status_offset));1897}189818991900jlong java_lang_Thread::thread_id(oop java_thread) {1901return java_thread->long_field(_tid_offset);1902}19031904oop java_lang_Thread::park_blocker(oop java_thread) {1905return java_thread->obj_field(_park_blocker_offset);1906}19071908const char* java_lang_Thread::thread_status_name(oop java_thread) {1909JavaThreadStatus status = static_cast<JavaThreadStatus>(java_thread->int_field(_thread_status_offset));1910switch (status) {1911case JavaThreadStatus::NEW : return "NEW";1912case JavaThreadStatus::RUNNABLE : return "RUNNABLE";1913case JavaThreadStatus::SLEEPING : return "TIMED_WAITING (sleeping)";1914case JavaThreadStatus::IN_OBJECT_WAIT : return "WAITING (on object monitor)";1915case JavaThreadStatus::IN_OBJECT_WAIT_TIMED : return "TIMED_WAITING (on object monitor)";1916case JavaThreadStatus::PARKED : return "WAITING (parking)";1917case JavaThreadStatus::PARKED_TIMED : return "TIMED_WAITING (parking)";1918case JavaThreadStatus::BLOCKED_ON_MONITOR_ENTER : return "BLOCKED (on object monitor)";1919case JavaThreadStatus::TERMINATED : return "TERMINATED";1920default : return "UNKNOWN";1921};1922}1923int java_lang_ThreadGroup::_parent_offset;1924int java_lang_ThreadGroup::_name_offset;1925int java_lang_ThreadGroup::_threads_offset;1926int java_lang_ThreadGroup::_groups_offset;1927int java_lang_ThreadGroup::_maxPriority_offset;1928int java_lang_ThreadGroup::_destroyed_offset;1929int java_lang_ThreadGroup::_daemon_offset;1930int java_lang_ThreadGroup::_nthreads_offset;1931int java_lang_ThreadGroup::_ngroups_offset;19321933oop java_lang_ThreadGroup::parent(oop java_thread_group) {1934assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");1935return java_thread_group->obj_field(_parent_offset);1936}19371938// ("name as oop" accessor is not necessary)19391940const char* java_lang_ThreadGroup::name(oop java_thread_group) {1941oop name = java_thread_group->obj_field(_name_offset);1942// ThreadGroup.name can be null1943if (name != NULL) {1944return java_lang_String::as_utf8_string(name);1945}1946return NULL;1947}19481949int java_lang_ThreadGroup::nthreads(oop java_thread_group) {1950assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");1951return java_thread_group->int_field(_nthreads_offset);1952}19531954objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) {1955oop threads = java_thread_group->obj_field(_threads_offset);1956assert(threads != NULL, "threadgroups should have threads");1957assert(threads->is_objArray(), "just checking"); // Todo: Add better type checking code1958return objArrayOop(threads);1959}19601961int java_lang_ThreadGroup::ngroups(oop java_thread_group) {1962assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");1963return java_thread_group->int_field(_ngroups_offset);1964}19651966objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) {1967oop groups = java_thread_group->obj_field(_groups_offset);1968assert(groups == NULL || groups->is_objArray(), "just checking"); // Todo: Add better type checking code1969return objArrayOop(groups);1970}19711972ThreadPriority java_lang_ThreadGroup::maxPriority(oop java_thread_group) {1973assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");1974return (ThreadPriority) java_thread_group->int_field(_maxPriority_offset);1975}19761977bool java_lang_ThreadGroup::is_destroyed(oop java_thread_group) {1978assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");1979return java_thread_group->bool_field(_destroyed_offset) != 0;1980}19811982bool java_lang_ThreadGroup::is_daemon(oop java_thread_group) {1983assert(oopDesc::is_oop(java_thread_group), "thread group must be oop");1984return java_thread_group->bool_field(_daemon_offset) != 0;1985}19861987#define THREADGROUP_FIELDS_DO(macro) \1988macro(_parent_offset, k, vmSymbols::parent_name(), threadgroup_signature, false); \1989macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \1990macro(_threads_offset, k, vmSymbols::threads_name(), thread_array_signature, false); \1991macro(_groups_offset, k, vmSymbols::groups_name(), threadgroup_array_signature, false); \1992macro(_maxPriority_offset, k, vmSymbols::maxPriority_name(), int_signature, false); \1993macro(_destroyed_offset, k, vmSymbols::destroyed_name(), bool_signature, false); \1994macro(_daemon_offset, k, vmSymbols::daemon_name(), bool_signature, false); \1995macro(_nthreads_offset, k, vmSymbols::nthreads_name(), int_signature, false); \1996macro(_ngroups_offset, k, vmSymbols::ngroups_name(), int_signature, false)19971998void java_lang_ThreadGroup::compute_offsets() {1999assert(_parent_offset == 0, "offsets should be initialized only once");20002001InstanceKlass* k = vmClasses::ThreadGroup_klass();2002THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET);2003}20042005#if INCLUDE_CDS2006void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) {2007THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);2008}2009#endif20102011// java_lang_Throwable20122013int java_lang_Throwable::_backtrace_offset;2014int java_lang_Throwable::_detailMessage_offset;2015int java_lang_Throwable::_stackTrace_offset;2016int java_lang_Throwable::_depth_offset;2017int java_lang_Throwable::_cause_offset;2018int java_lang_Throwable::_static_unassigned_stacktrace_offset;20192020#define THROWABLE_FIELDS_DO(macro) \2021macro(_backtrace_offset, k, "backtrace", object_signature, false); \2022macro(_detailMessage_offset, k, "detailMessage", string_signature, false); \2023macro(_stackTrace_offset, k, "stackTrace", java_lang_StackTraceElement_array, false); \2024macro(_depth_offset, k, "depth", int_signature, false); \2025macro(_cause_offset, k, "cause", throwable_signature, false); \2026macro(_static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK", java_lang_StackTraceElement_array, true)20272028void java_lang_Throwable::compute_offsets() {2029InstanceKlass* k = vmClasses::Throwable_klass();2030THROWABLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);2031}20322033#if INCLUDE_CDS2034void java_lang_Throwable::serialize_offsets(SerializeClosure* f) {2035THROWABLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);2036}2037#endif20382039oop java_lang_Throwable::unassigned_stacktrace() {2040InstanceKlass* ik = vmClasses::Throwable_klass();2041oop base = ik->static_field_base_raw();2042return base->obj_field(_static_unassigned_stacktrace_offset);2043}20442045oop java_lang_Throwable::backtrace(oop throwable) {2046return throwable->obj_field_acquire(_backtrace_offset);2047}204820492050void java_lang_Throwable::set_backtrace(oop throwable, oop value) {2051throwable->release_obj_field_put(_backtrace_offset, value);2052}20532054int java_lang_Throwable::depth(oop throwable) {2055return throwable->int_field(_depth_offset);2056}20572058void java_lang_Throwable::set_depth(oop throwable, int value) {2059throwable->int_field_put(_depth_offset, value);2060}20612062oop java_lang_Throwable::message(oop throwable) {2063return throwable->obj_field(_detailMessage_offset);2064}20652066oop java_lang_Throwable::cause(oop throwable) {2067return throwable->obj_field(_cause_offset);2068}20692070// Return Symbol for detailed_message or NULL2071Symbol* java_lang_Throwable::detail_message(oop throwable) {2072PreserveExceptionMark pm(Thread::current());2073oop detailed_message = java_lang_Throwable::message(throwable);2074if (detailed_message != NULL) {2075return java_lang_String::as_symbol(detailed_message);2076}2077return NULL;2078}20792080void java_lang_Throwable::set_message(oop throwable, oop value) {2081throwable->obj_field_put(_detailMessage_offset, value);2082}208320842085void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) {2086throwable->obj_field_put(_stackTrace_offset, st_element_array);2087}20882089void java_lang_Throwable::clear_stacktrace(oop throwable) {2090set_stacktrace(throwable, NULL);2091}209220932094void java_lang_Throwable::print(oop throwable, outputStream* st) {2095ResourceMark rm;2096Klass* k = throwable->klass();2097assert(k != NULL, "just checking");2098st->print("%s", k->external_name());2099oop msg = message(throwable);2100if (msg != NULL) {2101st->print(": %s", java_lang_String::as_utf8_string(msg));2102}2103}21042105// After this many redefines, the stack trace is unreliable.2106const int MAX_VERSION = USHRT_MAX;21072108static inline bool version_matches(Method* method, int version) {2109assert(version < MAX_VERSION, "version is too big");2110return method != NULL && (method->constants()->version() == version);2111}21122113// This class provides a simple wrapper over the internal structure of2114// exception backtrace to insulate users of the backtrace from needing2115// to know what it looks like.2116// The code of this class is not GC safe. Allocations can only happen2117// in expand().2118class BacktraceBuilder: public StackObj {2119friend class BacktraceIterator;2120private:2121Handle _backtrace;2122objArrayOop _head;2123typeArrayOop _methods;2124typeArrayOop _bcis;2125objArrayOop _mirrors;2126typeArrayOop _names; // Needed to insulate method name against redefinition.2127// True if the top frame of the backtrace is omitted because it shall be hidden.2128bool _has_hidden_top_frame;2129int _index;2130NoSafepointVerifier _nsv;21312132enum {2133trace_methods_offset = java_lang_Throwable::trace_methods_offset,2134trace_bcis_offset = java_lang_Throwable::trace_bcis_offset,2135trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset,2136trace_names_offset = java_lang_Throwable::trace_names_offset,2137trace_next_offset = java_lang_Throwable::trace_next_offset,2138trace_hidden_offset = java_lang_Throwable::trace_hidden_offset,2139trace_size = java_lang_Throwable::trace_size,2140trace_chunk_size = java_lang_Throwable::trace_chunk_size2141};21422143// get info out of chunks2144static typeArrayOop get_methods(objArrayHandle chunk) {2145typeArrayOop methods = typeArrayOop(chunk->obj_at(trace_methods_offset));2146assert(methods != NULL, "method array should be initialized in backtrace");2147return methods;2148}2149static typeArrayOop get_bcis(objArrayHandle chunk) {2150typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset));2151assert(bcis != NULL, "bci array should be initialized in backtrace");2152return bcis;2153}2154static objArrayOop get_mirrors(objArrayHandle chunk) {2155objArrayOop mirrors = objArrayOop(chunk->obj_at(trace_mirrors_offset));2156assert(mirrors != NULL, "mirror array should be initialized in backtrace");2157return mirrors;2158}2159static typeArrayOop get_names(objArrayHandle chunk) {2160typeArrayOop names = typeArrayOop(chunk->obj_at(trace_names_offset));2161assert(names != NULL, "names array should be initialized in backtrace");2162return names;2163}2164static bool has_hidden_top_frame(objArrayHandle chunk) {2165oop hidden = chunk->obj_at(trace_hidden_offset);2166return hidden != NULL;2167}21682169public:21702171// constructor for new backtrace2172BacktraceBuilder(TRAPS): _head(NULL), _methods(NULL), _bcis(NULL), _mirrors(NULL), _names(NULL), _has_hidden_top_frame(false) {2173expand(CHECK);2174_backtrace = Handle(THREAD, _head);2175_index = 0;2176}21772178BacktraceBuilder(Thread* thread, objArrayHandle backtrace) {2179_methods = get_methods(backtrace);2180_bcis = get_bcis(backtrace);2181_mirrors = get_mirrors(backtrace);2182_names = get_names(backtrace);2183_has_hidden_top_frame = has_hidden_top_frame(backtrace);2184assert(_methods->length() == _bcis->length() &&2185_methods->length() == _mirrors->length() &&2186_mirrors->length() == _names->length(),2187"method and source information arrays should match");21882189// head is the preallocated backtrace2190_head = backtrace();2191_backtrace = Handle(thread, _head);2192_index = 0;2193}21942195void expand(TRAPS) {2196objArrayHandle old_head(THREAD, _head);2197PauseNoSafepointVerifier pnsv(&_nsv);21982199objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK);2200objArrayHandle new_head(THREAD, head);22012202typeArrayOop methods = oopFactory::new_shortArray(trace_chunk_size, CHECK);2203typeArrayHandle new_methods(THREAD, methods);22042205typeArrayOop bcis = oopFactory::new_intArray(trace_chunk_size, CHECK);2206typeArrayHandle new_bcis(THREAD, bcis);22072208objArrayOop mirrors = oopFactory::new_objectArray(trace_chunk_size, CHECK);2209objArrayHandle new_mirrors(THREAD, mirrors);22102211typeArrayOop names = oopFactory::new_symbolArray(trace_chunk_size, CHECK);2212typeArrayHandle new_names(THREAD, names);22132214if (!old_head.is_null()) {2215old_head->obj_at_put(trace_next_offset, new_head());2216}2217new_head->obj_at_put(trace_methods_offset, new_methods());2218new_head->obj_at_put(trace_bcis_offset, new_bcis());2219new_head->obj_at_put(trace_mirrors_offset, new_mirrors());2220new_head->obj_at_put(trace_names_offset, new_names());2221new_head->obj_at_put(trace_hidden_offset, NULL);22222223_head = new_head();2224_methods = new_methods();2225_bcis = new_bcis();2226_mirrors = new_mirrors();2227_names = new_names();2228_index = 0;2229}22302231oop backtrace() {2232return _backtrace();2233}22342235inline void push(Method* method, int bci, TRAPS) {2236// Smear the -1 bci to 0 since the array only holds unsigned2237// shorts. The later line number lookup would just smear the -12238// to a 0 even if it could be recorded.2239if (bci == SynchronizationEntryBCI) bci = 0;22402241if (_index >= trace_chunk_size) {2242methodHandle mhandle(THREAD, method);2243expand(CHECK);2244method = mhandle();2245}22462247_methods->ushort_at_put(_index, method->orig_method_idnum());2248_bcis->int_at_put(_index, Backtrace::merge_bci_and_version(bci, method->constants()->version()));22492250// Note:this doesn't leak symbols because the mirror in the backtrace keeps the2251// klass owning the symbols alive so their refcounts aren't decremented.2252Symbol* name = method->name();2253_names->symbol_at_put(_index, name);22542255// We need to save the mirrors in the backtrace to keep the class2256// from being unloaded while we still have this stack trace.2257assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror");2258_mirrors->obj_at_put(_index, method->method_holder()->java_mirror());2259_index++;2260}22612262void set_has_hidden_top_frame() {2263if (!_has_hidden_top_frame) {2264// It would be nice to add java/lang/Boolean::TRUE here2265// to indicate that this backtrace has a hidden top frame.2266// But this code is used before TRUE is allocated.2267// Therefore let's just use an arbitrary legal oop2268// available right here. _methods is a short[].2269assert(_methods != NULL, "we need a legal oop");2270_has_hidden_top_frame = true;2271_head->obj_at_put(trace_hidden_offset, _methods);2272}2273}2274};22752276struct BacktraceElement : public StackObj {2277int _method_id;2278int _bci;2279int _version;2280Symbol* _name;2281Handle _mirror;2282BacktraceElement(Handle mirror, int mid, int version, int bci, Symbol* name) :2283_method_id(mid), _bci(bci), _version(version), _name(name), _mirror(mirror) {}2284};22852286class BacktraceIterator : public StackObj {2287int _index;2288objArrayHandle _result;2289objArrayHandle _mirrors;2290typeArrayHandle _methods;2291typeArrayHandle _bcis;2292typeArrayHandle _names;22932294void init(objArrayHandle result, Thread* thread) {2295// Get method id, bci, version and mirror from chunk2296_result = result;2297if (_result.not_null()) {2298_methods = typeArrayHandle(thread, BacktraceBuilder::get_methods(_result));2299_bcis = typeArrayHandle(thread, BacktraceBuilder::get_bcis(_result));2300_mirrors = objArrayHandle(thread, BacktraceBuilder::get_mirrors(_result));2301_names = typeArrayHandle(thread, BacktraceBuilder::get_names(_result));2302_index = 0;2303}2304}2305public:2306BacktraceIterator(objArrayHandle result, Thread* thread) {2307init(result, thread);2308assert(_methods.is_null() || _methods->length() == java_lang_Throwable::trace_chunk_size, "lengths don't match");2309}23102311BacktraceElement next(Thread* thread) {2312BacktraceElement e (Handle(thread, _mirrors->obj_at(_index)),2313_methods->ushort_at(_index),2314Backtrace::version_at(_bcis->int_at(_index)),2315Backtrace::bci_at(_bcis->int_at(_index)),2316_names->symbol_at(_index));2317_index++;23182319if (_index >= java_lang_Throwable::trace_chunk_size) {2320int next_offset = java_lang_Throwable::trace_next_offset;2321// Get next chunk2322objArrayHandle result (thread, objArrayOop(_result->obj_at(next_offset)));2323init(result, thread);2324}2325return e;2326}23272328bool repeat() {2329return _result.not_null() && _mirrors->obj_at(_index) != NULL;2330}2331};233223332334// Print stack trace element to resource allocated buffer2335static void print_stack_element_to_stream(outputStream* st, Handle mirror, int method_id,2336int version, int bci, Symbol* name) {2337ResourceMark rm;23382339// Get strings and string lengths2340InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));2341const char* klass_name = holder->external_name();2342int buf_len = (int)strlen(klass_name);23432344char* method_name = name->as_C_string();2345buf_len += (int)strlen(method_name);23462347char* source_file_name = NULL;2348Symbol* source = Backtrace::get_source_file_name(holder, version);2349if (source != NULL) {2350source_file_name = source->as_C_string();2351buf_len += (int)strlen(source_file_name);2352}23532354char *module_name = NULL, *module_version = NULL;2355ModuleEntry* module = holder->module();2356if (module->is_named()) {2357module_name = module->name()->as_C_string();2358buf_len += (int)strlen(module_name);2359if (module->version() != NULL) {2360module_version = module->version()->as_C_string();2361buf_len += (int)strlen(module_version);2362}2363}23642365// Allocate temporary buffer with extra space for formatting and line number2366char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);23672368// Print stack trace line in buffer2369sprintf(buf, "\tat %s.%s(", klass_name, method_name);23702371// Print module information2372if (module_name != NULL) {2373if (module_version != NULL) {2374sprintf(buf + (int)strlen(buf), "%s@%s/", module_name, module_version);2375} else {2376sprintf(buf + (int)strlen(buf), "%s/", module_name);2377}2378}23792380// The method can be NULL if the requested class version is gone2381Method* method = holder->method_with_orig_idnum(method_id, version);2382if (!version_matches(method, version)) {2383strcat(buf, "Redefined)");2384} else {2385int line_number = Backtrace::get_line_number(method, bci);2386if (line_number == -2) {2387strcat(buf, "Native Method)");2388} else {2389if (source_file_name != NULL && (line_number != -1)) {2390// Sourcename and linenumber2391sprintf(buf + (int)strlen(buf), "%s:%d)", source_file_name, line_number);2392} else if (source_file_name != NULL) {2393// Just sourcename2394sprintf(buf + (int)strlen(buf), "%s)", source_file_name);2395} else {2396// Neither sourcename nor linenumber2397sprintf(buf + (int)strlen(buf), "Unknown Source)");2398}2399CompiledMethod* nm = method->code();2400if (WizardMode && nm != NULL) {2401sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm);2402}2403}2404}24052406st->print_cr("%s", buf);2407}24082409void java_lang_Throwable::print_stack_element(outputStream *st, Method* method, int bci) {2410Handle mirror (Thread::current(), method->method_holder()->java_mirror());2411int method_id = method->orig_method_idnum();2412int version = method->constants()->version();2413print_stack_element_to_stream(st, mirror, method_id, version, bci, method->name());2414}24152416/**2417* Print the throwable message and its stack trace plus all causes by walking the2418* cause chain. The output looks the same as of Throwable.printStackTrace().2419*/2420void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st) {2421// First, print the message.2422print(throwable(), st);2423st->cr();24242425// Now print the stack trace.2426JavaThread* THREAD = JavaThread::current(); // For exception macros.2427while (throwable.not_null()) {2428objArrayHandle result (THREAD, objArrayOop(backtrace(throwable())));2429if (result.is_null()) {2430st->print_raw_cr("\t<<no stack trace available>>");2431return;2432}2433BacktraceIterator iter(result, THREAD);24342435while (iter.repeat()) {2436BacktraceElement bte = iter.next(THREAD);2437print_stack_element_to_stream(st, bte._mirror, bte._method_id, bte._version, bte._bci, bte._name);2438}2439{2440// Call getCause() which doesn't necessarily return the _cause field.2441ExceptionMark em(THREAD);2442JavaValue cause(T_OBJECT);2443JavaCalls::call_virtual(&cause,2444throwable,2445throwable->klass(),2446vmSymbols::getCause_name(),2447vmSymbols::void_throwable_signature(),2448THREAD);2449// Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.2450if (HAS_PENDING_EXCEPTION) {2451CLEAR_PENDING_EXCEPTION;2452throwable = Handle();2453} else {2454throwable = Handle(THREAD, cause.get_oop());2455if (throwable.not_null()) {2456st->print("Caused by: ");2457print(throwable(), st);2458st->cr();2459}2460}2461}2462}2463}24642465/**2466* Print the throwable stack trace by calling the Java method java.lang.Throwable.printStackTrace().2467*/2468void java_lang_Throwable::java_printStackTrace(Handle throwable, TRAPS) {2469assert(throwable->is_a(vmClasses::Throwable_klass()), "Throwable instance expected");2470JavaValue result(T_VOID);2471JavaCalls::call_virtual(&result,2472throwable,2473vmClasses::Throwable_klass(),2474vmSymbols::printStackTrace_name(),2475vmSymbols::void_method_signature(),2476THREAD);2477}24782479void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS) {2480if (!StackTraceInThrowable) return;2481ResourceMark rm(THREAD);24822483// Start out by clearing the backtrace for this object, in case the VM2484// runs out of memory while allocating the stack trace2485set_backtrace(throwable(), NULL);2486// Clear lazily constructed Java level stacktrace if refilling occurs2487// This is unnecessary in 1.7+ but harmless2488clear_stacktrace(throwable());24892490int max_depth = MaxJavaStackTraceDepth;2491JavaThread* thread = THREAD;24922493BacktraceBuilder bt(CHECK);24942495// If there is no Java frame just return the method that was being called2496// with bci 02497if (!thread->has_last_Java_frame()) {2498if (max_depth >= 1 && method() != NULL) {2499bt.push(method(), 0, CHECK);2500log_info(stacktrace)("%s, %d", throwable->klass()->external_name(), 1);2501set_depth(throwable(), 1);2502set_backtrace(throwable(), bt.backtrace());2503}2504return;2505}25062507// Instead of using vframe directly, this version of fill_in_stack_trace2508// basically handles everything by hand. This significantly improved the2509// speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows.2510// See bug 6333838 for more details.2511// The "ASSERT" here is to verify this method generates the exactly same stack2512// trace as utilizing vframe.2513#ifdef ASSERT2514vframeStream st(thread, false /* stop_at_java_call_stub */, false /* process_frames */);2515#endif2516int total_count = 0;2517RegisterMap map(thread, false /* update */, false /* process_frames */);2518int decode_offset = 0;2519CompiledMethod* nm = NULL;2520bool skip_fillInStackTrace_check = false;2521bool skip_throwableInit_check = false;2522bool skip_hidden = !ShowHiddenFrames;25232524for (frame fr = thread->last_frame(); max_depth == 0 || max_depth != total_count;) {2525Method* method = NULL;2526int bci = 0;25272528// Compiled java method case.2529if (decode_offset != 0) {2530DebugInfoReadStream stream(nm, decode_offset);2531decode_offset = stream.read_int();2532method = (Method*)nm->metadata_at(stream.read_int());2533bci = stream.read_bci();2534} else {2535if (fr.is_first_frame()) break;2536address pc = fr.pc();2537if (fr.is_interpreted_frame()) {2538address bcp = fr.interpreter_frame_bcp();2539method = fr.interpreter_frame_method();2540bci = method->bci_from(bcp);2541fr = fr.sender(&map);2542} else {2543CodeBlob* cb = fr.cb();2544// HMMM QQQ might be nice to have frame return nm as NULL if cb is non-NULL2545// but non nmethod2546fr = fr.sender(&map);2547if (cb == NULL || !cb->is_compiled()) {2548continue;2549}2550nm = cb->as_compiled_method();2551if (nm->method()->is_native()) {2552method = nm->method();2553bci = 0;2554} else {2555PcDesc* pd = nm->pc_desc_at(pc);2556decode_offset = pd->scope_decode_offset();2557// if decode_offset is not equal to 0, it will execute the2558// "compiled java method case" at the beginning of the loop.2559continue;2560}2561}2562}2563#ifdef ASSERT2564assert(st.method() == method && st.bci() == bci,2565"Wrong stack trace");2566st.next();2567#endif25682569// the format of the stacktrace will be:2570// - 1 or more fillInStackTrace frames for the exception class (skipped)2571// - 0 or more <init> methods for the exception class (skipped)2572// - rest of the stack25732574if (!skip_fillInStackTrace_check) {2575if (method->name() == vmSymbols::fillInStackTrace_name() &&2576throwable->is_a(method->method_holder())) {2577continue;2578}2579else {2580skip_fillInStackTrace_check = true; // gone past them all2581}2582}2583if (!skip_throwableInit_check) {2584assert(skip_fillInStackTrace_check, "logic error in backtrace filtering");25852586// skip <init> methods of the exception class and superclasses2587// This is simlar to classic VM.2588if (method->name() == vmSymbols::object_initializer_name() &&2589throwable->is_a(method->method_holder())) {2590continue;2591} else {2592// there are none or we've seen them all - either way stop checking2593skip_throwableInit_check = true;2594}2595}2596if (method->is_hidden()) {2597if (skip_hidden) {2598if (total_count == 0) {2599// The top frame will be hidden from the stack trace.2600bt.set_has_hidden_top_frame();2601}2602continue;2603}2604}2605bt.push(method, bci, CHECK);2606total_count++;2607}26082609log_info(stacktrace)("%s, %d", throwable->klass()->external_name(), total_count);26102611// Put completed stack trace into throwable object2612set_backtrace(throwable(), bt.backtrace());2613set_depth(throwable(), total_count);2614}26152616void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method) {2617// No-op if stack trace is disabled2618if (!StackTraceInThrowable) {2619return;2620}26212622// Disable stack traces for some preallocated out of memory errors2623if (!Universe::should_fill_in_stack_trace(throwable)) {2624return;2625}26262627JavaThread* THREAD = JavaThread::current(); // For exception macros.2628PreserveExceptionMark pm(THREAD);26292630fill_in_stack_trace(throwable, method, THREAD);2631// Ignore exceptions thrown during stack trace filling (OOM) and reinstall the2632// original exception via the PreserveExceptionMark destructor.2633CLEAR_PENDING_EXCEPTION;2634}26352636void java_lang_Throwable::allocate_backtrace(Handle throwable, TRAPS) {2637// Allocate stack trace - backtrace is created but not filled in26382639// No-op if stack trace is disabled2640if (!StackTraceInThrowable) return;2641BacktraceBuilder bt(CHECK); // creates a backtrace2642set_backtrace(throwable(), bt.backtrace());2643}264426452646void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) {2647// Fill in stack trace into preallocated backtrace (no GC)26482649// No-op if stack trace is disabled2650if (!StackTraceInThrowable) return;26512652assert(throwable->is_a(vmClasses::Throwable_klass()), "sanity check");26532654JavaThread* THREAD = JavaThread::current(); // For exception macros.26552656objArrayHandle backtrace (THREAD, (objArrayOop)java_lang_Throwable::backtrace(throwable()));2657assert(backtrace.not_null(), "backtrace should have been preallocated");26582659ResourceMark rm(THREAD);2660vframeStream st(THREAD, false /* stop_at_java_call_stub */, false /* process_frames */);26612662BacktraceBuilder bt(THREAD, backtrace);26632664// Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init2665// methods as preallocated errors aren't created by "java" code.26662667// fill in as much stack trace as possible2668int chunk_count = 0;2669for (;!st.at_end(); st.next()) {2670bt.push(st.method(), st.bci(), CHECK);2671chunk_count++;26722673// Bail-out for deep stacks2674if (chunk_count >= trace_chunk_size) break;2675}2676set_depth(throwable(), chunk_count);2677log_info(stacktrace)("%s, %d", throwable->klass()->external_name(), chunk_count);26782679// We support the Throwable immutability protocol defined for Java 7.2680java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace());2681assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized");2682}26832684void java_lang_Throwable::get_stack_trace_elements(Handle throwable,2685objArrayHandle stack_trace_array_h, TRAPS) {26862687if (throwable.is_null() || stack_trace_array_h.is_null()) {2688THROW(vmSymbols::java_lang_NullPointerException());2689}26902691assert(stack_trace_array_h->is_objArray(), "Stack trace array should be an array of StackTraceElenent");26922693if (stack_trace_array_h->length() != depth(throwable())) {2694THROW(vmSymbols::java_lang_IndexOutOfBoundsException());2695}26962697objArrayHandle result(THREAD, objArrayOop(backtrace(throwable())));2698BacktraceIterator iter(result, THREAD);26992700int index = 0;2701while (iter.repeat()) {2702BacktraceElement bte = iter.next(THREAD);27032704Handle stack_trace_element(THREAD, stack_trace_array_h->obj_at(index++));27052706if (stack_trace_element.is_null()) {2707THROW(vmSymbols::java_lang_NullPointerException());2708}27092710InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror()));2711methodHandle method (THREAD, holder->method_with_orig_idnum(bte._method_id, bte._version));27122713java_lang_StackTraceElement::fill_in(stack_trace_element, holder,2714method,2715bte._version,2716bte._bci,2717bte._name, CHECK);2718}2719}27202721bool java_lang_Throwable::get_top_method_and_bci(oop throwable, Method** method, int* bci) {2722JavaThread* current = JavaThread::current();2723objArrayHandle result(current, objArrayOop(backtrace(throwable)));2724BacktraceIterator iter(result, current);2725// No backtrace available.2726if (!iter.repeat()) return false;27272728// If the exception happened in a frame that has been hidden, i.e.,2729// omitted from the back trace, we can not compute the message.2730oop hidden = ((objArrayOop)backtrace(throwable))->obj_at(trace_hidden_offset);2731if (hidden != NULL) {2732return false;2733}27342735// Get first backtrace element.2736BacktraceElement bte = iter.next(current);27372738InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(bte._mirror()));2739assert(holder != NULL, "first element should be non-null");2740Method* m = holder->method_with_orig_idnum(bte._method_id, bte._version);27412742// Original version is no longer available.2743if (m == NULL || !version_matches(m, bte._version)) {2744return false;2745}27462747*method = m;2748*bci = bte._bci;2749return true;2750}27512752oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) {2753// Allocate java.lang.StackTraceElement instance2754InstanceKlass* k = vmClasses::StackTraceElement_klass();2755assert(k != NULL, "must be loaded in 1.4+");2756if (k->should_be_initialized()) {2757k->initialize(CHECK_NULL);2758}27592760Handle element = k->allocate_instance_handle(CHECK_NULL);27612762int version = method->constants()->version();2763fill_in(element, method->method_holder(), method, version, bci, method->name(), CHECK_NULL);2764return element();2765}27662767void java_lang_StackTraceElement::fill_in(Handle element,2768InstanceKlass* holder, const methodHandle& method,2769int version, int bci, Symbol* name, TRAPS) {2770assert(element->is_a(vmClasses::StackTraceElement_klass()), "sanity check");27712772ResourceMark rm(THREAD);2773HandleMark hm(THREAD);27742775// Fill in class name2776Handle java_class(THREAD, holder->java_mirror());2777oop classname = java_lang_Class::name(java_class, CHECK);2778java_lang_StackTraceElement::set_declaringClass(element(), classname);2779java_lang_StackTraceElement::set_declaringClassObject(element(), java_class());27802781oop loader = holder->class_loader();2782if (loader != NULL) {2783oop loader_name = java_lang_ClassLoader::name(loader);2784if (loader_name != NULL)2785java_lang_StackTraceElement::set_classLoaderName(element(), loader_name);2786}27872788// Fill in method name2789oop methodname = StringTable::intern(name, CHECK);2790java_lang_StackTraceElement::set_methodName(element(), methodname);27912792// Fill in module name and version2793ModuleEntry* module = holder->module();2794if (module->is_named()) {2795oop module_name = StringTable::intern(module->name(), CHECK);2796java_lang_StackTraceElement::set_moduleName(element(), module_name);2797oop module_version;2798if (module->version() != NULL) {2799module_version = StringTable::intern(module->version(), CHECK);2800} else {2801module_version = NULL;2802}2803java_lang_StackTraceElement::set_moduleVersion(element(), module_version);2804}28052806if (method() == NULL || !version_matches(method(), version)) {2807// The method was redefined, accurate line number information isn't available2808java_lang_StackTraceElement::set_fileName(element(), NULL);2809java_lang_StackTraceElement::set_lineNumber(element(), -1);2810} else {2811Symbol* source;2812oop source_file;2813int line_number;2814decode_file_and_line(java_class, holder, version, method, bci, source, source_file, line_number, CHECK);28152816java_lang_StackTraceElement::set_fileName(element(), source_file);2817java_lang_StackTraceElement::set_lineNumber(element(), line_number);2818}2819}28202821void java_lang_StackTraceElement::decode_file_and_line(Handle java_class,2822InstanceKlass* holder,2823int version,2824const methodHandle& method,2825int bci,2826Symbol*& source,2827oop& source_file,2828int& line_number, TRAPS) {2829// Fill in source file name and line number.2830source = Backtrace::get_source_file_name(holder, version);2831source_file = java_lang_Class::source_file(java_class());2832if (source != NULL) {2833// Class was not redefined. We can trust its cache if set,2834// else we have to initialize it.2835if (source_file == NULL) {2836source_file = StringTable::intern(source, CHECK);2837java_lang_Class::set_source_file(java_class(), source_file);2838}2839} else {2840// Class was redefined. Dump the cache if it was set.2841if (source_file != NULL) {2842source_file = NULL;2843java_lang_Class::set_source_file(java_class(), source_file);2844}2845}2846line_number = Backtrace::get_line_number(method(), bci);2847}28482849#if INCLUDE_JVMCI2850void java_lang_StackTraceElement::decode(const methodHandle& method, int bci,2851Symbol*& filename, int& line_number, TRAPS) {2852ResourceMark rm(THREAD);2853HandleMark hm(THREAD);28542855filename = NULL;2856line_number = -1;28572858oop source_file;2859int version = method->constants()->version();2860InstanceKlass* holder = method->method_holder();2861Handle java_class(THREAD, holder->java_mirror());2862decode_file_and_line(java_class, holder, version, method, bci, filename, source_file, line_number, CHECK);2863}2864#endif // INCLUDE_JVMCI28652866// java_lang_StackFrameInfo28672868int java_lang_StackFrameInfo::_memberName_offset;2869int java_lang_StackFrameInfo::_bci_offset;2870int java_lang_StackFrameInfo::_version_offset;28712872#define STACKFRAMEINFO_FIELDS_DO(macro) \2873macro(_memberName_offset, k, "memberName", object_signature, false); \2874macro(_bci_offset, k, "bci", int_signature, false)28752876void java_lang_StackFrameInfo::compute_offsets() {2877InstanceKlass* k = vmClasses::StackFrameInfo_klass();2878STACKFRAMEINFO_FIELDS_DO(FIELD_COMPUTE_OFFSET);2879STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);2880}28812882#if INCLUDE_CDS2883void java_lang_StackFrameInfo::serialize_offsets(SerializeClosure* f) {2884STACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET);2885STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);2886}2887#endif28882889Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {2890HandleMark hm(THREAD);2891Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));2892Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());2893// we should expand MemberName::name when Throwable uses StackTrace2894// MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);2895return method;2896}28972898void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) {2899// set Method* or mid/cpref2900HandleMark hm(THREAD);2901Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));2902InstanceKlass* ik = method->method_holder();2903CallInfo info(method(), ik, CHECK);2904MethodHandles::init_method_MemberName(mname, info);2905// set bci2906java_lang_StackFrameInfo::set_bci(stackFrame(), bci);2907// method may be redefined; store the version2908int version = method->constants()->version();2909assert((jushort)version == version, "version should be short");2910java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);2911}29122913void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPS) {2914ResourceMark rm(THREAD);2915HandleMark hm(THREAD);2916Handle mname(THREAD, stackFrame->obj_field(java_lang_StackFrameInfo::_memberName_offset));2917Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));2918InstanceKlass* holder = InstanceKlass::cast(clazz);2919Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);29202921short version = stackFrame->short_field(_version_offset);2922int bci = stackFrame->int_field(_bci_offset);2923Symbol* name = method->name();2924java_lang_StackTraceElement::fill_in(stack_trace_element, holder, methodHandle(THREAD, method),2925version, bci, name, CHECK);2926}29272928void java_lang_StackFrameInfo::set_version(oop element, short value) {2929element->short_field_put(_version_offset, value);2930}29312932void java_lang_StackFrameInfo::set_bci(oop element, int value) {2933assert(value >= 0 && value < max_jushort, "must be a valid bci value");2934element->int_field_put(_bci_offset, value);2935}29362937int java_lang_LiveStackFrameInfo::_monitors_offset;2938int java_lang_LiveStackFrameInfo::_locals_offset;2939int java_lang_LiveStackFrameInfo::_operands_offset;2940int java_lang_LiveStackFrameInfo::_mode_offset;29412942#define LIVESTACKFRAMEINFO_FIELDS_DO(macro) \2943macro(_monitors_offset, k, "monitors", object_array_signature, false); \2944macro(_locals_offset, k, "locals", object_array_signature, false); \2945macro(_operands_offset, k, "operands", object_array_signature, false); \2946macro(_mode_offset, k, "mode", int_signature, false)29472948void java_lang_LiveStackFrameInfo::compute_offsets() {2949InstanceKlass* k = vmClasses::LiveStackFrameInfo_klass();2950LIVESTACKFRAMEINFO_FIELDS_DO(FIELD_COMPUTE_OFFSET);2951}29522953#if INCLUDE_CDS2954void java_lang_LiveStackFrameInfo::serialize_offsets(SerializeClosure* f) {2955LIVESTACKFRAMEINFO_FIELDS_DO(FIELD_SERIALIZE_OFFSET);2956}2957#endif29582959void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) {2960element->obj_field_put(_monitors_offset, value);2961}29622963void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) {2964element->obj_field_put(_locals_offset, value);2965}29662967void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) {2968element->obj_field_put(_operands_offset, value);2969}29702971void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) {2972element->int_field_put(_mode_offset, value);2973}297429752976// java_lang_AccessibleObject29772978int java_lang_reflect_AccessibleObject::_override_offset;29792980#define ACCESSIBLEOBJECT_FIELDS_DO(macro) \2981macro(_override_offset, k, "override", bool_signature, false)29822983void java_lang_reflect_AccessibleObject::compute_offsets() {2984InstanceKlass* k = vmClasses::reflect_AccessibleObject_klass();2985ACCESSIBLEOBJECT_FIELDS_DO(FIELD_COMPUTE_OFFSET);2986}29872988#if INCLUDE_CDS2989void java_lang_reflect_AccessibleObject::serialize_offsets(SerializeClosure* f) {2990ACCESSIBLEOBJECT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);2991}2992#endif29932994jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {2995return (jboolean) reflect->bool_field(_override_offset);2996}29972998void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {2999reflect->bool_field_put(_override_offset, (int) value);3000}30013002// java_lang_reflect_Method30033004int java_lang_reflect_Method::_clazz_offset;3005int java_lang_reflect_Method::_name_offset;3006int java_lang_reflect_Method::_returnType_offset;3007int java_lang_reflect_Method::_parameterTypes_offset;3008int java_lang_reflect_Method::_exceptionTypes_offset;3009int java_lang_reflect_Method::_slot_offset;3010int java_lang_reflect_Method::_modifiers_offset;3011int java_lang_reflect_Method::_signature_offset;3012int java_lang_reflect_Method::_annotations_offset;3013int java_lang_reflect_Method::_parameter_annotations_offset;3014int java_lang_reflect_Method::_annotation_default_offset;30153016#define METHOD_FIELDS_DO(macro) \3017macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \3018macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \3019macro(_returnType_offset, k, vmSymbols::returnType_name(), class_signature, false); \3020macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false); \3021macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), class_array_signature, false); \3022macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \3023macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \3024macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \3025macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); \3026macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), byte_array_signature, false); \3027macro(_annotation_default_offset, k, vmSymbols::annotation_default_name(), byte_array_signature, false);30283029void java_lang_reflect_Method::compute_offsets() {3030InstanceKlass* k = vmClasses::reflect_Method_klass();3031METHOD_FIELDS_DO(FIELD_COMPUTE_OFFSET);3032}30333034#if INCLUDE_CDS3035void java_lang_reflect_Method::serialize_offsets(SerializeClosure* f) {3036METHOD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3037}3038#endif30393040Handle java_lang_reflect_Method::create(TRAPS) {3041assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");3042Klass* klass = vmClasses::reflect_Method_klass();3043// This class is eagerly initialized during VM initialization, since we keep a refence3044// to one of the methods3045assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized");3046return InstanceKlass::cast(klass)->allocate_instance_handle(THREAD);3047}30483049oop java_lang_reflect_Method::clazz(oop reflect) {3050return reflect->obj_field(_clazz_offset);3051}30523053void java_lang_reflect_Method::set_clazz(oop reflect, oop value) {3054reflect->obj_field_put(_clazz_offset, value);3055}30563057int java_lang_reflect_Method::slot(oop reflect) {3058return reflect->int_field(_slot_offset);3059}30603061void java_lang_reflect_Method::set_slot(oop reflect, int value) {3062reflect->int_field_put(_slot_offset, value);3063}30643065void java_lang_reflect_Method::set_name(oop method, oop value) {3066method->obj_field_put(_name_offset, value);3067}30683069oop java_lang_reflect_Method::return_type(oop method) {3070return method->obj_field(_returnType_offset);3071}30723073void java_lang_reflect_Method::set_return_type(oop method, oop value) {3074method->obj_field_put(_returnType_offset, value);3075}30763077oop java_lang_reflect_Method::parameter_types(oop method) {3078return method->obj_field(_parameterTypes_offset);3079}30803081void java_lang_reflect_Method::set_parameter_types(oop method, oop value) {3082method->obj_field_put(_parameterTypes_offset, value);3083}30843085void java_lang_reflect_Method::set_exception_types(oop method, oop value) {3086method->obj_field_put(_exceptionTypes_offset, value);3087}30883089void java_lang_reflect_Method::set_modifiers(oop method, int value) {3090method->int_field_put(_modifiers_offset, value);3091}30923093void java_lang_reflect_Method::set_signature(oop method, oop value) {3094method->obj_field_put(_signature_offset, value);3095}30963097void java_lang_reflect_Method::set_annotations(oop method, oop value) {3098method->obj_field_put(_annotations_offset, value);3099}31003101void java_lang_reflect_Method::set_parameter_annotations(oop method, oop value) {3102method->obj_field_put(_parameter_annotations_offset, value);3103}31043105void java_lang_reflect_Method::set_annotation_default(oop method, oop value) {3106method->obj_field_put(_annotation_default_offset, value);3107}31083109int java_lang_reflect_Constructor::_clazz_offset;3110int java_lang_reflect_Constructor::_parameterTypes_offset;3111int java_lang_reflect_Constructor::_exceptionTypes_offset;3112int java_lang_reflect_Constructor::_slot_offset;3113int java_lang_reflect_Constructor::_modifiers_offset;3114int java_lang_reflect_Constructor::_signature_offset;3115int java_lang_reflect_Constructor::_annotations_offset;3116int java_lang_reflect_Constructor::_parameter_annotations_offset;31173118#define CONSTRUCTOR_FIELDS_DO(macro) \3119macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \3120macro(_parameterTypes_offset, k, vmSymbols::parameterTypes_name(), class_array_signature, false); \3121macro(_exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), class_array_signature, false); \3122macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \3123macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \3124macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \3125macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false); \3126macro(_parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), byte_array_signature, false);31273128void java_lang_reflect_Constructor::compute_offsets() {3129InstanceKlass* k = vmClasses::reflect_Constructor_klass();3130CONSTRUCTOR_FIELDS_DO(FIELD_COMPUTE_OFFSET);3131}31323133#if INCLUDE_CDS3134void java_lang_reflect_Constructor::serialize_offsets(SerializeClosure* f) {3135CONSTRUCTOR_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3136}3137#endif31383139Handle java_lang_reflect_Constructor::create(TRAPS) {3140assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");3141Symbol* name = vmSymbols::java_lang_reflect_Constructor();3142Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);3143InstanceKlass* ik = InstanceKlass::cast(k);3144// Ensure it is initialized3145ik->initialize(CHECK_NH);3146return ik->allocate_instance_handle(THREAD);3147}31483149oop java_lang_reflect_Constructor::clazz(oop reflect) {3150return reflect->obj_field(_clazz_offset);3151}31523153void java_lang_reflect_Constructor::set_clazz(oop reflect, oop value) {3154reflect->obj_field_put(_clazz_offset, value);3155}31563157oop java_lang_reflect_Constructor::parameter_types(oop constructor) {3158return constructor->obj_field(_parameterTypes_offset);3159}31603161void java_lang_reflect_Constructor::set_parameter_types(oop constructor, oop value) {3162constructor->obj_field_put(_parameterTypes_offset, value);3163}31643165void java_lang_reflect_Constructor::set_exception_types(oop constructor, oop value) {3166constructor->obj_field_put(_exceptionTypes_offset, value);3167}31683169int java_lang_reflect_Constructor::slot(oop reflect) {3170return reflect->int_field(_slot_offset);3171}31723173void java_lang_reflect_Constructor::set_slot(oop reflect, int value) {3174reflect->int_field_put(_slot_offset, value);3175}31763177void java_lang_reflect_Constructor::set_modifiers(oop constructor, int value) {3178constructor->int_field_put(_modifiers_offset, value);3179}31803181void java_lang_reflect_Constructor::set_signature(oop constructor, oop value) {3182constructor->obj_field_put(_signature_offset, value);3183}31843185void java_lang_reflect_Constructor::set_annotations(oop constructor, oop value) {3186constructor->obj_field_put(_annotations_offset, value);3187}31883189void java_lang_reflect_Constructor::set_parameter_annotations(oop method, oop value) {3190method->obj_field_put(_parameter_annotations_offset, value);3191}31923193int java_lang_reflect_Field::_clazz_offset;3194int java_lang_reflect_Field::_name_offset;3195int java_lang_reflect_Field::_type_offset;3196int java_lang_reflect_Field::_slot_offset;3197int java_lang_reflect_Field::_modifiers_offset;3198int java_lang_reflect_Field::_trusted_final_offset;3199int java_lang_reflect_Field::_signature_offset;3200int java_lang_reflect_Field::_annotations_offset;32013202#define FIELD_FIELDS_DO(macro) \3203macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \3204macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \3205macro(_type_offset, k, vmSymbols::type_name(), class_signature, false); \3206macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \3207macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \3208macro(_trusted_final_offset, k, vmSymbols::trusted_final_name(), bool_signature, false); \3209macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \3210macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false);32113212void java_lang_reflect_Field::compute_offsets() {3213InstanceKlass* k = vmClasses::reflect_Field_klass();3214FIELD_FIELDS_DO(FIELD_COMPUTE_OFFSET);3215}32163217#if INCLUDE_CDS3218void java_lang_reflect_Field::serialize_offsets(SerializeClosure* f) {3219FIELD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3220}3221#endif32223223Handle java_lang_reflect_Field::create(TRAPS) {3224assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");3225Symbol* name = vmSymbols::java_lang_reflect_Field();3226Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);3227InstanceKlass* ik = InstanceKlass::cast(k);3228// Ensure it is initialized3229ik->initialize(CHECK_NH);3230return ik->allocate_instance_handle(THREAD);3231}32323233oop java_lang_reflect_Field::clazz(oop reflect) {3234return reflect->obj_field(_clazz_offset);3235}32363237void java_lang_reflect_Field::set_clazz(oop reflect, oop value) {3238reflect->obj_field_put(_clazz_offset, value);3239}32403241oop java_lang_reflect_Field::name(oop field) {3242return field->obj_field(_name_offset);3243}32443245void java_lang_reflect_Field::set_name(oop field, oop value) {3246field->obj_field_put(_name_offset, value);3247}32483249oop java_lang_reflect_Field::type(oop field) {3250return field->obj_field(_type_offset);3251}32523253void java_lang_reflect_Field::set_type(oop field, oop value) {3254field->obj_field_put(_type_offset, value);3255}32563257int java_lang_reflect_Field::slot(oop reflect) {3258return reflect->int_field(_slot_offset);3259}32603261void java_lang_reflect_Field::set_slot(oop reflect, int value) {3262reflect->int_field_put(_slot_offset, value);3263}32643265int java_lang_reflect_Field::modifiers(oop field) {3266return field->int_field(_modifiers_offset);3267}32683269void java_lang_reflect_Field::set_modifiers(oop field, int value) {3270field->int_field_put(_modifiers_offset, value);3271}32723273void java_lang_reflect_Field::set_trusted_final(oop field) {3274field->bool_field_put(_trusted_final_offset, true);3275}32763277void java_lang_reflect_Field::set_signature(oop field, oop value) {3278field->obj_field_put(_signature_offset, value);3279}32803281void java_lang_reflect_Field::set_annotations(oop field, oop value) {3282field->obj_field_put(_annotations_offset, value);3283}32843285oop java_lang_reflect_RecordComponent::create(InstanceKlass* holder, RecordComponent* component, TRAPS) {3286// Allocate java.lang.reflect.RecordComponent instance3287HandleMark hm(THREAD);3288InstanceKlass* ik = vmClasses::RecordComponent_klass();3289assert(ik != NULL, "must be loaded");3290ik->initialize(CHECK_NULL);32913292Handle element = ik->allocate_instance_handle(CHECK_NULL);32933294Handle decl_class(THREAD, holder->java_mirror());3295java_lang_reflect_RecordComponent::set_clazz(element(), decl_class());32963297Symbol* name = holder->constants()->symbol_at(component->name_index()); // name_index is a utf83298oop component_name = StringTable::intern(name, CHECK_NULL);3299java_lang_reflect_RecordComponent::set_name(element(), component_name);33003301Symbol* type = holder->constants()->symbol_at(component->descriptor_index());3302Handle component_type_h =3303SystemDictionary::find_java_mirror_for_type(type, holder, SignatureStream::NCDFError, CHECK_NULL);3304java_lang_reflect_RecordComponent::set_type(element(), component_type_h());33053306Method* accessor_method = NULL;3307{3308// Prepend "()" to type to create the full method signature.3309ResourceMark rm(THREAD);3310int sig_len = type->utf8_length() + 3; // "()" and null char3311char* sig = NEW_RESOURCE_ARRAY(char, sig_len);3312jio_snprintf(sig, sig_len, "%c%c%s", JVM_SIGNATURE_FUNC, JVM_SIGNATURE_ENDFUNC, type->as_C_string());3313TempNewSymbol full_sig = SymbolTable::new_symbol(sig);3314accessor_method = holder->find_instance_method(name, full_sig, Klass::PrivateLookupMode::find);3315}33163317if (accessor_method != NULL) {3318methodHandle method(THREAD, accessor_method);3319oop m = Reflection::new_method(method, false, CHECK_NULL);3320java_lang_reflect_RecordComponent::set_accessor(element(), m);3321} else {3322java_lang_reflect_RecordComponent::set_accessor(element(), NULL);3323}33243325int sig_index = component->generic_signature_index();3326if (sig_index > 0) {3327Symbol* sig = holder->constants()->symbol_at(sig_index); // sig_index is a utf83328oop component_sig = StringTable::intern(sig, CHECK_NULL);3329java_lang_reflect_RecordComponent::set_signature(element(), component_sig);3330} else {3331java_lang_reflect_RecordComponent::set_signature(element(), NULL);3332}33333334typeArrayOop annotation_oop = Annotations::make_java_array(component->annotations(), CHECK_NULL);3335java_lang_reflect_RecordComponent::set_annotations(element(), annotation_oop);33363337typeArrayOop type_annotation_oop = Annotations::make_java_array(component->type_annotations(), CHECK_NULL);3338java_lang_reflect_RecordComponent::set_typeAnnotations(element(), type_annotation_oop);33393340return element();3341}33423343int reflect_ConstantPool::_oop_offset;33443345#define CONSTANTPOOL_FIELDS_DO(macro) \3346macro(_oop_offset, k, "constantPoolOop", object_signature, false)33473348void reflect_ConstantPool::compute_offsets() {3349InstanceKlass* k = vmClasses::reflect_ConstantPool_klass();3350// The field is called ConstantPool* in the sun.reflect.ConstantPool class.3351CONSTANTPOOL_FIELDS_DO(FIELD_COMPUTE_OFFSET);3352}33533354#if INCLUDE_CDS3355void reflect_ConstantPool::serialize_offsets(SerializeClosure* f) {3356CONSTANTPOOL_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3357}3358#endif33593360int java_lang_reflect_Parameter::_name_offset;3361int java_lang_reflect_Parameter::_modifiers_offset;3362int java_lang_reflect_Parameter::_index_offset;3363int java_lang_reflect_Parameter::_executable_offset;33643365#define PARAMETER_FIELDS_DO(macro) \3366macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \3367macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \3368macro(_index_offset, k, vmSymbols::index_name(), int_signature, false); \3369macro(_executable_offset, k, vmSymbols::executable_name(), executable_signature, false)33703371void java_lang_reflect_Parameter::compute_offsets() {3372InstanceKlass* k = vmClasses::reflect_Parameter_klass();3373PARAMETER_FIELDS_DO(FIELD_COMPUTE_OFFSET);3374}33753376#if INCLUDE_CDS3377void java_lang_reflect_Parameter::serialize_offsets(SerializeClosure* f) {3378PARAMETER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3379}3380#endif33813382Handle java_lang_reflect_Parameter::create(TRAPS) {3383assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");3384Symbol* name = vmSymbols::java_lang_reflect_Parameter();3385Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);3386InstanceKlass* ik = InstanceKlass::cast(k);3387// Ensure it is initialized3388ik->initialize(CHECK_NH);3389return ik->allocate_instance_handle(THREAD);3390}33913392oop java_lang_reflect_Parameter::name(oop param) {3393return param->obj_field(_name_offset);3394}33953396void java_lang_reflect_Parameter::set_name(oop param, oop value) {3397param->obj_field_put(_name_offset, value);3398}33993400int java_lang_reflect_Parameter::modifiers(oop param) {3401return param->int_field(_modifiers_offset);3402}34033404void java_lang_reflect_Parameter::set_modifiers(oop param, int value) {3405param->int_field_put(_modifiers_offset, value);3406}34073408int java_lang_reflect_Parameter::index(oop param) {3409return param->int_field(_index_offset);3410}34113412void java_lang_reflect_Parameter::set_index(oop param, int value) {3413param->int_field_put(_index_offset, value);3414}34153416oop java_lang_reflect_Parameter::executable(oop param) {3417return param->obj_field(_executable_offset);3418}34193420void java_lang_reflect_Parameter::set_executable(oop param, oop value) {3421param->obj_field_put(_executable_offset, value);3422}34233424// java_lang_Module34253426int java_lang_Module::_loader_offset;3427int java_lang_Module::_name_offset;3428int java_lang_Module::_module_entry_offset;34293430Handle java_lang_Module::create(Handle loader, Handle module_name, TRAPS) {3431assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");3432return JavaCalls::construct_new_instance(vmClasses::Module_klass(),3433vmSymbols::java_lang_module_init_signature(),3434loader, module_name, CHECK_NH);3435}34363437#define MODULE_FIELDS_DO(macro) \3438macro(_loader_offset, k, vmSymbols::loader_name(), classloader_signature, false); \3439macro(_name_offset, k, vmSymbols::name_name(), string_signature, false)34403441void java_lang_Module::compute_offsets() {3442InstanceKlass* k = vmClasses::Module_klass();3443MODULE_FIELDS_DO(FIELD_COMPUTE_OFFSET);3444MODULE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);3445}34463447#if INCLUDE_CDS3448void java_lang_Module::serialize_offsets(SerializeClosure* f) {3449MODULE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3450MODULE_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);3451}3452#endif34533454oop java_lang_Module::loader(oop module) {3455return module->obj_field(_loader_offset);3456}34573458void java_lang_Module::set_loader(oop module, oop value) {3459module->obj_field_put(_loader_offset, value);3460}34613462oop java_lang_Module::name(oop module) {3463return module->obj_field(_name_offset);3464}34653466void java_lang_Module::set_name(oop module, oop value) {3467module->obj_field_put(_name_offset, value);3468}34693470ModuleEntry* java_lang_Module::module_entry_raw(oop module) {3471assert(_module_entry_offset != 0, "Uninitialized module_entry_offset");3472assert(module != NULL, "module can't be null");3473assert(oopDesc::is_oop(module), "module must be oop");34743475ModuleEntry* module_entry = (ModuleEntry*)module->address_field(_module_entry_offset);3476return module_entry;3477}34783479ModuleEntry* java_lang_Module::module_entry(oop module) {3480ModuleEntry* module_entry = module_entry_raw(module);3481if (module_entry == NULL) {3482// If the inject field containing the ModuleEntry* is null then return the3483// class loader's unnamed module.3484oop loader = java_lang_Module::loader(module);3485Handle h_loader = Handle(Thread::current(), loader);3486ClassLoaderData* loader_cld = SystemDictionary::register_loader(h_loader);3487return loader_cld->unnamed_module();3488}3489return module_entry;3490}34913492void java_lang_Module::set_module_entry(oop module, ModuleEntry* module_entry) {3493assert(_module_entry_offset != 0, "Uninitialized module_entry_offset");3494assert(module != NULL, "module can't be null");3495assert(oopDesc::is_oop(module), "module must be oop");3496module->address_field_put(_module_entry_offset, (address)module_entry);3497}34983499Handle reflect_ConstantPool::create(TRAPS) {3500assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");3501InstanceKlass* k = vmClasses::reflect_ConstantPool_klass();3502// Ensure it is initialized3503k->initialize(CHECK_NH);3504return k->allocate_instance_handle(THREAD);3505}350635073508void reflect_ConstantPool::set_cp(oop reflect, ConstantPool* value) {3509oop mirror = value->pool_holder()->java_mirror();3510// Save the mirror to get back the constant pool.3511reflect->obj_field_put(_oop_offset, mirror);3512}35133514ConstantPool* reflect_ConstantPool::get_cp(oop reflect) {35153516oop mirror = reflect->obj_field(_oop_offset);3517Klass* k = java_lang_Class::as_Klass(mirror);3518assert(k->is_instance_klass(), "Must be");35193520// Get the constant pool back from the klass. Since class redefinition3521// merges the new constant pool into the old, this is essentially the3522// same constant pool as the original. If constant pool merging is3523// no longer done in the future, this will have to change to save3524// the original.3525return InstanceKlass::cast(k)->constants();3526}35273528int reflect_UnsafeStaticFieldAccessorImpl::_base_offset;35293530#define UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(macro) \3531macro(_base_offset, k, "base", object_signature, false)35323533void reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() {3534InstanceKlass* k = vmClasses::reflect_UnsafeStaticFieldAccessorImpl_klass();3535UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(FIELD_COMPUTE_OFFSET);3536}35373538#if INCLUDE_CDS3539void reflect_UnsafeStaticFieldAccessorImpl::serialize_offsets(SerializeClosure* f) {3540UNSAFESTATICFIELDACCESSORIMPL_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3541}3542#endif35433544// Support for java_lang_ref_Reference35453546bool java_lang_ref_Reference::_offsets_initialized;35473548int java_lang_ref_Reference::_referent_offset;3549int java_lang_ref_Reference::_queue_offset;3550int java_lang_ref_Reference::_next_offset;3551int java_lang_ref_Reference::_discovered_offset;35523553#define REFERENCE_FIELDS_DO(macro) \3554macro(_referent_offset, k, "referent", object_signature, false); \3555macro(_queue_offset, k, "queue", referencequeue_signature, false); \3556macro(_next_offset, k, "next", reference_signature, false); \3557macro(_discovered_offset, k, "discovered", reference_signature, false);35583559void java_lang_ref_Reference::compute_offsets() {3560if (_offsets_initialized) {3561return;3562}3563_offsets_initialized = true;3564InstanceKlass* k = vmClasses::Reference_klass();3565REFERENCE_FIELDS_DO(FIELD_COMPUTE_OFFSET);3566}35673568#if INCLUDE_CDS3569void java_lang_ref_Reference::serialize_offsets(SerializeClosure* f) {3570f->do_bool(&_offsets_initialized);3571REFERENCE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3572}3573#endif35743575bool java_lang_ref_Reference::is_referent_field(oop obj, ptrdiff_t offset) {3576assert(obj != NULL, "sanity");3577if (offset != _referent_offset) {3578return false;3579}35803581Klass* k = obj->klass();3582if (!k->is_instance_klass()) {3583return false;3584}35853586InstanceKlass* ik = InstanceKlass::cast(obj->klass());3587bool is_reference = ik->reference_type() != REF_NONE;3588assert(!is_reference || ik->is_subclass_of(vmClasses::Reference_klass()), "sanity");3589return is_reference;3590}35913592int java_lang_boxing_object::_value_offset;3593int java_lang_boxing_object::_long_value_offset;35943595#define BOXING_FIELDS_DO(macro) \3596macro(_value_offset, integerKlass, "value", int_signature, false); \3597macro(_long_value_offset, longKlass, "value", long_signature, false);35983599void java_lang_boxing_object::compute_offsets() {3600InstanceKlass* integerKlass = vmClasses::Integer_klass();3601InstanceKlass* longKlass = vmClasses::Long_klass();3602BOXING_FIELDS_DO(FIELD_COMPUTE_OFFSET);3603}36043605#if INCLUDE_CDS3606void java_lang_boxing_object::serialize_offsets(SerializeClosure* f) {3607BOXING_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3608}3609#endif36103611oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {3612Klass* k = vmClasses::box_klass(type);3613if (k == NULL) return NULL;3614InstanceKlass* ik = InstanceKlass::cast(k);3615if (!ik->is_initialized()) ik->initialize(CHECK_NULL);3616return ik->allocate_instance(THREAD);3617}361836193620oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {3621oop box = initialize_and_allocate(type, CHECK_NULL);3622if (box == NULL) return NULL;3623switch (type) {3624case T_BOOLEAN:3625box->bool_field_put(_value_offset, value->z);3626break;3627case T_CHAR:3628box->char_field_put(_value_offset, value->c);3629break;3630case T_FLOAT:3631box->float_field_put(_value_offset, value->f);3632break;3633case T_DOUBLE:3634box->double_field_put(_long_value_offset, value->d);3635break;3636case T_BYTE:3637box->byte_field_put(_value_offset, value->b);3638break;3639case T_SHORT:3640box->short_field_put(_value_offset, value->s);3641break;3642case T_INT:3643box->int_field_put(_value_offset, value->i);3644break;3645case T_LONG:3646box->long_field_put(_long_value_offset, value->j);3647break;3648default:3649return NULL;3650}3651return box;3652}365336543655BasicType java_lang_boxing_object::basic_type(oop box) {3656if (box == NULL) return T_ILLEGAL;3657BasicType type = vmClasses::box_klass_type(box->klass());3658if (type == T_OBJECT) // 'unknown' value returned by SD::bkt3659return T_ILLEGAL;3660return type;3661}366236633664BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {3665BasicType type = vmClasses::box_klass_type(box->klass());3666switch (type) {3667case T_BOOLEAN:3668value->z = box->bool_field(_value_offset);3669break;3670case T_CHAR:3671value->c = box->char_field(_value_offset);3672break;3673case T_FLOAT:3674value->f = box->float_field(_value_offset);3675break;3676case T_DOUBLE:3677value->d = box->double_field(_long_value_offset);3678break;3679case T_BYTE:3680value->b = box->byte_field(_value_offset);3681break;3682case T_SHORT:3683value->s = box->short_field(_value_offset);3684break;3685case T_INT:3686value->i = box->int_field(_value_offset);3687break;3688case T_LONG:3689value->j = box->long_field(_long_value_offset);3690break;3691default:3692return T_ILLEGAL;3693} // end switch3694return type;3695}369636973698BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {3699BasicType type = vmClasses::box_klass_type(box->klass());3700switch (type) {3701case T_BOOLEAN:3702box->bool_field_put(_value_offset, value->z);3703break;3704case T_CHAR:3705box->char_field_put(_value_offset, value->c);3706break;3707case T_FLOAT:3708box->float_field_put(_value_offset, value->f);3709break;3710case T_DOUBLE:3711box->double_field_put(_long_value_offset, value->d);3712break;3713case T_BYTE:3714box->byte_field_put(_value_offset, value->b);3715break;3716case T_SHORT:3717box->short_field_put(_value_offset, value->s);3718break;3719case T_INT:3720box->int_field_put(_value_offset, value->i);3721break;3722case T_LONG:3723box->long_field_put(_long_value_offset, value->j);3724break;3725default:3726return T_ILLEGAL;3727} // end switch3728return type;3729}373037313732void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) {3733switch (type) {3734case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break;3735case T_CHAR: st->print("%d", value->c); break;3736case T_BYTE: st->print("%d", value->b); break;3737case T_SHORT: st->print("%d", value->s); break;3738case T_INT: st->print("%d", value->i); break;3739case T_LONG: st->print(JLONG_FORMAT, value->j); break;3740case T_FLOAT: st->print("%f", value->f); break;3741case T_DOUBLE: st->print("%lf", value->d); break;3742default: st->print("type %d?", type); break;3743}3744}374537463747// Support for java_lang_ref_SoftReference3748//37493750int java_lang_ref_SoftReference::_timestamp_offset;3751int java_lang_ref_SoftReference::_static_clock_offset;37523753#define SOFTREFERENCE_FIELDS_DO(macro) \3754macro(_timestamp_offset, k, "timestamp", long_signature, false); \3755macro(_static_clock_offset, k, "clock", long_signature, true)37563757void java_lang_ref_SoftReference::compute_offsets() {3758InstanceKlass* k = vmClasses::SoftReference_klass();3759SOFTREFERENCE_FIELDS_DO(FIELD_COMPUTE_OFFSET);3760}37613762#if INCLUDE_CDS3763void java_lang_ref_SoftReference::serialize_offsets(SerializeClosure* f) {3764SOFTREFERENCE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3765}3766#endif37673768jlong java_lang_ref_SoftReference::timestamp(oop ref) {3769return ref->long_field(_timestamp_offset);3770}37713772jlong java_lang_ref_SoftReference::clock() {3773InstanceKlass* ik = vmClasses::SoftReference_klass();3774oop base = ik->static_field_base_raw();3775return base->long_field(_static_clock_offset);3776}37773778void java_lang_ref_SoftReference::set_clock(jlong value) {3779InstanceKlass* ik = vmClasses::SoftReference_klass();3780oop base = ik->static_field_base_raw();3781base->long_field_put(_static_clock_offset, value);3782}37833784// Support for java_lang_invoke_DirectMethodHandle37853786int java_lang_invoke_DirectMethodHandle::_member_offset;37873788oop java_lang_invoke_DirectMethodHandle::member(oop dmh) {3789oop member_name = NULL;3790assert(oopDesc::is_oop(dmh) && java_lang_invoke_DirectMethodHandle::is_instance(dmh),3791"a DirectMethodHandle oop is expected");3792return dmh->obj_field(_member_offset);3793}37943795#define DIRECTMETHODHANDLE_FIELDS_DO(macro) \3796macro(_member_offset, k, "member", java_lang_invoke_MemberName_signature, false)37973798void java_lang_invoke_DirectMethodHandle::compute_offsets() {3799InstanceKlass* k = vmClasses::DirectMethodHandle_klass();3800DIRECTMETHODHANDLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);3801}38023803#if INCLUDE_CDS3804void java_lang_invoke_DirectMethodHandle::serialize_offsets(SerializeClosure* f) {3805DIRECTMETHODHANDLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3806}3807#endif38083809// Support for java_lang_invoke_MethodHandle38103811int java_lang_invoke_MethodHandle::_type_offset;3812int java_lang_invoke_MethodHandle::_form_offset;38133814int java_lang_invoke_MemberName::_clazz_offset;3815int java_lang_invoke_MemberName::_name_offset;3816int java_lang_invoke_MemberName::_type_offset;3817int java_lang_invoke_MemberName::_flags_offset;3818int java_lang_invoke_MemberName::_method_offset;3819int java_lang_invoke_MemberName::_vmindex_offset;38203821int java_lang_invoke_ResolvedMethodName::_vmtarget_offset;3822int java_lang_invoke_ResolvedMethodName::_vmholder_offset;38233824int java_lang_invoke_LambdaForm::_vmentry_offset;38253826#define METHODHANDLE_FIELDS_DO(macro) \3827macro(_type_offset, k, vmSymbols::type_name(), java_lang_invoke_MethodType_signature, false); \3828macro(_form_offset, k, "form", java_lang_invoke_LambdaForm_signature, false)38293830void java_lang_invoke_MethodHandle::compute_offsets() {3831InstanceKlass* k = vmClasses::MethodHandle_klass();3832METHODHANDLE_FIELDS_DO(FIELD_COMPUTE_OFFSET);3833}38343835#if INCLUDE_CDS3836void java_lang_invoke_MethodHandle::serialize_offsets(SerializeClosure* f) {3837METHODHANDLE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3838}3839#endif38403841#define MEMBERNAME_FIELDS_DO(macro) \3842macro(_clazz_offset, k, vmSymbols::clazz_name(), class_signature, false); \3843macro(_name_offset, k, vmSymbols::name_name(), string_signature, false); \3844macro(_type_offset, k, vmSymbols::type_name(), object_signature, false); \3845macro(_flags_offset, k, vmSymbols::flags_name(), int_signature, false); \3846macro(_method_offset, k, vmSymbols::method_name(), java_lang_invoke_ResolvedMethodName_signature, false)38473848void java_lang_invoke_MemberName::compute_offsets() {3849InstanceKlass* k = vmClasses::MemberName_klass();3850MEMBERNAME_FIELDS_DO(FIELD_COMPUTE_OFFSET);3851MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);3852}38533854#if INCLUDE_CDS3855void java_lang_invoke_MemberName::serialize_offsets(SerializeClosure* f) {3856MEMBERNAME_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3857MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);3858}3859#endif38603861void java_lang_invoke_ResolvedMethodName::compute_offsets() {3862InstanceKlass* k = vmClasses::ResolvedMethodName_klass();3863assert(k != NULL, "jdk mismatch");3864RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);3865}38663867#if INCLUDE_CDS3868void java_lang_invoke_ResolvedMethodName::serialize_offsets(SerializeClosure* f) {3869RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);3870}3871#endif38723873#define LAMBDAFORM_FIELDS_DO(macro) \3874macro(_vmentry_offset, k, "vmentry", java_lang_invoke_MemberName_signature, false)38753876void java_lang_invoke_LambdaForm::compute_offsets() {3877InstanceKlass* k = vmClasses::LambdaForm_klass();3878assert (k != NULL, "jdk mismatch");3879LAMBDAFORM_FIELDS_DO(FIELD_COMPUTE_OFFSET);3880}38813882#if INCLUDE_CDS3883void java_lang_invoke_LambdaForm::serialize_offsets(SerializeClosure* f) {3884LAMBDAFORM_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3885}3886#endif38873888bool java_lang_invoke_LambdaForm::is_instance(oop obj) {3889return obj != NULL && is_subclass(obj->klass());3890}38913892int jdk_internal_invoke_NativeEntryPoint::_shadow_space_offset;3893int jdk_internal_invoke_NativeEntryPoint::_argMoves_offset;3894int jdk_internal_invoke_NativeEntryPoint::_returnMoves_offset;3895int jdk_internal_invoke_NativeEntryPoint::_need_transition_offset;3896int jdk_internal_invoke_NativeEntryPoint::_method_type_offset;3897int jdk_internal_invoke_NativeEntryPoint::_name_offset;38983899#define NEP_FIELDS_DO(macro) \3900macro(_shadow_space_offset, k, "shadowSpace", int_signature, false); \3901macro(_argMoves_offset, k, "argMoves", long_array_signature, false); \3902macro(_returnMoves_offset, k, "returnMoves", long_array_signature, false); \3903macro(_need_transition_offset, k, "needTransition", bool_signature, false); \3904macro(_method_type_offset, k, "methodType", java_lang_invoke_MethodType_signature, false); \3905macro(_name_offset, k, "name", string_signature, false);39063907bool jdk_internal_invoke_NativeEntryPoint::is_instance(oop obj) {3908return obj != NULL && is_subclass(obj->klass());3909}39103911void jdk_internal_invoke_NativeEntryPoint::compute_offsets() {3912InstanceKlass* k = vmClasses::NativeEntryPoint_klass();3913NEP_FIELDS_DO(FIELD_COMPUTE_OFFSET);3914}39153916#if INCLUDE_CDS3917void jdk_internal_invoke_NativeEntryPoint::serialize_offsets(SerializeClosure* f) {3918NEP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);3919}3920#endif39213922jint jdk_internal_invoke_NativeEntryPoint::shadow_space(oop entry) {3923return entry->int_field(_shadow_space_offset);3924}39253926oop jdk_internal_invoke_NativeEntryPoint::argMoves(oop entry) {3927return entry->obj_field(_argMoves_offset);3928}39293930oop jdk_internal_invoke_NativeEntryPoint::returnMoves(oop entry) {3931return entry->obj_field(_returnMoves_offset);3932}39333934jboolean jdk_internal_invoke_NativeEntryPoint::need_transition(oop entry) {3935return entry->bool_field(_need_transition_offset);3936}39373938oop jdk_internal_invoke_NativeEntryPoint::method_type(oop entry) {3939return entry->obj_field(_method_type_offset);3940}39413942oop jdk_internal_invoke_NativeEntryPoint::name(oop entry) {3943return entry->obj_field(_name_offset);3944}39453946oop java_lang_invoke_MethodHandle::type(oop mh) {3947return mh->obj_field(_type_offset);3948}39493950void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) {3951mh->obj_field_put(_type_offset, mtype);3952}39533954oop java_lang_invoke_MethodHandle::form(oop mh) {3955assert(_form_offset != 0, "");3956return mh->obj_field(_form_offset);3957}39583959void java_lang_invoke_MethodHandle::set_form(oop mh, oop lform) {3960assert(_form_offset != 0, "");3961mh->obj_field_put(_form_offset, lform);3962}39633964/// MemberName accessors39653966oop java_lang_invoke_MemberName::clazz(oop mname) {3967assert(is_instance(mname), "wrong type");3968return mname->obj_field(_clazz_offset);3969}39703971void java_lang_invoke_MemberName::set_clazz(oop mname, oop clazz) {3972assert(is_instance(mname), "wrong type");3973mname->obj_field_put(_clazz_offset, clazz);3974}39753976oop java_lang_invoke_MemberName::name(oop mname) {3977assert(is_instance(mname), "wrong type");3978return mname->obj_field(_name_offset);3979}39803981void java_lang_invoke_MemberName::set_name(oop mname, oop name) {3982assert(is_instance(mname), "wrong type");3983mname->obj_field_put(_name_offset, name);3984}39853986oop java_lang_invoke_MemberName::type(oop mname) {3987assert(is_instance(mname), "wrong type");3988return mname->obj_field(_type_offset);3989}39903991void java_lang_invoke_MemberName::set_type(oop mname, oop type) {3992assert(is_instance(mname), "wrong type");3993mname->obj_field_put(_type_offset, type);3994}39953996int java_lang_invoke_MemberName::flags(oop mname) {3997assert(is_instance(mname), "wrong type");3998return mname->int_field(_flags_offset);3999}40004001void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {4002assert(is_instance(mname), "wrong type");4003mname->int_field_put(_flags_offset, flags);4004}400540064007// Return vmtarget from ResolvedMethodName method field through indirection4008Method* java_lang_invoke_MemberName::vmtarget(oop mname) {4009assert(is_instance(mname), "wrong type");4010oop method = mname->obj_field(_method_offset);4011return method == NULL ? NULL : java_lang_invoke_ResolvedMethodName::vmtarget(method);4012}40134014bool java_lang_invoke_MemberName::is_method(oop mname) {4015assert(is_instance(mname), "must be MemberName");4016return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0;4017}40184019void java_lang_invoke_MemberName::set_method(oop mname, oop resolved_method) {4020assert(is_instance(mname), "wrong type");4021mname->obj_field_put(_method_offset, resolved_method);4022}40234024intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {4025assert(is_instance(mname), "wrong type");4026return (intptr_t) mname->address_field(_vmindex_offset);4027}40284029void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) {4030assert(is_instance(mname), "wrong type");4031mname->address_field_put(_vmindex_offset, (address) index);4032}403340344035Method* java_lang_invoke_ResolvedMethodName::vmtarget(oop resolved_method) {4036assert(is_instance(resolved_method), "wrong type");4037Method* m = (Method*)resolved_method->address_field(_vmtarget_offset);4038assert(m->is_method(), "must be");4039return m;4040}40414042// Used by redefinition to change Method* to new Method* with same hash (name, signature)4043void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) {4044assert(is_instance(resolved_method), "wrong type");4045resolved_method->address_field_put(_vmtarget_offset, (address)m);4046}40474048void java_lang_invoke_ResolvedMethodName::set_vmholder(oop resolved_method, oop holder) {4049assert(is_instance(resolved_method), "wrong type");4050resolved_method->obj_field_put(_vmholder_offset, holder);4051}40524053oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPS) {4054const Method* method = m();40554056// lookup ResolvedMethod oop in the table, or create a new one and intern it4057oop resolved_method = ResolvedMethodTable::find_method(method);4058if (resolved_method != NULL) {4059return resolved_method;4060}40614062InstanceKlass* k = vmClasses::ResolvedMethodName_klass();4063if (!k->is_initialized()) {4064k->initialize(CHECK_NULL);4065}40664067oop new_resolved_method = k->allocate_instance(CHECK_NULL);40684069NoSafepointVerifier nsv;40704071if (method->is_old()) {4072method = (method->is_deleted()) ? Universe::throw_no_such_method_error() :4073method->get_new_method();4074}40754076InstanceKlass* holder = method->method_holder();40774078set_vmtarget(new_resolved_method, const_cast<Method*>(method));4079// Add a reference to the loader (actually mirror because hidden classes may not have4080// distinct loaders) to ensure the metadata is kept alive.4081// This mirror may be different than the one in clazz field.4082set_vmholder(new_resolved_method, holder->java_mirror());40834084// Set flag in class to indicate this InstanceKlass has entries in the table4085// to avoid walking table during redefinition if none of the redefined classes4086// have any membernames in the table.4087holder->set_has_resolved_methods();40884089return ResolvedMethodTable::add_method(method, Handle(THREAD, new_resolved_method));4090}40914092oop java_lang_invoke_LambdaForm::vmentry(oop lform) {4093assert(is_instance(lform), "wrong type");4094return lform->obj_field(_vmentry_offset);4095}409640974098// Support for java_lang_invoke_MethodType40994100int java_lang_invoke_MethodType::_rtype_offset;4101int java_lang_invoke_MethodType::_ptypes_offset;41024103#define METHODTYPE_FIELDS_DO(macro) \4104macro(_rtype_offset, k, "rtype", class_signature, false); \4105macro(_ptypes_offset, k, "ptypes", class_array_signature, false)41064107void java_lang_invoke_MethodType::compute_offsets() {4108InstanceKlass* k = vmClasses::MethodType_klass();4109METHODTYPE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4110}41114112#if INCLUDE_CDS4113void java_lang_invoke_MethodType::serialize_offsets(SerializeClosure* f) {4114METHODTYPE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4115}4116#endif41174118void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {4119st->print("(");4120objArrayOop pts = ptypes(mt);4121for (int i = 0, limit = pts->length(); i < limit; i++) {4122java_lang_Class::print_signature(pts->obj_at(i), st);4123}4124st->print(")");4125java_lang_Class::print_signature(rtype(mt), st);4126}41274128Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found) {4129ResourceMark rm;4130stringStream buffer(128);4131print_signature(mt, &buffer);4132const char* sigstr = buffer.base();4133int siglen = (int) buffer.size();4134Symbol *name;4135if (!intern_if_not_found) {4136name = SymbolTable::probe(sigstr, siglen);4137} else {4138name = SymbolTable::new_symbol(sigstr, siglen);4139}4140return name;4141}41424143bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) {4144if (mt1 == mt2)4145return true;4146if (rtype(mt1) != rtype(mt2))4147return false;4148if (ptype_count(mt1) != ptype_count(mt2))4149return false;4150for (int i = ptype_count(mt1) - 1; i >= 0; i--) {4151if (ptype(mt1, i) != ptype(mt2, i))4152return false;4153}4154return true;4155}41564157oop java_lang_invoke_MethodType::rtype(oop mt) {4158assert(is_instance(mt), "must be a MethodType");4159return mt->obj_field(_rtype_offset);4160}41614162objArrayOop java_lang_invoke_MethodType::ptypes(oop mt) {4163assert(is_instance(mt), "must be a MethodType");4164return (objArrayOop) mt->obj_field(_ptypes_offset);4165}41664167oop java_lang_invoke_MethodType::ptype(oop mt, int idx) {4168return ptypes(mt)->obj_at(idx);4169}41704171int java_lang_invoke_MethodType::ptype_count(oop mt) {4172return ptypes(mt)->length();4173}41744175int java_lang_invoke_MethodType::ptype_slot_count(oop mt) {4176objArrayOop pts = ptypes(mt);4177int count = pts->length();4178int slots = 0;4179for (int i = 0; i < count; i++) {4180BasicType bt = java_lang_Class::as_BasicType(pts->obj_at(i));4181slots += type2size[bt];4182}4183return slots;4184}41854186int java_lang_invoke_MethodType::rtype_slot_count(oop mt) {4187BasicType bt = java_lang_Class::as_BasicType(rtype(mt));4188return type2size[bt];4189}419041914192// Support for java_lang_invoke_CallSite41934194int java_lang_invoke_CallSite::_target_offset;4195int java_lang_invoke_CallSite::_context_offset;41964197#define CALLSITE_FIELDS_DO(macro) \4198macro(_target_offset, k, "target", java_lang_invoke_MethodHandle_signature, false); \4199macro(_context_offset, k, "context", java_lang_invoke_MethodHandleNatives_CallSiteContext_signature, false)42004201void java_lang_invoke_CallSite::compute_offsets() {4202InstanceKlass* k = vmClasses::CallSite_klass();4203CALLSITE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4204}42054206#if INCLUDE_CDS4207void java_lang_invoke_CallSite::serialize_offsets(SerializeClosure* f) {4208CALLSITE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4209}4210#endif42114212oop java_lang_invoke_CallSite::context_no_keepalive(oop call_site) {4213assert(java_lang_invoke_CallSite::is_instance(call_site), "");42144215oop dep_oop = call_site->obj_field_access<AS_NO_KEEPALIVE>(_context_offset);4216return dep_oop;4217}42184219// Support for java_lang_invoke_ConstantCallSite42204221int java_lang_invoke_ConstantCallSite::_is_frozen_offset;42224223#define CONSTANTCALLSITE_FIELDS_DO(macro) \4224macro(_is_frozen_offset, k, "isFrozen", bool_signature, false)42254226void java_lang_invoke_ConstantCallSite::compute_offsets() {4227InstanceKlass* k = vmClasses::ConstantCallSite_klass();4228CONSTANTCALLSITE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4229}42304231#if INCLUDE_CDS4232void java_lang_invoke_ConstantCallSite::serialize_offsets(SerializeClosure* f) {4233CONSTANTCALLSITE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4234}4235#endif42364237// Support for java_lang_invoke_MethodHandleNatives_CallSiteContext42384239int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;4240int java_lang_invoke_MethodHandleNatives_CallSiteContext::_last_cleanup_offset;42414242void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {4243InstanceKlass* k = vmClasses::Context_klass();4244CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);4245}42464247#if INCLUDE_CDS4248void java_lang_invoke_MethodHandleNatives_CallSiteContext::serialize_offsets(SerializeClosure* f) {4249CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);4250}4251#endif42524253DependencyContext java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {4254assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");4255nmethodBucket* volatile* vmdeps_addr = (nmethodBucket* volatile*)call_site->field_addr(_vmdependencies_offset);4256volatile uint64_t* last_cleanup_addr = (volatile uint64_t*)call_site->field_addr(_last_cleanup_offset);4257DependencyContext dep_ctx(vmdeps_addr, last_cleanup_addr);4258return dep_ctx;4259}42604261// Support for java_security_AccessControlContext42624263int java_security_AccessControlContext::_context_offset;4264int java_security_AccessControlContext::_privilegedContext_offset;4265int java_security_AccessControlContext::_isPrivileged_offset;4266int java_security_AccessControlContext::_isAuthorized_offset;42674268#define ACCESSCONTROLCONTEXT_FIELDS_DO(macro) \4269macro(_context_offset, k, "context", protectiondomain_signature, false); \4270macro(_privilegedContext_offset, k, "privilegedContext", accesscontrolcontext_signature, false); \4271macro(_isPrivileged_offset, k, "isPrivileged", bool_signature, false); \4272macro(_isAuthorized_offset, k, "isAuthorized", bool_signature, false)42734274void java_security_AccessControlContext::compute_offsets() {4275assert(_isPrivileged_offset == 0, "offsets should be initialized only once");4276InstanceKlass* k = vmClasses::AccessControlContext_klass();4277ACCESSCONTROLCONTEXT_FIELDS_DO(FIELD_COMPUTE_OFFSET);4278}42794280#if INCLUDE_CDS4281void java_security_AccessControlContext::serialize_offsets(SerializeClosure* f) {4282ACCESSCONTROLCONTEXT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4283}4284#endif42854286oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) {4287assert(_isPrivileged_offset != 0, "offsets should have been initialized");4288assert(_isAuthorized_offset != 0, "offsets should have been initialized");4289// Ensure klass is initialized4290vmClasses::AccessControlContext_klass()->initialize(CHECK_NULL);4291// Allocate result4292oop result = vmClasses::AccessControlContext_klass()->allocate_instance(CHECK_NULL);4293// Fill in values4294result->obj_field_put(_context_offset, context());4295result->obj_field_put(_privilegedContext_offset, privileged_context());4296result->bool_field_put(_isPrivileged_offset, isPrivileged);4297result->bool_field_put(_isAuthorized_offset, true);4298return result;4299}430043014302// Support for java_lang_ClassLoader43034304int java_lang_ClassLoader::_loader_data_offset;4305int java_lang_ClassLoader::_parallelCapable_offset;4306int java_lang_ClassLoader::_name_offset;4307int java_lang_ClassLoader::_nameAndId_offset;4308int java_lang_ClassLoader::_unnamedModule_offset;4309int java_lang_ClassLoader::_parent_offset;43104311ClassLoaderData* java_lang_ClassLoader::loader_data_acquire(oop loader) {4312assert(loader != NULL, "loader must not be NULL");4313assert(oopDesc::is_oop(loader), "loader must be oop");4314return HeapAccess<MO_ACQUIRE>::load_at(loader, _loader_data_offset);4315}43164317ClassLoaderData* java_lang_ClassLoader::loader_data_raw(oop loader) {4318assert(loader != NULL, "loader must not be NULL");4319assert(oopDesc::is_oop(loader), "loader must be oop");4320return RawAccess<>::load_at(loader, _loader_data_offset);4321}43224323void java_lang_ClassLoader::release_set_loader_data(oop loader, ClassLoaderData* new_data) {4324assert(loader != NULL, "loader must not be NULL");4325assert(oopDesc::is_oop(loader), "loader must be oop");4326HeapAccess<MO_RELEASE>::store_at(loader, _loader_data_offset, new_data);4327}43284329#define CLASSLOADER_FIELDS_DO(macro) \4330macro(_parallelCapable_offset, k1, "parallelLockMap", concurrenthashmap_signature, false); \4331macro(_name_offset, k1, vmSymbols::name_name(), string_signature, false); \4332macro(_nameAndId_offset, k1, "nameAndId", string_signature, false); \4333macro(_unnamedModule_offset, k1, "unnamedModule", module_signature, false); \4334macro(_parent_offset, k1, "parent", classloader_signature, false)43354336void java_lang_ClassLoader::compute_offsets() {4337InstanceKlass* k1 = vmClasses::ClassLoader_klass();4338CLASSLOADER_FIELDS_DO(FIELD_COMPUTE_OFFSET);43394340CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);4341}43424343#if INCLUDE_CDS4344void java_lang_ClassLoader::serialize_offsets(SerializeClosure* f) {4345CLASSLOADER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4346CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);4347}4348#endif43494350oop java_lang_ClassLoader::parent(oop loader) {4351assert(is_instance(loader), "loader must be oop");4352return loader->obj_field(_parent_offset);4353}43544355// Returns the name field of this class loader. If the name field has not4356// been set, null will be returned.4357oop java_lang_ClassLoader::name(oop loader) {4358assert(is_instance(loader), "loader must be oop");4359return loader->obj_field(_name_offset);4360}43614362// Returns the nameAndId field of this class loader. The format is4363// as follows:4364// If the defining loader has a name explicitly set then '<loader-name>' @<id>4365// If the defining loader has no name then <qualified-class-name> @<id>4366// If built-in loader, then omit '@<id>' as there is only one instance.4367// Use ClassLoader::loader_name_id() to obtain this String as a char*.4368oop java_lang_ClassLoader::nameAndId(oop loader) {4369assert(is_instance(loader), "loader must be oop");4370return loader->obj_field(_nameAndId_offset);4371}43724373bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {4374assert(is_instance(loader), "loader must be oop");4375assert(cl == NULL || is_instance(cl), "cl argument must be oop");4376oop acl = loader;4377debug_only(jint loop_count = 0);4378// This loop taken verbatim from ClassLoader.java:4379do {4380acl = parent(acl);4381if (cl == acl) {4382return true;4383}4384assert(++loop_count > 0, "loop_count overflow");4385} while (acl != NULL);4386return false;4387}43884389bool java_lang_ClassLoader::is_instance(oop obj) {4390return obj != NULL && is_subclass(obj->klass());4391}439243934394// For class loader classes, parallelCapable defined4395// based on non-null field4396// Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it4397bool java_lang_ClassLoader::parallelCapable(oop class_loader) {4398assert(_parallelCapable_offset != 0, "offsets should have been initialized");4399return (class_loader->obj_field(_parallelCapable_offset) != NULL);4400}44014402bool java_lang_ClassLoader::is_trusted_loader(oop loader) {4403// Fix for 4474172; see evaluation for more details4404loader = non_reflection_class_loader(loader);44054406oop cl = SystemDictionary::java_system_loader();4407while(cl != NULL) {4408if (cl == loader) return true;4409cl = parent(cl);4410}4411return false;4412}44134414// Return true if this is one of the class loaders associated with4415// the generated bytecodes for reflection.4416bool java_lang_ClassLoader::is_reflection_class_loader(oop loader) {4417if (loader != NULL) {4418Klass* delegating_cl_class = vmClasses::reflect_DelegatingClassLoader_klass();4419// This might be null in non-1.4 JDKs4420return (delegating_cl_class != NULL && loader->is_a(delegating_cl_class));4421}4422return false;4423}44244425oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) {4426// See whether this is one of the class loaders associated with4427// the generated bytecodes for reflection, and if so, "magically"4428// delegate to its parent to prevent class loading from occurring4429// in places where applications using reflection didn't expect it.4430if (is_reflection_class_loader(loader)) {4431return parent(loader);4432}4433return loader;4434}44354436oop java_lang_ClassLoader::unnamedModule(oop loader) {4437assert(is_instance(loader), "loader must be oop");4438return loader->obj_field(_unnamedModule_offset);4439}44404441// Support for java_lang_System4442//44434444int java_lang_System::_static_in_offset;4445int java_lang_System::_static_out_offset;4446int java_lang_System::_static_err_offset;4447int java_lang_System::_static_security_offset;4448int java_lang_System::_static_allow_security_offset;4449int java_lang_System::_static_never_offset;44504451#define SYSTEM_FIELDS_DO(macro) \4452macro(_static_in_offset, k, "in", input_stream_signature, true); \4453macro(_static_out_offset, k, "out", print_stream_signature, true); \4454macro(_static_err_offset, k, "err", print_stream_signature, true); \4455macro(_static_security_offset, k, "security", security_manager_signature, true); \4456macro(_static_allow_security_offset, k, "allowSecurityManager", int_signature, true); \4457macro(_static_never_offset, k, "NEVER", int_signature, true)44584459void java_lang_System::compute_offsets() {4460InstanceKlass* k = vmClasses::System_klass();4461SYSTEM_FIELDS_DO(FIELD_COMPUTE_OFFSET);4462}44634464// This field tells us that a security manager can never be installed so we4465// can completely skip populating the ProtectionDomainCacheTable.4466bool java_lang_System::allow_security_manager() {4467static int initialized = false;4468static bool allowed = true; // default4469if (!initialized) {4470oop base = vmClasses::System_klass()->static_field_base_raw();4471int never = base->int_field(_static_never_offset);4472allowed = (base->int_field(_static_allow_security_offset) != never);4473}4474return allowed;4475}44764477// This field tells us that a security manager is installed.4478bool java_lang_System::has_security_manager() {4479oop base = vmClasses::System_klass()->static_field_base_raw();4480return base->obj_field(_static_security_offset) != NULL;4481}44824483#if INCLUDE_CDS4484void java_lang_System::serialize_offsets(SerializeClosure* f) {4485SYSTEM_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4486}4487#endif44884489// Support for jdk_internal_misc_UnsafeConstants4490//4491class UnsafeConstantsFixup : public FieldClosure {4492private:4493int _address_size;4494int _page_size;4495bool _big_endian;4496bool _use_unaligned_access;4497int _data_cache_line_flush_size;4498public:4499UnsafeConstantsFixup() {4500// round up values for all static final fields4501_address_size = sizeof(void*);4502_page_size = os::vm_page_size();4503_big_endian = LITTLE_ENDIAN_ONLY(false) BIG_ENDIAN_ONLY(true);4504_use_unaligned_access = UseUnalignedAccesses;4505_data_cache_line_flush_size = (int)VM_Version::data_cache_line_flush_size();4506}45074508void do_field(fieldDescriptor* fd) {4509oop mirror = fd->field_holder()->java_mirror();4510assert(mirror != NULL, "UnsafeConstants must have mirror already");4511assert(fd->field_holder() == vmClasses::UnsafeConstants_klass(), "Should be UnsafeConstants");4512assert(fd->is_final(), "fields of UnsafeConstants must be final");4513assert(fd->is_static(), "fields of UnsafeConstants must be static");4514if (fd->name() == vmSymbols::address_size_name()) {4515mirror->int_field_put(fd->offset(), _address_size);4516} else if (fd->name() == vmSymbols::page_size_name()) {4517mirror->int_field_put(fd->offset(), _page_size);4518} else if (fd->name() == vmSymbols::big_endian_name()) {4519mirror->bool_field_put(fd->offset(), _big_endian);4520} else if (fd->name() == vmSymbols::use_unaligned_access_name()) {4521mirror->bool_field_put(fd->offset(), _use_unaligned_access);4522} else if (fd->name() == vmSymbols::data_cache_line_flush_size_name()) {4523mirror->int_field_put(fd->offset(), _data_cache_line_flush_size);4524} else {4525assert(false, "unexpected UnsafeConstants field");4526}4527}4528};45294530void jdk_internal_misc_UnsafeConstants::set_unsafe_constants() {4531UnsafeConstantsFixup fixup;4532vmClasses::UnsafeConstants_klass()->do_local_static_fields(&fixup);4533}453445354536// java_lang_StackTraceElement45374538int java_lang_StackTraceElement::_methodName_offset;4539int java_lang_StackTraceElement::_fileName_offset;4540int java_lang_StackTraceElement::_lineNumber_offset;4541int java_lang_StackTraceElement::_moduleName_offset;4542int java_lang_StackTraceElement::_moduleVersion_offset;4543int java_lang_StackTraceElement::_classLoaderName_offset;4544int java_lang_StackTraceElement::_declaringClass_offset;4545int java_lang_StackTraceElement::_declaringClassObject_offset;45464547#define STACKTRACEELEMENT_FIELDS_DO(macro) \4548macro(_declaringClassObject_offset, k, "declaringClassObject", class_signature, false); \4549macro(_classLoaderName_offset, k, "classLoaderName", string_signature, false); \4550macro(_moduleName_offset, k, "moduleName", string_signature, false); \4551macro(_moduleVersion_offset, k, "moduleVersion", string_signature, false); \4552macro(_declaringClass_offset, k, "declaringClass", string_signature, false); \4553macro(_methodName_offset, k, "methodName", string_signature, false); \4554macro(_fileName_offset, k, "fileName", string_signature, false); \4555macro(_lineNumber_offset, k, "lineNumber", int_signature, false)45564557// Support for java_lang_StackTraceElement4558void java_lang_StackTraceElement::compute_offsets() {4559InstanceKlass* k = vmClasses::StackTraceElement_klass();4560STACKTRACEELEMENT_FIELDS_DO(FIELD_COMPUTE_OFFSET);4561}45624563#if INCLUDE_CDS4564void java_lang_StackTraceElement::serialize_offsets(SerializeClosure* f) {4565STACKTRACEELEMENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4566}4567#endif45684569void java_lang_StackTraceElement::set_fileName(oop element, oop value) {4570element->obj_field_put(_fileName_offset, value);4571}45724573void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {4574element->obj_field_put(_declaringClass_offset, value);4575}45764577void java_lang_StackTraceElement::set_methodName(oop element, oop value) {4578element->obj_field_put(_methodName_offset, value);4579}45804581void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {4582element->int_field_put(_lineNumber_offset, value);4583}45844585void java_lang_StackTraceElement::set_moduleName(oop element, oop value) {4586element->obj_field_put(_moduleName_offset, value);4587}45884589void java_lang_StackTraceElement::set_moduleVersion(oop element, oop value) {4590element->obj_field_put(_moduleVersion_offset, value);4591}45924593void java_lang_StackTraceElement::set_classLoaderName(oop element, oop value) {4594element->obj_field_put(_classLoaderName_offset, value);4595}45964597void java_lang_StackTraceElement::set_declaringClassObject(oop element, oop value) {4598element->obj_field_put(_declaringClassObject_offset, value);4599}460046014602// java_lang_AssertionStatusDirectives46034604int java_lang_AssertionStatusDirectives::_classes_offset;4605int java_lang_AssertionStatusDirectives::_classEnabled_offset;4606int java_lang_AssertionStatusDirectives::_packages_offset;4607int java_lang_AssertionStatusDirectives::_packageEnabled_offset;4608int java_lang_AssertionStatusDirectives::_deflt_offset;46094610// Support for java Assertions - java_lang_AssertionStatusDirectives.4611#define ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(macro) \4612macro(_classes_offset, k, "classes", string_array_signature, false); \4613macro(_classEnabled_offset, k, "classEnabled", bool_array_signature, false); \4614macro(_packages_offset, k, "packages", string_array_signature, false); \4615macro(_packageEnabled_offset, k, "packageEnabled", bool_array_signature, false); \4616macro(_deflt_offset, k, "deflt", bool_signature, false)46174618void java_lang_AssertionStatusDirectives::compute_offsets() {4619InstanceKlass* k = vmClasses::AssertionStatusDirectives_klass();4620ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(FIELD_COMPUTE_OFFSET);4621}46224623#if INCLUDE_CDS4624void java_lang_AssertionStatusDirectives::serialize_offsets(SerializeClosure* f) {4625ASSERTIONSTATUSDIRECTIVES_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4626}4627#endif46284629void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {4630o->obj_field_put(_classes_offset, val);4631}46324633void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {4634o->obj_field_put(_classEnabled_offset, val);4635}46364637void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {4638o->obj_field_put(_packages_offset, val);4639}46404641void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {4642o->obj_field_put(_packageEnabled_offset, val);4643}46444645void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {4646o->bool_field_put(_deflt_offset, val);4647}464846494650// Support for intrinsification of java.nio.Buffer.checkIndex46514652int java_nio_Buffer::_limit_offset;46534654#define BUFFER_FIELDS_DO(macro) \4655macro(_limit_offset, k, "limit", int_signature, false)46564657void java_nio_Buffer::compute_offsets() {4658InstanceKlass* k = vmClasses::nio_Buffer_klass();4659assert(k != NULL, "must be loaded in 1.4+");4660BUFFER_FIELDS_DO(FIELD_COMPUTE_OFFSET);4661}46624663#if INCLUDE_CDS4664void java_nio_Buffer::serialize_offsets(SerializeClosure* f) {4665BUFFER_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4666}4667#endif46684669int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset;46704671#define AOS_FIELDS_DO(macro) \4672macro(_owner_offset, k, "exclusiveOwnerThread", thread_signature, false)46734674void java_util_concurrent_locks_AbstractOwnableSynchronizer::compute_offsets() {4675InstanceKlass* k = vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass();4676AOS_FIELDS_DO(FIELD_COMPUTE_OFFSET);4677}46784679oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {4680assert(_owner_offset != 0, "Must be initialized");4681return obj->obj_field(_owner_offset);4682}46834684#if INCLUDE_CDS4685void java_util_concurrent_locks_AbstractOwnableSynchronizer::serialize_offsets(SerializeClosure* f) {4686AOS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4687}4688#endif46894690int vector_VectorPayload::_payload_offset;46914692#define VECTORPAYLOAD_FIELDS_DO(macro) \4693macro(_payload_offset, k, "payload", object_signature, false)46944695void vector_VectorPayload::compute_offsets() {4696InstanceKlass* k = vmClasses::vector_VectorPayload_klass();4697VECTORPAYLOAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);4698}46994700#if INCLUDE_CDS4701void vector_VectorPayload::serialize_offsets(SerializeClosure* f) {4702VECTORPAYLOAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4703}4704#endif47054706void vector_VectorPayload::set_payload(oop o, oop val) {4707o->obj_field_put(_payload_offset, val);4708}47094710bool vector_VectorPayload::is_instance(oop obj) {4711return obj != NULL && is_subclass(obj->klass());4712}47134714int java_lang_Integer_IntegerCache::_static_cache_offset;4715int java_lang_Long_LongCache::_static_cache_offset;4716int java_lang_Character_CharacterCache::_static_cache_offset;4717int java_lang_Short_ShortCache::_static_cache_offset;4718int java_lang_Byte_ByteCache::_static_cache_offset;47194720#define INTEGER_CACHE_FIELDS_DO(macro) \4721macro(_static_cache_offset, k, "cache", java_lang_Integer_array_signature, true)47224723void java_lang_Integer_IntegerCache::compute_offsets(InstanceKlass *k) {4724guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");4725INTEGER_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4726}47274728objArrayOop java_lang_Integer_IntegerCache::cache(InstanceKlass *ik) {4729oop base = ik->static_field_base_raw();4730return objArrayOop(base->obj_field(_static_cache_offset));4731}47324733Symbol* java_lang_Integer_IntegerCache::symbol() {4734return vmSymbols::java_lang_Integer_IntegerCache();4735}47364737#if INCLUDE_CDS4738void java_lang_Integer_IntegerCache::serialize_offsets(SerializeClosure* f) {4739INTEGER_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4740}4741#endif4742#undef INTEGER_CACHE_FIELDS_DO47434744jint java_lang_Integer::value(oop obj) {4745jvalue v;4746java_lang_boxing_object::get_value(obj, &v);4747return v.i;4748}47494750#define LONG_CACHE_FIELDS_DO(macro) \4751macro(_static_cache_offset, k, "cache", java_lang_Long_array_signature, true)47524753void java_lang_Long_LongCache::compute_offsets(InstanceKlass *k) {4754guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");4755LONG_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4756}47574758objArrayOop java_lang_Long_LongCache::cache(InstanceKlass *ik) {4759oop base = ik->static_field_base_raw();4760return objArrayOop(base->obj_field(_static_cache_offset));4761}47624763Symbol* java_lang_Long_LongCache::symbol() {4764return vmSymbols::java_lang_Long_LongCache();4765}47664767#if INCLUDE_CDS4768void java_lang_Long_LongCache::serialize_offsets(SerializeClosure* f) {4769LONG_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4770}4771#endif4772#undef LONG_CACHE_FIELDS_DO47734774jlong java_lang_Long::value(oop obj) {4775jvalue v;4776java_lang_boxing_object::get_value(obj, &v);4777return v.j;4778}47794780#define CHARACTER_CACHE_FIELDS_DO(macro) \4781macro(_static_cache_offset, k, "cache", java_lang_Character_array_signature, true)47824783void java_lang_Character_CharacterCache::compute_offsets(InstanceKlass *k) {4784guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");4785CHARACTER_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4786}47874788objArrayOop java_lang_Character_CharacterCache::cache(InstanceKlass *ik) {4789oop base = ik->static_field_base_raw();4790return objArrayOop(base->obj_field(_static_cache_offset));4791}47924793Symbol* java_lang_Character_CharacterCache::symbol() {4794return vmSymbols::java_lang_Character_CharacterCache();4795}47964797#if INCLUDE_CDS4798void java_lang_Character_CharacterCache::serialize_offsets(SerializeClosure* f) {4799CHARACTER_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4800}4801#endif4802#undef CHARACTER_CACHE_FIELDS_DO48034804jchar java_lang_Character::value(oop obj) {4805jvalue v;4806java_lang_boxing_object::get_value(obj, &v);4807return v.c;4808}48094810#define SHORT_CACHE_FIELDS_DO(macro) \4811macro(_static_cache_offset, k, "cache", java_lang_Short_array_signature, true)48124813void java_lang_Short_ShortCache::compute_offsets(InstanceKlass *k) {4814guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");4815SHORT_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4816}48174818objArrayOop java_lang_Short_ShortCache::cache(InstanceKlass *ik) {4819oop base = ik->static_field_base_raw();4820return objArrayOop(base->obj_field(_static_cache_offset));4821}48224823Symbol* java_lang_Short_ShortCache::symbol() {4824return vmSymbols::java_lang_Short_ShortCache();4825}48264827#if INCLUDE_CDS4828void java_lang_Short_ShortCache::serialize_offsets(SerializeClosure* f) {4829SHORT_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4830}4831#endif4832#undef SHORT_CACHE_FIELDS_DO48334834jshort java_lang_Short::value(oop obj) {4835jvalue v;4836java_lang_boxing_object::get_value(obj, &v);4837return v.s;4838}48394840#define BYTE_CACHE_FIELDS_DO(macro) \4841macro(_static_cache_offset, k, "cache", java_lang_Byte_array_signature, true)48424843void java_lang_Byte_ByteCache::compute_offsets(InstanceKlass *k) {4844guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");4845BYTE_CACHE_FIELDS_DO(FIELD_COMPUTE_OFFSET);4846}48474848objArrayOop java_lang_Byte_ByteCache::cache(InstanceKlass *ik) {4849oop base = ik->static_field_base_raw();4850return objArrayOop(base->obj_field(_static_cache_offset));4851}48524853Symbol* java_lang_Byte_ByteCache::symbol() {4854return vmSymbols::java_lang_Byte_ByteCache();4855}48564857#if INCLUDE_CDS4858void java_lang_Byte_ByteCache::serialize_offsets(SerializeClosure* f) {4859BYTE_CACHE_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4860}4861#endif4862#undef BYTE_CACHE_FIELDS_DO48634864jbyte java_lang_Byte::value(oop obj) {4865jvalue v;4866java_lang_boxing_object::get_value(obj, &v);4867return v.b;4868}48694870int java_lang_Boolean::_static_TRUE_offset;4871int java_lang_Boolean::_static_FALSE_offset;48724873#define BOOLEAN_FIELDS_DO(macro) \4874macro(_static_TRUE_offset, k, "TRUE", java_lang_Boolean_signature, true); \4875macro(_static_FALSE_offset, k, "FALSE", java_lang_Boolean_signature, true)487648774878void java_lang_Boolean::compute_offsets(InstanceKlass *k) {4879guarantee(k != NULL && k->is_initialized(), "must be loaded and initialized");4880BOOLEAN_FIELDS_DO(FIELD_COMPUTE_OFFSET);4881}48824883oop java_lang_Boolean::get_TRUE(InstanceKlass *ik) {4884oop base = ik->static_field_base_raw();4885return base->obj_field(_static_TRUE_offset);4886}48874888oop java_lang_Boolean::get_FALSE(InstanceKlass *ik) {4889oop base = ik->static_field_base_raw();4890return base->obj_field(_static_FALSE_offset);4891}48924893Symbol* java_lang_Boolean::symbol() {4894return vmSymbols::java_lang_Boolean();4895}48964897#if INCLUDE_CDS4898void java_lang_Boolean::serialize_offsets(SerializeClosure* f) {4899BOOLEAN_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4900}4901#endif4902#undef BOOLEAN_CACHE_FIELDS_DO49034904jboolean java_lang_Boolean::value(oop obj) {4905jvalue v;4906java_lang_boxing_object::get_value(obj, &v);4907return v.z;4908}49094910// java_lang_reflect_RecordComponent49114912int java_lang_reflect_RecordComponent::_clazz_offset;4913int java_lang_reflect_RecordComponent::_name_offset;4914int java_lang_reflect_RecordComponent::_type_offset;4915int java_lang_reflect_RecordComponent::_accessor_offset;4916int java_lang_reflect_RecordComponent::_signature_offset;4917int java_lang_reflect_RecordComponent::_annotations_offset;4918int java_lang_reflect_RecordComponent::_typeAnnotations_offset;49194920#define RECORDCOMPONENT_FIELDS_DO(macro) \4921macro(_clazz_offset, k, "clazz", class_signature, false); \4922macro(_name_offset, k, "name", string_signature, false); \4923macro(_type_offset, k, "type", class_signature, false); \4924macro(_accessor_offset, k, "accessor", reflect_method_signature, false); \4925macro(_signature_offset, k, "signature", string_signature, false); \4926macro(_annotations_offset, k, "annotations", byte_array_signature, false); \4927macro(_typeAnnotations_offset, k, "typeAnnotations", byte_array_signature, false);49284929// Support for java_lang_reflect_RecordComponent4930void java_lang_reflect_RecordComponent::compute_offsets() {4931InstanceKlass* k = vmClasses::RecordComponent_klass();4932RECORDCOMPONENT_FIELDS_DO(FIELD_COMPUTE_OFFSET);4933}49344935#if INCLUDE_CDS4936void java_lang_reflect_RecordComponent::serialize_offsets(SerializeClosure* f) {4937RECORDCOMPONENT_FIELDS_DO(FIELD_SERIALIZE_OFFSET);4938}4939#endif49404941void java_lang_reflect_RecordComponent::set_clazz(oop element, oop value) {4942element->obj_field_put(_clazz_offset, value);4943}49444945void java_lang_reflect_RecordComponent::set_name(oop element, oop value) {4946element->obj_field_put(_name_offset, value);4947}49484949void java_lang_reflect_RecordComponent::set_type(oop element, oop value) {4950element->obj_field_put(_type_offset, value);4951}49524953void java_lang_reflect_RecordComponent::set_accessor(oop element, oop value) {4954element->obj_field_put(_accessor_offset, value);4955}49564957void java_lang_reflect_RecordComponent::set_signature(oop element, oop value) {4958element->obj_field_put(_signature_offset, value);4959}49604961void java_lang_reflect_RecordComponent::set_annotations(oop element, oop value) {4962element->obj_field_put(_annotations_offset, value);4963}49644965void java_lang_reflect_RecordComponent::set_typeAnnotations(oop element, oop value) {4966element->obj_field_put(_typeAnnotations_offset, value);4967}49684969// java_lang_InternalError4970int java_lang_InternalError::_during_unsafe_access_offset;49714972void java_lang_InternalError::set_during_unsafe_access(oop internal_error) {4973internal_error->bool_field_put(_during_unsafe_access_offset, true);4974}49754976jboolean java_lang_InternalError::during_unsafe_access(oop internal_error) {4977return internal_error->bool_field(_during_unsafe_access_offset);4978}49794980void java_lang_InternalError::compute_offsets() {4981INTERNALERROR_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);4982}49834984#if INCLUDE_CDS4985void java_lang_InternalError::serialize_offsets(SerializeClosure* f) {4986INTERNALERROR_INJECTED_FIELDS(INJECTED_FIELD_SERIALIZE_OFFSET);4987}4988#endif49894990#define DO_COMPUTE_OFFSETS(k) k::compute_offsets();49914992// Compute field offsets of all the classes in this file4993void JavaClasses::compute_offsets() {4994if (UseSharedSpaces) {4995JVMTI_ONLY(assert(JvmtiExport::is_early_phase() && !(JvmtiExport::should_post_class_file_load_hook() &&4996JvmtiExport::has_early_class_hook_env()),4997"JavaClasses::compute_offsets() must be called in early JVMTI phase."));4998// None of the classes used by the rest of this function can be replaced by4999// JVMTI ClassFileLoadHook.5000// We are safe to use the archived offsets, which have already been restored5001// by JavaClasses::serialize_offsets, without computing the offsets again.5002return;5003}50045005// We have already called the compute_offsets() of the5006// BASIC_JAVA_CLASSES_DO_PART1 classes (java_lang_String, java_lang_Class and5007// java_lang_ref_Reference) earlier inside vmClasses::resolve_all()5008BASIC_JAVA_CLASSES_DO_PART2(DO_COMPUTE_OFFSETS);5009}50105011#if INCLUDE_CDS5012#define DO_SERIALIZE_OFFSETS(k) k::serialize_offsets(soc);50135014void JavaClasses::serialize_offsets(SerializeClosure* soc) {5015BASIC_JAVA_CLASSES_DO(DO_SERIALIZE_OFFSETS);5016}5017#endif50185019#if INCLUDE_CDS_JAVA_HEAP5020bool JavaClasses::is_supported_for_archiving(oop obj) {5021Klass* klass = obj->klass();50225023if (klass == vmClasses::ClassLoader_klass() || // ClassLoader::loader_data is malloc'ed.5024// The next 3 classes are used to implement java.lang.invoke, and are not used directly in5025// regular Java code. The implementation of java.lang.invoke uses generated hidden classes5026// (e.g., as referenced by ResolvedMethodName::vmholder) that are not yet supported by CDS.5027// So for now we cannot not support these classes for archiving.5028//5029// These objects typically are not referenced by static fields, but rather by resolved5030// constant pool entries, so excluding them shouldn't affect the archiving of static fields.5031klass == vmClasses::ResolvedMethodName_klass() ||5032klass == vmClasses::MemberName_klass() ||5033klass == vmClasses::Context_klass()) {5034return false;5035}50365037return true;5038}5039#endif50405041#ifndef PRODUCT50425043// These functions exist to assert the validity of de-serialized offsets in boxing object as a sanity check.50445045bool JavaClasses::check_offset(const char *klass_name, int deserialized_offset, const char *field_name,5046const char* field_sig) {5047EXCEPTION_MARK;5048fieldDescriptor fd;5049TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name);5050Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);5051InstanceKlass* ik = InstanceKlass::cast(k);5052TempNewSymbol f_name = SymbolTable::new_symbol(field_name);5053TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig);5054if (!ik->find_local_field(f_name, f_sig, &fd)) {5055tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);5056return false;5057}5058if (fd.is_static()) {5059tty->print_cr("Nonstatic field %s.%s appears to be static", klass_name, field_name);5060return false;5061}5062if (fd.offset() == deserialized_offset ) {5063return true;5064} else {5065tty->print_cr("Offset of nonstatic field %s.%s is deserialized as %d but should really be %d.",5066klass_name, field_name, deserialized_offset, fd.offset());5067return false;5068}5069}50705071void JavaClasses::check_offsets() {5072bool valid = true;50735074#define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \5075valid &= check_offset(klass_name, cpp_klass_name :: _##field_name ## _offset, #field_name, field_sig)50765077#define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \5078valid &= check_offset(klass_name, cpp_klass_name :: _##long_ ## field_name ## _offset, #field_name, field_sig)50795080// Boxed primitive objects (java_lang_boxing_object)50815082CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z");5083CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");5084CHECK_OFFSET("java/lang/Float", java_lang_boxing_object, value, "F");5085CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");5086CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B");5087CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S");5088CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I");5089CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");50905091if (!valid) vm_exit_during_initialization("Field offset verification failed");5092}50935094#endif // PRODUCT50955096int InjectedField::compute_offset() {5097InstanceKlass* ik = InstanceKlass::cast(klass());5098for (AllFieldStream fs(ik); !fs.done(); fs.next()) {5099if (!may_be_java && !fs.access_flags().is_internal()) {5100// Only look at injected fields5101continue;5102}5103if (fs.name() == name() && fs.signature() == signature()) {5104return fs.offset();5105}5106}5107ResourceMark rm;5108tty->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)" : "");5109#ifndef PRODUCT5110ik->print();5111tty->print_cr("all fields:");5112for (AllFieldStream fs(ik); !fs.done(); fs.next()) {5113tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());5114}5115#endif //PRODUCT5116vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class");5117return -1;5118}51195120void javaClasses_init() {5121JavaClasses::compute_offsets();5122JavaClasses::check_offsets();5123FilteredFieldsMap::initialize(); // must be done after computing offsets.5124}512551265127