Path: blob/master/src/hotspot/share/classfile/javaClasses.hpp
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#ifndef SHARE_CLASSFILE_JAVACLASSES_HPP25#define SHARE_CLASSFILE_JAVACLASSES_HPP2627#include "classfile/vmClasses.hpp"28#include "oops/oop.hpp"29#include "oops/instanceKlass.hpp"30#include "oops/symbol.hpp"31#include "runtime/os.hpp"32#include "utilities/vmEnums.hpp"3334class RecordComponent;3536// Interface for manipulating the basic Java classes.3738#define BASIC_JAVA_CLASSES_DO_PART1(f) \39f(java_lang_Class) \40f(java_lang_String) \41f(java_lang_ref_Reference) \42//end4344#define BASIC_JAVA_CLASSES_DO_PART2(f) \45f(java_lang_System) \46f(java_lang_ClassLoader) \47f(java_lang_Throwable) \48f(java_lang_Thread) \49f(java_lang_ThreadGroup) \50f(java_lang_InternalError) \51f(java_lang_AssertionStatusDirectives) \52f(java_lang_ref_SoftReference) \53f(java_lang_invoke_MethodHandle) \54f(java_lang_invoke_DirectMethodHandle) \55f(java_lang_invoke_MemberName) \56f(java_lang_invoke_ResolvedMethodName) \57f(java_lang_invoke_LambdaForm) \58f(java_lang_invoke_MethodType) \59f(java_lang_invoke_CallSite) \60f(java_lang_invoke_ConstantCallSite) \61f(java_lang_invoke_MethodHandleNatives_CallSiteContext) \62f(java_security_AccessControlContext) \63f(java_lang_reflect_AccessibleObject) \64f(java_lang_reflect_Method) \65f(java_lang_reflect_Constructor) \66f(java_lang_reflect_Field) \67f(java_lang_reflect_RecordComponent) \68f(java_nio_Buffer) \69f(reflect_ConstantPool) \70f(reflect_UnsafeStaticFieldAccessorImpl) \71f(java_lang_reflect_Parameter) \72f(java_lang_Module) \73f(java_lang_StackTraceElement) \74f(java_lang_StackFrameInfo) \75f(java_lang_LiveStackFrameInfo) \76f(java_util_concurrent_locks_AbstractOwnableSynchronizer) \77f(jdk_internal_invoke_NativeEntryPoint) \78f(jdk_internal_misc_UnsafeConstants) \79f(java_lang_boxing_object) \80f(vector_VectorPayload) \81//end8283#define BASIC_JAVA_CLASSES_DO(f) \84BASIC_JAVA_CLASSES_DO_PART1(f) \85BASIC_JAVA_CLASSES_DO_PART2(f)8687#define CHECK_INIT(offset) assert(offset != 0, "should be initialized"); return offset;8889// Interface to java.lang.Object objects9091class java_lang_Object : AllStatic {92public:93static void register_natives(TRAPS);94};9596// Interface to java.lang.String objects9798// The flags field is a collection of bits representing boolean values used99// internally by the VM.100#define STRING_INJECTED_FIELDS(macro) \101macro(java_lang_String, flags, byte_signature, false)102103class java_lang_String : AllStatic {104private:105static int _value_offset;106static int _hash_offset;107static int _hashIsZero_offset;108static int _coder_offset;109static int _flags_offset;110111static bool _initialized;112113static Handle basic_create(int length, bool byte_arr, TRAPS);114115static inline void set_coder(oop string, jbyte coder);116117// Bitmasks for values in the injected flags field.118static const uint8_t _deduplication_forbidden_mask = 1 << 0;119static const uint8_t _deduplication_requested_mask = 1 << 1;120121static int flags_offset() { CHECK_INIT(_flags_offset); }122// Return the address of the injected flags field.123static inline uint8_t* flags_addr(oop java_string);124// Test whether the designated bit of the injected flags field is set.125static inline bool is_flag_set(oop java_string, uint8_t flag_mask);126// Atomically test and set the designated bit of the injected flags field,127// returning true if the bit was already set.128static bool test_and_set_flag(oop java_string, uint8_t flag_mask);129130public:131132// Coders133enum Coder {134CODER_LATIN1 = 0,135CODER_UTF16 = 1136};137138static void compute_offsets();139static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;140141// Instance creation142static Handle create_from_unicode(const jchar* unicode, int len, TRAPS);143static oop create_oop_from_unicode(const jchar* unicode, int len, TRAPS);144static Handle create_from_str(const char* utf8_str, TRAPS);145static oop create_oop_from_str(const char* utf8_str, TRAPS);146static Handle create_from_symbol(Symbol* symbol, TRAPS);147static Handle create_from_platform_dependent_str(const char* str, TRAPS);148static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS);149150static void set_compact_strings(bool value);151152static int value_offset() { CHECK_INIT(_value_offset); }153static int coder_offset() { CHECK_INIT(_coder_offset); }154155static inline void set_value_raw(oop string, typeArrayOop buffer);156static inline void set_value(oop string, typeArrayOop buffer);157158// Set the deduplication_forbidden flag true. This flag is sticky; once159// set it never gets cleared. This is set when a String is interned in160// the StringTable, to prevent string deduplication from changing the161// String's value array.162static inline void set_deduplication_forbidden(oop java_string);163164// Test and set the deduplication_requested flag. Returns the old value165// of the flag. This flag is sticky; once set it never gets cleared.166// Some GCs may use this flag when deciding whether to request167// deduplication of a String, to avoid multiple requests for the same168// object.169static inline bool test_and_set_deduplication_requested(oop java_string);170171// Accessors172static inline typeArrayOop value(oop java_string);173static inline typeArrayOop value_no_keepalive(oop java_string);174static inline bool hash_is_set(oop string);175static inline bool is_latin1(oop java_string);176static inline bool deduplication_forbidden(oop java_string);177static inline bool deduplication_requested(oop java_string);178static inline int length(oop java_string);179static inline int length(oop java_string, typeArrayOop string_value);180static int utf8_length(oop java_string);181static int utf8_length(oop java_string, typeArrayOop string_value);182183// String converters184static char* as_utf8_string(oop java_string);185static char* as_utf8_string(oop java_string, int& length);186static char* as_utf8_string_full(oop java_string, char* buf, int buflen, int& length);187static char* as_utf8_string(oop java_string, char* buf, int buflen);188static char* as_utf8_string(oop java_string, int start, int len);189static char* as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen);190static char* as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen);191static char* as_platform_dependent_str(Handle java_string, TRAPS);192static jchar* as_unicode_string(oop java_string, int& length, TRAPS);193static jchar* as_unicode_string_or_null(oop java_string, int& length);194// produce an ascii string with all other values quoted using \u####195static char* as_quoted_ascii(oop java_string);196197// Compute the hash value for a java.lang.String object which would198// contain the characters passed in.199//200// As the hash value used by the String object itself, in201// String.hashCode(). This value is normally calculated in Java code202// in the String.hashCode method(), but is precomputed for String203// objects in the shared archive file.204// hash P(31) from Kernighan & Ritchie205//206// For this reason, THIS ALGORITHM MUST MATCH String.hashCode().207static unsigned int hash_code(const jchar* s, int len) {208unsigned int h = 0;209while (len-- > 0) {210h = 31*h + (unsigned int) *s;211s++;212}213return h;214}215216static unsigned int hash_code(const jbyte* s, int len) {217unsigned int h = 0;218while (len-- > 0) {219h = 31*h + (((unsigned int) *s) & 0xFF);220s++;221}222return h;223}224225static unsigned int hash_code(oop java_string);226227static bool equals(oop java_string, const jchar* chars, int len);228static bool equals(oop str1, oop str2);229static inline bool value_equals(typeArrayOop str_value1, typeArrayOop str_value2);230231// Conversion between '.' and '/' formats232static Handle externalize_classname(Handle java_string, TRAPS) {233return char_converter(java_string, JVM_SIGNATURE_SLASH, JVM_SIGNATURE_DOT, THREAD);234}235236// Conversion237static Symbol* as_symbol(oop java_string);238static Symbol* as_symbol_or_null(oop java_string);239240// Testers241static bool is_instance(oop obj);242static inline bool is_instance_inlined(oop obj);243244// Debugging245static void print(oop java_string, outputStream* st);246friend class JavaClasses;247friend class StringTable;248};249250251// Interface to java.lang.Class objects252253#define CLASS_INJECTED_FIELDS(macro) \254macro(java_lang_Class, klass, intptr_signature, false) \255macro(java_lang_Class, array_klass, intptr_signature, false) \256macro(java_lang_Class, oop_size, int_signature, false) \257macro(java_lang_Class, static_oop_field_count, int_signature, false) \258macro(java_lang_Class, protection_domain, object_signature, false) \259macro(java_lang_Class, signers, object_signature, false) \260macro(java_lang_Class, source_file, object_signature, false) \261262class java_lang_Class : AllStatic {263friend class VMStructs;264friend class JVMCIVMStructs;265266private:267268// The fake offsets are added by the class loader when java.lang.Class is loaded269270static int _klass_offset;271static int _array_klass_offset;272273static int _oop_size_offset;274static int _static_oop_field_count_offset;275276static int _protection_domain_offset;277static int _init_lock_offset;278static int _signers_offset;279static int _class_loader_offset;280static int _module_offset;281static int _component_mirror_offset;282static int _name_offset;283static int _source_file_offset;284static int _classData_offset;285static int _classRedefinedCount_offset;286287static bool _offsets_computed;288289static GrowableArray<Klass*>* _fixup_mirror_list;290static GrowableArray<Klass*>* _fixup_module_field_list;291292static void set_init_lock(oop java_class, oop init_lock);293static void set_protection_domain(oop java_class, oop protection_domain);294static void set_class_loader(oop java_class, oop class_loader);295static void set_component_mirror(oop java_class, oop comp_mirror);296static void initialize_mirror_fields(Klass* k, Handle mirror, Handle protection_domain,297Handle classData, TRAPS);298static void set_mirror_module_field(JavaThread* current, Klass* K, Handle mirror, Handle module);299public:300static void allocate_fixup_lists();301static void compute_offsets();302303// Instance creation304static void create_mirror(Klass* k, Handle class_loader, Handle module,305Handle protection_domain, Handle classData, TRAPS);306static void fixup_mirror(Klass* k, TRAPS);307static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS);308static void update_archived_primitive_mirror_native_pointers(oop archived_mirror) NOT_CDS_JAVA_HEAP_RETURN;309static void update_archived_mirror_native_pointers(oop archived_mirror) NOT_CDS_JAVA_HEAP_RETURN;310311// Archiving312static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;313static void archive_basic_type_mirrors() NOT_CDS_JAVA_HEAP_RETURN;314static oop archive_mirror(Klass* k) NOT_CDS_JAVA_HEAP_RETURN_(NULL);315static oop process_archived_mirror(Klass* k, oop mirror, oop archived_mirror)316NOT_CDS_JAVA_HEAP_RETURN_(NULL);317static bool restore_archived_mirror(Klass *k, Handle class_loader, Handle module,318Handle protection_domain,319TRAPS) NOT_CDS_JAVA_HEAP_RETURN_(false);320321static void fixup_module_field(Klass* k, Handle module);322323// Conversion324static Klass* as_Klass(oop java_class);325static Klass* as_Klass_raw(oop java_class);326static void set_klass(oop java_class, Klass* klass);327static BasicType as_BasicType(oop java_class, Klass** reference_klass = NULL);328static Symbol* as_signature(oop java_class, bool intern_if_not_found);329static void print_signature(oop java_class, outputStream *st);330static const char* as_external_name(oop java_class);331// Testing332static bool is_instance(oop obj);333334static bool is_primitive(oop java_class);335static BasicType primitive_type(oop java_class);336static oop primitive_mirror(BasicType t);337// JVM_NewArray support338static Klass* array_klass_acquire(oop java_class);339static void release_set_array_klass(oop java_class, Klass* klass);340// compiler support for class operations341static int klass_offset() { CHECK_INIT(_klass_offset); }342static int array_klass_offset() { CHECK_INIT(_array_klass_offset); }343// Support for classRedefinedCount field344static int classRedefinedCount(oop the_class_mirror);345static void set_classRedefinedCount(oop the_class_mirror, int value);346347// Support for embedded per-class oops348static oop protection_domain(oop java_class);349static oop init_lock(oop java_class);350static void clear_init_lock(oop java_class) {351set_init_lock(java_class, NULL);352}353static oop component_mirror(oop java_class);354static objArrayOop signers(oop java_class);355static void set_signers(oop java_class, objArrayOop signers);356static oop class_data(oop java_class);357static void set_class_data(oop java_class, oop classData);358359static int component_mirror_offset() { return _component_mirror_offset; }360361static oop class_loader(oop java_class);362static void set_module(oop java_class, oop module);363static oop module(oop java_class);364365static oop name(Handle java_class, TRAPS);366367static oop source_file(oop java_class);368static void set_source_file(oop java_class, oop source_file);369370static int oop_size(oop java_class);371static int oop_size_raw(oop java_class);372static void set_oop_size(HeapWord* java_class, int size);373static int static_oop_field_count(oop java_class);374static int static_oop_field_count_raw(oop java_class);375static void set_static_oop_field_count(oop java_class, int size);376377static GrowableArray<Klass*>* fixup_mirror_list() {378return _fixup_mirror_list;379}380static void set_fixup_mirror_list(GrowableArray<Klass*>* v) {381_fixup_mirror_list = v;382}383384static GrowableArray<Klass*>* fixup_module_field_list() {385return _fixup_module_field_list;386}387static void set_fixup_module_field_list(GrowableArray<Klass*>* v) {388_fixup_module_field_list = v;389}390391// Debugging392friend class JavaClasses;393};394395// Interface to java.lang.Thread objects396397class java_lang_Thread : AllStatic {398private:399// Note that for this class the layout changed between JDK1.2 and JDK1.3,400// so we compute the offsets at startup rather than hard-wiring them.401static int _name_offset;402static int _group_offset;403static int _contextClassLoader_offset;404static int _inheritedAccessControlContext_offset;405static int _priority_offset;406static int _eetop_offset;407static int _interrupted_offset;408static int _daemon_offset;409static int _stillborn_offset;410static int _stackSize_offset;411static int _tid_offset;412static int _thread_status_offset;413static int _park_blocker_offset;414415static void compute_offsets();416417public:418static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;419420// Returns the JavaThread associated with the thread obj421static JavaThread* thread(oop java_thread);422// Set JavaThread for instance423static void set_thread(oop java_thread, JavaThread* thread);424// Interrupted status425static bool interrupted(oop java_thread);426static void set_interrupted(oop java_thread, bool val);427// Name428static oop name(oop java_thread);429static void set_name(oop java_thread, oop name);430// Priority431static ThreadPriority priority(oop java_thread);432static void set_priority(oop java_thread, ThreadPriority priority);433// Thread group434static oop threadGroup(oop java_thread);435// Stillborn436static bool is_stillborn(oop java_thread);437static void set_stillborn(oop java_thread);438// Alive (NOTE: this is not really a field, but provides the correct439// definition without doing a Java call)440static bool is_alive(oop java_thread);441// Daemon442static bool is_daemon(oop java_thread);443static void set_daemon(oop java_thread);444// Context ClassLoader445static oop context_class_loader(oop java_thread);446// Control context447static oop inherited_access_control_context(oop java_thread);448// Stack size hint449static jlong stackSize(oop java_thread);450// Thread ID451static jlong thread_id(oop java_thread);452453// Blocker object responsible for thread parking454static oop park_blocker(oop java_thread);455456// Write thread status info to threadStatus field of java.lang.Thread.457static void set_thread_status(oop java_thread_oop, JavaThreadStatus status);458// Read thread status info from threadStatus field of java.lang.Thread.459static JavaThreadStatus get_thread_status(oop java_thread_oop);460461static const char* thread_status_name(oop java_thread_oop);462463// Debugging464friend class JavaClasses;465};466467// Interface to java.lang.ThreadGroup objects468469class java_lang_ThreadGroup : AllStatic {470private:471static int _parent_offset;472static int _name_offset;473static int _threads_offset;474static int _groups_offset;475static int _maxPriority_offset;476static int _destroyed_offset;477static int _daemon_offset;478static int _nthreads_offset;479static int _ngroups_offset;480481static void compute_offsets();482483public:484static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;485486// parent ThreadGroup487static oop parent(oop java_thread_group);488// name489static const char* name(oop java_thread_group);490// ("name as oop" accessor is not necessary)491// Number of threads in group492static int nthreads(oop java_thread_group);493// threads494static objArrayOop threads(oop java_thread_group);495// Number of threads in group496static int ngroups(oop java_thread_group);497// groups498static objArrayOop groups(oop java_thread_group);499// maxPriority in group500static ThreadPriority maxPriority(oop java_thread_group);501// Destroyed502static bool is_destroyed(oop java_thread_group);503// Daemon504static bool is_daemon(oop java_thread_group);505// Debugging506friend class JavaClasses;507};508509510511// Interface to java.lang.Throwable objects512513class java_lang_Throwable: AllStatic {514friend class BacktraceBuilder;515friend class BacktraceIterator;516517private:518// Trace constants519enum {520trace_methods_offset = 0,521trace_bcis_offset = 1,522trace_mirrors_offset = 2,523trace_names_offset = 3,524trace_next_offset = 4,525trace_hidden_offset = 5,526trace_size = 6,527trace_chunk_size = 32528};529530static int _backtrace_offset;531static int _detailMessage_offset;532static int _stackTrace_offset;533static int _depth_offset;534static int _cause_offset;535static int _static_unassigned_stacktrace_offset;536537// StackTrace (programmatic access, new since 1.4)538static void clear_stacktrace(oop throwable);539// Stacktrace (post JDK 1.7.0 to allow immutability protocol to be followed)540static void set_stacktrace(oop throwable, oop st_element_array);541static oop unassigned_stacktrace();542543public:544// Backtrace545static oop backtrace(oop throwable);546static void set_backtrace(oop throwable, oop value);547static int depth(oop throwable);548static void set_depth(oop throwable, int value);549static int get_detailMessage_offset() { CHECK_INIT(_detailMessage_offset); }550// Message551static oop message(oop throwable);552static oop cause(oop throwable);553static void set_message(oop throwable, oop value);554static Symbol* detail_message(oop throwable);555static void print_stack_element(outputStream *st, Method* method, int bci);556557static void compute_offsets();558static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;559560// Allocate space for backtrace (created but stack trace not filled in)561static void allocate_backtrace(Handle throwable, TRAPS);562// Fill in current stack trace for throwable with preallocated backtrace (no GC)563static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);564// Fill in current stack trace, can cause GC565static void fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS);566static void fill_in_stack_trace(Handle throwable, const methodHandle& method = methodHandle());567// Programmatic access to stack trace568static void get_stack_trace_elements(Handle throwable, objArrayHandle stack_trace, TRAPS);569// Printing570static void print(oop throwable, outputStream* st);571static void print_stack_trace(Handle throwable, outputStream* st);572static void java_printStackTrace(Handle throwable, TRAPS);573// Debugging574friend class JavaClasses;575// Gets the method and bci of the top frame (TOS). Returns false if this failed.576static bool get_top_method_and_bci(oop throwable, Method** method, int* bci);577};578579580// Interface to java.lang.reflect.AccessibleObject objects581582class java_lang_reflect_AccessibleObject: AllStatic {583private:584// Note that to reduce dependencies on the JDK we compute these585// offsets at run-time.586static int _override_offset;587588static void compute_offsets();589590public:591static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;592593// Accessors594static jboolean override(oop reflect);595static void set_override(oop reflect, jboolean value);596597// Debugging598friend class JavaClasses;599};600601602// Interface to java.lang.reflect.Method objects603604class java_lang_reflect_Method : public java_lang_reflect_AccessibleObject {605private:606// Note that to reduce dependencies on the JDK we compute these607// offsets at run-time.608static int _clazz_offset;609static int _name_offset;610static int _returnType_offset;611static int _parameterTypes_offset;612static int _exceptionTypes_offset;613static int _slot_offset;614static int _modifiers_offset;615static int _signature_offset;616static int _annotations_offset;617static int _parameter_annotations_offset;618static int _annotation_default_offset;619620static void compute_offsets();621public:622static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;623624// Allocation625static Handle create(TRAPS);626627// Accessors628static oop clazz(oop reflect);629static void set_clazz(oop reflect, oop value);630631static void set_name(oop method, oop value);632633static oop return_type(oop method);634static void set_return_type(oop method, oop value);635636static oop parameter_types(oop method);637static void set_parameter_types(oop method, oop value);638639static int slot(oop reflect);640static void set_slot(oop reflect, int value);641642static void set_exception_types(oop method, oop value);643static void set_modifiers(oop method, int value);644static void set_signature(oop method, oop value);645static void set_annotations(oop method, oop value);646static void set_parameter_annotations(oop method, oop value);647static void set_annotation_default(oop method, oop value);648649// Debugging650friend class JavaClasses;651};652653654// Interface to java.lang.reflect.Constructor objects655656class java_lang_reflect_Constructor : public java_lang_reflect_AccessibleObject {657private:658// Note that to reduce dependencies on the JDK we compute these659// offsets at run-time.660static int _clazz_offset;661static int _parameterTypes_offset;662static int _exceptionTypes_offset;663static int _slot_offset;664static int _modifiers_offset;665static int _signature_offset;666static int _annotations_offset;667static int _parameter_annotations_offset;668669static void compute_offsets();670public:671static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;672673// Allocation674static Handle create(TRAPS);675676// Accessors677static oop clazz(oop reflect);678static void set_clazz(oop reflect, oop value);679680static oop parameter_types(oop constructor);681static void set_parameter_types(oop constructor, oop value);682683static int slot(oop reflect);684static void set_slot(oop reflect, int value);685686static void set_exception_types(oop constructor, oop value);687static void set_modifiers(oop constructor, int value);688static void set_signature(oop constructor, oop value);689static void set_annotations(oop constructor, oop value);690static void set_parameter_annotations(oop method, oop value);691692// Debugging693friend class JavaClasses;694};695696697// Interface to java.lang.reflect.Field objects698699class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {700private:701// Note that to reduce dependencies on the JDK we compute these702// offsets at run-time.703static int _clazz_offset;704static int _name_offset;705static int _type_offset;706static int _slot_offset;707static int _modifiers_offset;708static int _trusted_final_offset;709static int _signature_offset;710static int _annotations_offset;711712static void compute_offsets();713714public:715static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;716717// Allocation718static Handle create(TRAPS);719720// Accessors721static oop clazz(oop reflect);722static void set_clazz(oop reflect, oop value);723724static oop name(oop field);725static void set_name(oop field, oop value);726727static oop type(oop field);728static void set_type(oop field, oop value);729730static int slot(oop reflect);731static void set_slot(oop reflect, int value);732733static int modifiers(oop field);734static void set_modifiers(oop field, int value);735736static void set_trusted_final(oop field);737738static void set_signature(oop constructor, oop value);739static void set_annotations(oop constructor, oop value);740741// Debugging742friend class JavaClasses;743};744745class java_lang_reflect_Parameter {746private:747// Note that to reduce dependencies on the JDK we compute these748// offsets at run-time.749static int _name_offset;750static int _modifiers_offset;751static int _index_offset;752static int _executable_offset;753754static void compute_offsets();755756public:757static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;758759// Allocation760static Handle create(TRAPS);761762// Accessors763static oop name(oop field);764static void set_name(oop field, oop value);765766static int index(oop reflect);767static void set_index(oop reflect, int value);768769static int modifiers(oop reflect);770static void set_modifiers(oop reflect, int value);771772static oop executable(oop constructor);773static void set_executable(oop constructor, oop value);774775friend class JavaClasses;776};777778#define MODULE_INJECTED_FIELDS(macro) \779macro(java_lang_Module, module_entry, intptr_signature, false)780781class java_lang_Module {782private:783static int _loader_offset;784static int _name_offset;785static int _module_entry_offset;786787static void compute_offsets();788789public:790static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;791792// Allocation793static Handle create(Handle loader, Handle module_name, TRAPS);794795// Testers796static bool is_instance(oop obj);797798// Accessors799static oop loader(oop module);800static void set_loader(oop module, oop value);801802static oop name(oop module);803static void set_name(oop module, oop value);804805static ModuleEntry* module_entry(oop module);806static ModuleEntry* module_entry_raw(oop module);807static void set_module_entry(oop module, ModuleEntry* module_entry);808809friend class JavaClasses;810};811812// Interface to jdk.internal.reflect.ConstantPool objects813class reflect_ConstantPool {814private:815// Note that to reduce dependencies on the JDK we compute these816// offsets at run-time.817static int _oop_offset;818819static void compute_offsets();820821public:822static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;823824// Allocation825static Handle create(TRAPS);826827// Accessors828static void set_cp(oop reflect, ConstantPool* value);829static int oop_offset() { CHECK_INIT(_oop_offset); }830831static ConstantPool* get_cp(oop reflect);832833// Debugging834friend class JavaClasses;835};836837// Interface to jdk.internal.reflect.UnsafeStaticFieldAccessorImpl objects838class reflect_UnsafeStaticFieldAccessorImpl {839private:840static int _base_offset;841static void compute_offsets();842843public:844static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;845846static int base_offset() { CHECK_INIT(_base_offset); }847848// Debugging849friend class JavaClasses;850};851852// Interface to java.lang primitive type boxing objects:853// - java.lang.Boolean854// - java.lang.Character855// - java.lang.Float856// - java.lang.Double857// - java.lang.Byte858// - java.lang.Short859// - java.lang.Integer860// - java.lang.Long861862// This could be separated out into 8 individual classes.863864class java_lang_boxing_object: AllStatic {865private:866static int _value_offset;867static int _long_value_offset;868869static void compute_offsets();870static oop initialize_and_allocate(BasicType type, TRAPS);871public:872// Allocation. Returns a boxed value, or NULL for invalid type.873static oop create(BasicType type, jvalue* value, TRAPS);874// Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.875static BasicType get_value(oop box, jvalue* value);876static BasicType set_value(oop box, jvalue* value);877static BasicType basic_type(oop box);878static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; }879static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }880static void print(oop box, outputStream* st) { jvalue value; print(get_value(box, &value), &value, st); }881static void print(BasicType type, jvalue* value, outputStream* st);882883static int value_offset(BasicType type) {884return is_double_word_type(type) ? _long_value_offset : _value_offset;885}886887static void serialize_offsets(SerializeClosure* f);888889// Debugging890friend class JavaClasses;891};892893894895// Interface to java.lang.ref.Reference objects896897class java_lang_ref_Reference: AllStatic {898static int _referent_offset;899static int _queue_offset;900static int _next_offset;901static int _discovered_offset;902903static bool _offsets_initialized;904905public:906// Accessors907static inline oop weak_referent_no_keepalive(oop ref);908static inline oop phantom_referent_no_keepalive(oop ref);909static inline oop unknown_referent_no_keepalive(oop ref);910static inline void clear_referent(oop ref);911static inline HeapWord* referent_addr_raw(oop ref);912static inline oop next(oop ref);913static inline void set_next(oop ref, oop value);914static inline void set_next_raw(oop ref, oop value);915static inline HeapWord* next_addr_raw(oop ref);916static inline oop discovered(oop ref);917static inline void set_discovered(oop ref, oop value);918static inline void set_discovered_raw(oop ref, oop value);919static inline HeapWord* discovered_addr_raw(oop ref);920static bool is_referent_field(oop obj, ptrdiff_t offset);921static inline bool is_final(oop ref);922static inline bool is_phantom(oop ref);923924static int referent_offset() { CHECK_INIT(_referent_offset); }925static int queue_offset() { CHECK_INIT(_queue_offset); }926static int next_offset() { CHECK_INIT(_next_offset); }927static int discovered_offset() { CHECK_INIT(_discovered_offset); }928929static void compute_offsets();930static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;931};932933934// Interface to java.lang.ref.SoftReference objects935936class java_lang_ref_SoftReference: public java_lang_ref_Reference {937static int _timestamp_offset;938static int _static_clock_offset;939940public:941// Accessors942static jlong timestamp(oop ref);943944// Accessors for statics945static jlong clock();946static void set_clock(jlong value);947948static void compute_offsets();949static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;950};951952// Interface to java.lang.invoke.MethodHandle objects953954class java_lang_invoke_MethodHandle: AllStatic {955friend class JavaClasses;956957private:958static int _type_offset; // the MethodType of this MH959static int _form_offset; // the LambdaForm of this MH960961static void compute_offsets();962963public:964static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;965966// Accessors967static oop type(oop mh);968static void set_type(oop mh, oop mtype);969970static oop form(oop mh);971static void set_form(oop mh, oop lform);972973// Testers974static bool is_subclass(Klass* klass) {975return klass->is_subclass_of(vmClasses::MethodHandle_klass());976}977static bool is_instance(oop obj);978979// Accessors for code generation:980static int type_offset() { CHECK_INIT(_type_offset); }981static int form_offset() { CHECK_INIT(_form_offset); }982};983984// Interface to java.lang.invoke.DirectMethodHandle objects985986class java_lang_invoke_DirectMethodHandle: AllStatic {987friend class JavaClasses;988989private:990static int _member_offset; // the MemberName of this DMH991992static void compute_offsets();993994public:995static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;996997// Accessors998static oop member(oop mh);9991000// Testers1001static bool is_subclass(Klass* klass) {1002return klass->is_subclass_of(vmClasses::DirectMethodHandle_klass());1003}1004static bool is_instance(oop obj);10051006// Accessors for code generation:1007static int member_offset() { CHECK_INIT(_member_offset); }1008};10091010// Interface to java.lang.invoke.LambdaForm objects1011// (These are a private interface for managing adapter code generation.)10121013class java_lang_invoke_LambdaForm: AllStatic {1014friend class JavaClasses;10151016private:1017static int _vmentry_offset; // type is MemberName10181019static void compute_offsets();10201021public:1022static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;10231024// Accessors1025static oop vmentry(oop lform);10261027// Testers1028static bool is_subclass(Klass* klass) {1029return vmClasses::LambdaForm_klass() != NULL &&1030klass->is_subclass_of(vmClasses::LambdaForm_klass());1031}1032static bool is_instance(oop obj);10331034// Accessors for code generation:1035static int vmentry_offset() { CHECK_INIT(_vmentry_offset); }1036};10371038// Interface to java.lang.invoke.NativeEntryPoint objects1039// (These are a private interface for managing adapter code generation.)10401041class jdk_internal_invoke_NativeEntryPoint: AllStatic {1042friend class JavaClasses;10431044private:1045static int _shadow_space_offset;1046static int _argMoves_offset;1047static int _returnMoves_offset;1048static int _need_transition_offset;1049static int _method_type_offset;1050static int _name_offset;10511052static void compute_offsets();10531054public:1055static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;10561057// Accessors1058static jint shadow_space(oop entry);1059static oop argMoves(oop entry);1060static oop returnMoves(oop entry);1061static jboolean need_transition(oop entry);1062static oop method_type(oop entry);1063static oop name(oop entry);10641065// Testers1066static bool is_subclass(Klass* klass) {1067return vmClasses::NativeEntryPoint_klass() != NULL &&1068klass->is_subclass_of(vmClasses::NativeEntryPoint_klass());1069}1070static bool is_instance(oop obj);10711072// Accessors for code generation:1073static int shadow_space_offset_in_bytes() { return _shadow_space_offset; }1074static int argMoves_offset_in_bytes() { return _argMoves_offset; }1075static int returnMoves_offset_in_bytes() { return _returnMoves_offset; }1076static int need_transition_offset_in_bytes() { return _need_transition_offset; }1077static int method_type_offset_in_bytes() { return _method_type_offset; }1078static int name_offset_in_bytes() { return _name_offset; }1079};10801081// Interface to java.lang.invoke.MemberName objects1082// (These are a private interface for Java code to query the class hierarchy.)10831084#define RESOLVEDMETHOD_INJECTED_FIELDS(macro) \1085macro(java_lang_invoke_ResolvedMethodName, vmholder, object_signature, false) \1086macro(java_lang_invoke_ResolvedMethodName, vmtarget, intptr_signature, false)10871088class java_lang_invoke_ResolvedMethodName : AllStatic {1089friend class JavaClasses;10901091static int _vmtarget_offset;1092static int _vmholder_offset;10931094static void compute_offsets();1095public:1096static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;10971098static int vmtarget_offset() { CHECK_INIT(_vmtarget_offset); }10991100static Method* vmtarget(oop resolved_method);1101static void set_vmtarget(oop resolved_method, Method* method);11021103static void set_vmholder(oop resolved_method, oop holder);11041105// find or create resolved member name1106static oop find_resolved_method(const methodHandle& m, TRAPS);11071108static bool is_instance(oop resolved_method);1109};111011111112#define MEMBERNAME_INJECTED_FIELDS(macro) \1113macro(java_lang_invoke_MemberName, vmindex, intptr_signature, false)111411151116class java_lang_invoke_MemberName: AllStatic {1117friend class JavaClasses;11181119private:1120// From java.lang.invoke.MemberName:1121// private Class<?> clazz; // class in which the method is defined1122// private String name; // may be null if not yet materialized1123// private Object type; // may be null if not yet materialized1124// private int flags; // modifier bits; see reflect.Modifier1125// private ResolvedMethodName method; // holds VM-specific target value1126// private intptr_t vmindex; // member index within class or interface1127static int _clazz_offset;1128static int _name_offset;1129static int _type_offset;1130static int _flags_offset;1131static int _method_offset;1132static int _vmindex_offset;11331134static void compute_offsets();11351136public:1137static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1138// Accessors1139static oop clazz(oop mname);1140static void set_clazz(oop mname, oop clazz);11411142static oop type(oop mname);1143static void set_type(oop mname, oop type);11441145static oop name(oop mname);1146static void set_name(oop mname, oop name);11471148static int flags(oop mname);1149static void set_flags(oop mname, int flags);11501151// Link through ResolvedMethodName field to get Method*1152static Method* vmtarget(oop mname);1153static void set_method(oop mname, oop method);11541155static intptr_t vmindex(oop mname);1156static void set_vmindex(oop mname, intptr_t index);11571158// Testers1159static bool is_subclass(Klass* klass) {1160return klass->is_subclass_of(vmClasses::MemberName_klass());1161}1162static bool is_instance(oop obj);11631164static bool is_method(oop obj);11651166// Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):1167enum {1168MN_IS_METHOD = 0x00010000, // method (not constructor)1169MN_IS_CONSTRUCTOR = 0x00020000, // constructor1170MN_IS_FIELD = 0x00040000, // field1171MN_IS_TYPE = 0x00080000, // nested type1172MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected1173MN_TRUSTED_FINAL = 0x00200000, // trusted final field1174MN_REFERENCE_KIND_SHIFT = 24, // refKind1175MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,1176// The SEARCH_* bits are not for MN.flags but for the matchFlags argument of MHN.getMembers:1177MN_SEARCH_SUPERCLASSES = 0x00100000, // walk super classes1178MN_SEARCH_INTERFACES = 0x00200000, // walk implemented interfaces1179MN_NESTMATE_CLASS = 0x00000001,1180MN_HIDDEN_CLASS = 0x00000002,1181MN_STRONG_LOADER_LINK = 0x00000004,1182MN_ACCESS_VM_ANNOTATIONS = 0x00000008,1183// Lookup modes1184MN_MODULE_MODE = 0x00000010,1185MN_UNCONDITIONAL_MODE = 0x00000020,1186MN_TRUSTED_MODE = -11187};11881189// Accessors for code generation:1190static int clazz_offset() { CHECK_INIT(_clazz_offset); }1191static int type_offset() { CHECK_INIT(_type_offset); }1192static int flags_offset() { CHECK_INIT(_flags_offset); }1193static int method_offset() { CHECK_INIT(_method_offset); }1194static int vmindex_offset() { CHECK_INIT(_vmindex_offset); }1195};119611971198// Interface to java.lang.invoke.MethodType objects11991200class java_lang_invoke_MethodType: AllStatic {1201friend class JavaClasses;12021203private:1204static int _rtype_offset;1205static int _ptypes_offset;12061207static void compute_offsets();12081209public:1210static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1211// Accessors1212static oop rtype(oop mt);1213static objArrayOop ptypes(oop mt);12141215static oop ptype(oop mt, int index);1216static int ptype_count(oop mt);12171218static int ptype_slot_count(oop mt); // extra counts for long/double1219static int rtype_slot_count(oop mt); // extra counts for long/double12201221static Symbol* as_signature(oop mt, bool intern_if_not_found);1222static void print_signature(oop mt, outputStream* st);12231224static bool is_instance(oop obj);12251226static bool equals(oop mt1, oop mt2);12271228// Accessors for code generation:1229static int rtype_offset() { CHECK_INIT(_rtype_offset); }1230static int ptypes_offset() { CHECK_INIT(_ptypes_offset); }1231};123212331234// Interface to java.lang.invoke.CallSite objects12351236class java_lang_invoke_CallSite: AllStatic {1237friend class JavaClasses;12381239private:1240static int _target_offset;1241static int _context_offset;12421243static void compute_offsets();12441245public:1246static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1247// Accessors1248static oop target( oop site);1249static void set_target( oop site, oop target);1250static void set_target_volatile( oop site, oop target);12511252static oop context_no_keepalive(oop site);12531254// Testers1255static bool is_subclass(Klass* klass) {1256return klass->is_subclass_of(vmClasses::CallSite_klass());1257}1258static bool is_instance(oop obj);12591260// Accessors for code generation:1261static int target_offset() { CHECK_INIT(_target_offset); }1262static int context_offset() { CHECK_INIT(_context_offset); }1263};12641265// Interface to java.lang.invoke.ConstantCallSite objects12661267class java_lang_invoke_ConstantCallSite: AllStatic {1268friend class JavaClasses;12691270private:1271static int _is_frozen_offset;12721273static void compute_offsets();12741275public:1276static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1277// Accessors1278static jboolean is_frozen(oop site);12791280// Testers1281static bool is_subclass(Klass* klass) {1282return klass->is_subclass_of(vmClasses::ConstantCallSite_klass());1283}1284static bool is_instance(oop obj);1285};12861287// Interface to java.lang.invoke.MethodHandleNatives$CallSiteContext objects12881289#define CALLSITECONTEXT_INJECTED_FIELDS(macro) \1290macro(java_lang_invoke_MethodHandleNatives_CallSiteContext, vmdependencies, intptr_signature, false) \1291macro(java_lang_invoke_MethodHandleNatives_CallSiteContext, last_cleanup, long_signature, false)12921293class DependencyContext;12941295class java_lang_invoke_MethodHandleNatives_CallSiteContext : AllStatic {1296friend class JavaClasses;12971298private:1299static int _vmdependencies_offset;1300static int _last_cleanup_offset;13011302static void compute_offsets();13031304public:1305static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1306// Accessors1307static DependencyContext vmdependencies(oop context);13081309// Testers1310static bool is_subclass(Klass* klass) {1311return klass->is_subclass_of(vmClasses::Context_klass());1312}1313static bool is_instance(oop obj);1314};13151316// Interface to java.security.AccessControlContext objects13171318class java_security_AccessControlContext: AllStatic {1319private:1320// Note that for this class the layout changed between JDK1.2 and JDK1.3,1321// so we compute the offsets at startup rather than hard-wiring them.1322static int _context_offset;1323static int _privilegedContext_offset;1324static int _isPrivileged_offset;1325static int _isAuthorized_offset;13261327static void compute_offsets();1328public:1329static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1330static oop create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS);13311332// Debugging/initialization1333friend class JavaClasses;1334};133513361337// Interface to java.lang.ClassLoader objects13381339#define CLASSLOADER_INJECTED_FIELDS(macro) \1340macro(java_lang_ClassLoader, loader_data, intptr_signature, false)13411342class java_lang_ClassLoader : AllStatic {1343private:1344static int _loader_data_offset;1345static int _parent_offset;1346static int _parallelCapable_offset;1347static int _name_offset;1348static int _nameAndId_offset;1349static int _unnamedModule_offset;13501351static void compute_offsets();13521353public:1354static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;13551356static ClassLoaderData* loader_data_acquire(oop loader);1357static ClassLoaderData* loader_data_raw(oop loader);1358static void release_set_loader_data(oop loader, ClassLoaderData* new_data);13591360static oop parent(oop loader);1361static oop name(oop loader);1362static oop nameAndId(oop loader);1363static bool isAncestor(oop loader, oop cl);13641365// Support for parallelCapable field1366static bool parallelCapable(oop the_class_mirror);13671368static bool is_trusted_loader(oop loader);13691370// Return true if this is one of the class loaders associated with1371// the generated bytecodes for reflection.1372static bool is_reflection_class_loader(oop loader);13731374// Fix for 44741721375static oop non_reflection_class_loader(oop loader);13761377// Testers1378static bool is_subclass(Klass* klass) {1379return klass->is_subclass_of(vmClasses::ClassLoader_klass());1380}1381static bool is_instance(oop obj);13821383static oop unnamedModule(oop loader);13841385// Debugging1386friend class JavaClasses;1387};138813891390// Interface to java.lang.System objects13911392class java_lang_System : AllStatic {1393private:1394static int _static_in_offset;1395static int _static_out_offset;1396static int _static_err_offset;1397static int _static_security_offset;1398static int _static_allow_security_offset;1399static int _static_never_offset;14001401public:1402static int in_offset() { CHECK_INIT(_static_in_offset); }1403static int out_offset() { CHECK_INIT(_static_out_offset); }1404static int err_offset() { CHECK_INIT(_static_err_offset); }1405static bool allow_security_manager();1406static bool has_security_manager();14071408static void compute_offsets();1409static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;14101411// Debugging1412friend class JavaClasses;1413};141414151416// Interface to java.lang.StackTraceElement objects14171418class java_lang_StackTraceElement: AllStatic {1419private:1420static int _declaringClassObject_offset;1421static int _classLoaderName_offset;1422static int _moduleName_offset;1423static int _moduleVersion_offset;1424static int _declaringClass_offset;1425static int _methodName_offset;1426static int _fileName_offset;1427static int _lineNumber_offset;14281429// Setters1430static void set_classLoaderName(oop element, oop value);1431static void set_moduleName(oop element, oop value);1432static void set_moduleVersion(oop element, oop value);1433static void set_declaringClass(oop element, oop value);1434static void set_methodName(oop element, oop value);1435static void set_fileName(oop element, oop value);1436static void set_lineNumber(oop element, int value);1437static void set_declaringClassObject(oop element, oop value);14381439static void decode_file_and_line(Handle java_mirror, InstanceKlass* holder, int version,1440const methodHandle& method, int bci,1441Symbol*& source, oop& source_file, int& line_number, TRAPS);14421443public:1444// Create an instance of StackTraceElement1445static oop create(const methodHandle& method, int bci, TRAPS);14461447static void fill_in(Handle element, InstanceKlass* holder, const methodHandle& method,1448int version, int bci, Symbol* name, TRAPS);14491450static void compute_offsets();1451static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;14521453#if INCLUDE_JVMCI1454static void decode(const methodHandle& method, int bci, Symbol*& fileName, int& lineNumber, TRAPS);1455#endif14561457// Debugging1458friend class JavaClasses;1459};146014611462class Backtrace: AllStatic {1463public:1464// Helper backtrace functions to store bci|version together.1465static int merge_bci_and_version(int bci, int version);1466static int merge_mid_and_cpref(int mid, int cpref);1467static int bci_at(unsigned int merged);1468static int version_at(unsigned int merged);1469static int mid_at(unsigned int merged);1470static int cpref_at(unsigned int merged);1471static int get_line_number(Method* method, int bci);1472static Symbol* get_source_file_name(InstanceKlass* holder, int version);14731474// Debugging1475friend class JavaClasses;1476};14771478// Interface to java.lang.StackFrameInfo objects14791480#define STACKFRAMEINFO_INJECTED_FIELDS(macro) \1481macro(java_lang_StackFrameInfo, version, short_signature, false)14821483class java_lang_StackFrameInfo: AllStatic {1484private:1485static int _memberName_offset;1486static int _bci_offset;1487static int _version_offset;14881489static Method* get_method(Handle stackFrame, InstanceKlass* holder, TRAPS);14901491public:1492// Setters1493static void set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS);1494static void set_bci(oop info, int value);14951496static void set_version(oop info, short value);14971498static void compute_offsets();1499static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;15001501static void to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPS);15021503// Debugging1504friend class JavaClasses;1505};15061507class java_lang_LiveStackFrameInfo: AllStatic {1508private:1509static int _monitors_offset;1510static int _locals_offset;1511static int _operands_offset;1512static int _mode_offset;15131514public:1515static void set_monitors(oop info, oop value);1516static void set_locals(oop info, oop value);1517static void set_operands(oop info, oop value);1518static void set_mode(oop info, int value);15191520static void compute_offsets();1521static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;15221523// Debugging1524friend class JavaClasses;1525};15261527// Interface to java.lang.reflect.RecordComponent objects15281529class java_lang_reflect_RecordComponent: AllStatic {1530private:1531static int _clazz_offset;1532static int _name_offset;1533static int _type_offset;1534static int _accessor_offset;1535static int _signature_offset;1536static int _annotations_offset;1537static int _typeAnnotations_offset;15381539// Setters1540static void set_clazz(oop element, oop value);1541static void set_name(oop element, oop value);1542static void set_type(oop element, oop value);1543static void set_accessor(oop element, oop value);1544static void set_signature(oop element, oop value);1545static void set_annotations(oop element, oop value);1546static void set_typeAnnotations(oop element, oop value);15471548public:1549// Create an instance of RecordComponent1550static oop create(InstanceKlass* holder, RecordComponent* component, TRAPS);15511552static void compute_offsets();1553static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;15541555// Debugging1556friend class JavaClasses;1557};155815591560// Interface to java.lang.AssertionStatusDirectives objects15611562class java_lang_AssertionStatusDirectives: AllStatic {1563private:1564static int _classes_offset;1565static int _classEnabled_offset;1566static int _packages_offset;1567static int _packageEnabled_offset;1568static int _deflt_offset;15691570public:1571// Setters1572static void set_classes(oop obj, oop val);1573static void set_classEnabled(oop obj, oop val);1574static void set_packages(oop obj, oop val);1575static void set_packageEnabled(oop obj, oop val);1576static void set_deflt(oop obj, bool val);15771578static void compute_offsets();1579static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;15801581// Debugging1582friend class JavaClasses;1583};158415851586class java_nio_Buffer: AllStatic {1587private:1588static int _limit_offset;15891590public:1591static int limit_offset() { CHECK_INIT(_limit_offset); }1592static void compute_offsets();1593static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1594};15951596class java_util_concurrent_locks_AbstractOwnableSynchronizer : AllStatic {1597private:1598static int _owner_offset;1599public:1600static void compute_offsets();1601static oop get_owner_threadObj(oop obj);1602static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1603};16041605// Interface to jdk.internal.misc.UnsafeConsants16061607class jdk_internal_misc_UnsafeConstants : AllStatic {1608public:1609static void set_unsafe_constants();1610static void compute_offsets() { }1611static void serialize_offsets(SerializeClosure* f) { }1612};16131614// Interface to jdk.internal.vm.vector.VectorSupport.VectorPayload objects16151616class vector_VectorPayload : AllStatic {1617private:1618static int _payload_offset;1619public:1620static void set_payload(oop o, oop val);16211622static void compute_offsets();1623static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;16241625// Testers1626static bool is_subclass(Klass* klass) {1627return klass->is_subclass_of(vmClasses::vector_VectorPayload_klass());1628}1629static bool is_instance(oop obj);1630};16311632class java_lang_Integer : AllStatic {1633public:1634static jint value(oop obj);1635};16361637class java_lang_Long : AllStatic {1638public:1639static jlong value(oop obj);1640};16411642class java_lang_Character : AllStatic {1643public:1644static jchar value(oop obj);1645};16461647class java_lang_Short : AllStatic {1648public:1649static jshort value(oop obj);1650};16511652class java_lang_Byte : AllStatic {1653public:1654static jbyte value(oop obj);1655};16561657class java_lang_Boolean : AllStatic {1658private:1659static int _static_TRUE_offset;1660static int _static_FALSE_offset;1661public:1662static Symbol* symbol();1663static void compute_offsets(InstanceKlass* k);1664static oop get_TRUE(InstanceKlass *k);1665static oop get_FALSE(InstanceKlass *k);1666static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1667static jboolean value(oop obj);1668};16691670class java_lang_Integer_IntegerCache : AllStatic {1671private:1672static int _static_cache_offset;1673public:1674static Symbol* symbol();1675static void compute_offsets(InstanceKlass* k);1676static objArrayOop cache(InstanceKlass *k);1677static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1678};16791680class java_lang_Long_LongCache : AllStatic {1681private:1682static int _static_cache_offset;1683public:1684static Symbol* symbol();1685static void compute_offsets(InstanceKlass* k);1686static objArrayOop cache(InstanceKlass *k);1687static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1688};16891690class java_lang_Character_CharacterCache : AllStatic {1691private:1692static int _static_cache_offset;1693public:1694static Symbol* symbol();1695static void compute_offsets(InstanceKlass* k);1696static objArrayOop cache(InstanceKlass *k);1697static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1698};16991700class java_lang_Short_ShortCache : AllStatic {1701private:1702static int _static_cache_offset;1703public:1704static Symbol* symbol();1705static void compute_offsets(InstanceKlass* k);1706static objArrayOop cache(InstanceKlass *k);1707static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1708};17091710class java_lang_Byte_ByteCache : AllStatic {1711private:1712static int _static_cache_offset;1713public:1714static Symbol* symbol();1715static void compute_offsets(InstanceKlass* k);1716static objArrayOop cache(InstanceKlass *k);1717static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1718};171917201721// Interface to java.lang.InternalError objects17221723#define INTERNALERROR_INJECTED_FIELDS(macro) \1724macro(java_lang_InternalError, during_unsafe_access, bool_signature, false)17251726class java_lang_InternalError : AllStatic {1727private:1728static int _during_unsafe_access_offset;1729public:1730static jboolean during_unsafe_access(oop internal_error);1731static void set_during_unsafe_access(oop internal_error);1732static void compute_offsets();1733static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;1734};17351736// Use to declare fields that need to be injected into Java classes1737// for the JVM to use. The name_index and signature_index are1738// declared in vmSymbols. The may_be_java flag is used to declare1739// fields that might already exist in Java but should be injected if1740// they don't. Otherwise the field is unconditionally injected and1741// the JVM uses the injected one. This is to ensure that name1742// collisions don't occur. In general may_be_java should be false1743// unless there's a good reason.17441745class InjectedField {1746public:1747const vmClassID klass_id;1748const vmSymbolID name_index;1749const vmSymbolID signature_index;1750const bool may_be_java;175117521753Klass* klass() const { return vmClasses::klass_at(klass_id); }1754Symbol* name() const { return lookup_symbol(name_index); }1755Symbol* signature() const { return lookup_symbol(signature_index); }17561757int compute_offset();17581759// Find the Symbol for this index1760static Symbol* lookup_symbol(vmSymbolID symbol_index) {1761return Symbol::vm_symbol_at(symbol_index);1762}1763};17641765#define DECLARE_INJECTED_FIELD_ENUM(klass, name, signature, may_be_java) \1766klass##_##name##_enum,17671768#define ALL_INJECTED_FIELDS(macro) \1769STRING_INJECTED_FIELDS(macro) \1770CLASS_INJECTED_FIELDS(macro) \1771CLASSLOADER_INJECTED_FIELDS(macro) \1772RESOLVEDMETHOD_INJECTED_FIELDS(macro) \1773MEMBERNAME_INJECTED_FIELDS(macro) \1774CALLSITECONTEXT_INJECTED_FIELDS(macro) \1775STACKFRAMEINFO_INJECTED_FIELDS(macro) \1776MODULE_INJECTED_FIELDS(macro) \1777INTERNALERROR_INJECTED_FIELDS(macro)177817791780// Interface to hard-coded offset checking17811782class JavaClasses : AllStatic {1783private:17841785static InjectedField _injected_fields[];17861787static bool check_offset(const char *klass_name, int offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0;1788public:1789enum InjectedFieldID {1790ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD_ENUM)1791MAX_enum1792};17931794static int compute_injected_offset(InjectedFieldID id);17951796static void compute_offsets();1797static void check_offsets() PRODUCT_RETURN;1798static void serialize_offsets(SerializeClosure* soc) NOT_CDS_RETURN;1799static InjectedField* get_injected(Symbol* class_name, int* field_count);1800static bool is_supported_for_archiving(oop obj) NOT_CDS_JAVA_HEAP_RETURN_(false);1801};18021803#undef DECLARE_INJECTED_FIELD_ENUM18041805#undef CHECK_INIT1806#endif // SHARE_CLASSFILE_JAVACLASSES_HPP180718081809