235 friend class VMStructs;
236 friend class JVMCIVMStructs;
237 friend class HeapShared;
238
239 private:
240
241 // The fake offsets are added by the class loader when java.lang.Class is loaded
242
243 static int _klass_offset;
244 static int _array_klass_offset;
245
246 static int _oop_size_offset;
247 static int _static_oop_field_count_offset;
248
249 static int _protection_domain_offset;
250 static int _init_lock_offset;
251 static int _signers_offset;
252 static int _class_loader_offset;
253 static int _module_offset;
254 static int _component_mirror_offset;
255 static int _name_offset;
256 static int _source_file_offset;
257 static int _classData_offset;
258 static int _classRedefinedCount_offset;
259 static int _reflectionData_offset;
260 static int _modifiers_offset;
261 static int _is_primitive_offset;
262 static int _raw_access_flags_offset;
263
264 static bool _offsets_computed;
265
266 static GrowableArray<Klass*>* _fixup_mirror_list;
267 static GrowableArray<Klass*>* _fixup_module_field_list;
268
269 static void set_init_lock(oop java_class, oop init_lock);
270 static void set_protection_domain(oop java_class, oop protection_domain);
271 static void set_class_loader(oop java_class, oop class_loader);
272 static void set_component_mirror(oop java_class, oop comp_mirror);
273 static void initialize_mirror_fields(InstanceKlass* ik, Handle mirror, Handle protection_domain,
274 Handle classData, TRAPS);
303 // Conversion -- java_class must not be null. The return value is null only if java_class is a primitive type.
304 static Klass* as_Klass(oop java_class);
305 static InstanceKlass* as_InstanceKlass(oop java_class);
306
307 static void set_klass(oop java_class, Klass* klass);
308 static BasicType as_BasicType(oop java_class, Klass** reference_klass = nullptr);
309 static Symbol* as_signature(oop java_class, bool intern_if_not_found);
310 static void print_signature(oop java_class, outputStream *st);
311 static const char* as_external_name(oop java_class);
312 // Testing
313 static bool is_instance(oop obj);
314
315 static bool is_primitive(oop java_class);
316 static BasicType primitive_type(oop java_class);
317 static oop primitive_mirror(BasicType t);
318 static Klass* array_klass_acquire(oop java_class);
319
320 // compiler support for class operations
321 static int klass_offset() { CHECK_INIT(_klass_offset); }
322 static int array_klass_offset() { CHECK_INIT(_array_klass_offset); }
323 // Support for classRedefinedCount field
324 static int classRedefinedCount(oop the_class_mirror);
325 static void set_classRedefinedCount(oop the_class_mirror, int value);
326
327 // Support for embedded per-class oops
328 static oop protection_domain(oop java_class);
329 static oop init_lock(oop java_class);
330 static void clear_init_lock(oop java_class) {
331 set_init_lock(java_class, nullptr);
332 }
333 static oop component_mirror(oop java_class);
334 static int component_mirror_offset() { return _component_mirror_offset; }
335 static objArrayOop signers(oop java_class);
336 static oop class_data(oop java_class);
337 static void set_class_data(oop java_class, oop classData);
338 static int reflection_data_offset() { return _reflectionData_offset; }
339
340 static oop class_loader(oop java_class);
341 static void set_module(oop java_class, oop module);
342 static oop module(oop java_class);
644 trace_hidden_offset = 6,
645 trace_size = 7,
646 trace_chunk_size = 32
647 };
648
649 static int _backtrace_offset;
650 static int _detailMessage_offset;
651 static int _stackTrace_offset;
652 static int _depth_offset;
653 static int _cause_offset;
654 static int _static_unassigned_stacktrace_offset;
655
656 // StackTrace (programmatic access, new since 1.4)
657 static void clear_stacktrace(oop throwable);
658 // Stacktrace (post JDK 1.7.0 to allow immutability protocol to be followed)
659 static void set_stacktrace(oop throwable, oop st_element_array);
660 static oop unassigned_stacktrace();
661
662 public:
663 // Backtrace
664 static oop backtrace(oop throwable);
665 static void set_backtrace(oop throwable, oop value);
666 static int depth(oop throwable);
667 static void set_depth(oop throwable, int value);
668 // Message
669 static int get_detailMessage_offset() { CHECK_INIT(_detailMessage_offset); }
670 static oop message(oop throwable);
671 static const char* message_as_utf8(oop throwable);
672 static void set_message(oop throwable, oop value);
673
674 static oop cause(oop throwable);
675
676 static void print_stack_element(outputStream *st, Method* method, int bci);
677
678 static void compute_offsets();
679 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
680
681 // Allocate space for backtrace (created but stack trace not filled in)
682 static void allocate_backtrace(Handle throwable, TRAPS);
683 // Fill in current stack trace for throwable with preallocated backtrace (no GC)
684 static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
685 // Fill in current stack trace, can cause GC
686 static void fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS);
687 static void fill_in_stack_trace(Handle throwable, const methodHandle& method = methodHandle());
688
689 // Programmatic access to stack trace
690 static void get_stack_trace_elements(int depth, Handle backtrace, objArrayHandle stack_trace, TRAPS);
691
692 // For recreating class initialization error exceptions.
693 static Handle create_initialization_error(JavaThread* current, Handle throwable);
694
695 // Printing
696 static void print(oop throwable, outputStream* st);
697 static void print_stack_trace(Handle throwable, outputStream* st);
698 static void java_printStackTrace(Handle throwable, TRAPS);
699 // Debugging
700 friend class JavaClasses;
701 // Gets the method and bci of the top frame (TOS). Returns false if this failed.
702 static bool get_top_method_and_bci(oop throwable, Method** method, int* bci);
703 };
704
705
706 // Interface to java.lang.reflect.AccessibleObject objects
707
708 class java_lang_reflect_AccessibleObject: AllStatic {
709 private:
710 // Note that to reduce dependencies on the JDK we compute these
814 static void set_signature(oop constructor, oop value);
815 static void set_annotations(oop constructor, oop value);
816 static void set_parameter_annotations(oop method, oop value);
817
818 // Debugging
819 friend class JavaClasses;
820 };
821
822
823 // Interface to java.lang.reflect.Field objects
824
825 class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
826 private:
827 // Note that to reduce dependencies on the JDK we compute these
828 // offsets at run-time.
829 static int _clazz_offset;
830 static int _name_offset;
831 static int _type_offset;
832 static int _slot_offset;
833 static int _modifiers_offset;
834 static int _trusted_final_offset;
835 static int _signature_offset;
836 static int _annotations_offset;
837
838 static void compute_offsets();
839
840 public:
841 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
842
843 // Allocation
844 static Handle create(TRAPS);
845
846 // Accessors
847 static oop clazz(oop reflect);
848 static void set_clazz(oop reflect, oop value);
849
850 static oop name(oop field);
851 static void set_name(oop field, oop value);
852
853 static oop type(oop field);
854 static void set_type(oop field, oop value);
855
856 static int slot(oop reflect);
857 static void set_slot(oop reflect, int value);
858
859 static int modifiers(oop field);
860 static void set_modifiers(oop field, int value);
861
862 static void set_trusted_final(oop field);
863
864 static void set_signature(oop constructor, oop value);
865 static void set_annotations(oop constructor, oop value);
866
867 // Debugging
868 friend class JavaClasses;
869 };
870
871 class java_lang_reflect_Parameter {
872 private:
873 // Note that to reduce dependencies on the JDK we compute these
874 // offsets at run-time.
875 static int _name_offset;
876 static int _modifiers_offset;
877 static int _index_offset;
878 static int _executable_offset;
879
880 static void compute_offsets();
881
882 public:
964
965 // Debugging
966 friend class JavaClasses;
967 };
968
969
970 // Interface to java.lang primitive type boxing objects:
971 // - java.lang.Boolean
972 // - java.lang.Character
973 // - java.lang.Float
974 // - java.lang.Double
975 // - java.lang.Byte
976 // - java.lang.Short
977 // - java.lang.Integer
978 // - java.lang.Long
979
980 // This could be separated out into 8 individual classes.
981
982 class java_lang_boxing_object: AllStatic {
983 private:
984 static int _value_offset;
985 static int _long_value_offset;
986
987 static void compute_offsets();
988 static oop initialize_and_allocate(BasicType type, TRAPS);
989 public:
990 // Allocation. Returns a boxed value, or null for invalid type.
991 static oop create(BasicType type, jvalue* value, TRAPS);
992 // Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.
993 static BasicType get_value(oop box, jvalue* value);
994 static BasicType set_value(oop box, jvalue* value);
995 static BasicType basic_type(oop box);
996 static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; }
997 static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }
998 static void print(oop box, outputStream* st) { jvalue value; print(get_value(box, &value), &value, st); }
999 static void print(BasicType type, jvalue* value, outputStream* st);
1000
1001 static int value_offset(BasicType type) {
1002 return is_double_word_type(type) ? _long_value_offset : _value_offset;
1003 }
1004
1005 static void serialize_offsets(SerializeClosure* f);
1006
1007 // Debugging
1008 friend class JavaClasses;
1009 };
1010
1011
1012
1013 // Interface to java.lang.ref.Reference objects
1014
1015 class java_lang_ref_Reference: AllStatic {
1016 static int _referent_offset;
1017 static int _queue_offset;
1018 static int _next_offset;
1019 static int _discovered_offset;
1020
1021 static bool _offsets_initialized;
1022
1182 };
1183
1184 class jdk_internal_foreign_abi_ABIDescriptor: AllStatic {
1185 friend class JavaClasses;
1186
1187 private:
1188 static int _inputStorage_offset;
1189 static int _outputStorage_offset;
1190 static int _volatileStorage_offset;
1191 static int _stackAlignment_offset;
1192 static int _shadowSpace_offset;
1193 static int _scratch1_offset;
1194 static int _scratch2_offset;
1195
1196 static void compute_offsets();
1197
1198 public:
1199 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1200
1201 // Accessors
1202 static objArrayOop inputStorage(oop entry);
1203 static objArrayOop outputStorage(oop entry);
1204 static objArrayOop volatileStorage(oop entry);
1205 static jint stackAlignment(oop entry);
1206 static jint shadowSpace(oop entry);
1207 static oop scratch1(oop entry);
1208 static oop scratch2(oop entry);
1209 };
1210
1211 class jdk_internal_foreign_abi_VMStorage: AllStatic {
1212 friend class JavaClasses;
1213
1214 private:
1215 static int _type_offset;
1216 static int _indexOrOffset_offset;
1217 static int _segmentMaskOrSize_offset;
1218 static int _debugName_offset;
1219
1220 static void compute_offsets();
1221
1222 public:
1223 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1224
1232 static bool is_subclass(Klass* klass) {
1233 return vmClasses::VMStorage_klass() != nullptr &&
1234 klass->is_subclass_of(vmClasses::VMStorage_klass());
1235 }
1236 static bool is_instance(oop obj);
1237 };
1238
1239 class jdk_internal_foreign_abi_CallConv: AllStatic {
1240 friend class JavaClasses;
1241
1242 private:
1243 static int _argRegs_offset;
1244 static int _retRegs_offset;
1245
1246 static void compute_offsets();
1247
1248 public:
1249 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1250
1251 // Accessors
1252 static objArrayOop argRegs(oop entry);
1253 static objArrayOop retRegs(oop entry);
1254
1255 // Testers
1256 static bool is_subclass(Klass* klass) {
1257 return vmClasses::CallConv_klass() != nullptr &&
1258 klass->is_subclass_of(vmClasses::CallConv_klass());
1259 }
1260 static bool is_instance(oop obj);
1261 };
1262
1263 // Interface to java.lang.invoke.MemberName objects
1264 // (These are a private interface for Java code to query the class hierarchy.)
1265
1266 #define RESOLVEDMETHOD_INJECTED_FIELDS(macro) \
1267 macro(java_lang_invoke_ResolvedMethodName, vmtarget, intptr_signature, false)
1268
1269 class java_lang_invoke_ResolvedMethodName : AllStatic {
1270 friend class JavaClasses;
1271
1272 static int _vmtarget_offset;
1273 static int _vmholder_offset;
1330 static void set_flags(oop mname, int flags);
1331
1332 // Link through ResolvedMethodName field to get Method*
1333 static Method* vmtarget(oop mname);
1334 static void set_method(oop mname, oop method);
1335
1336 static intptr_t vmindex(oop mname);
1337 static void set_vmindex(oop mname, intptr_t index);
1338
1339 // Testers
1340 static bool is_subclass(Klass* klass) {
1341 return klass->is_subclass_of(vmClasses::MemberName_klass());
1342 }
1343 static bool is_instance(oop obj);
1344
1345 static bool is_method(oop obj);
1346
1347 // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
1348 enum {
1349 MN_IS_METHOD = 0x00010000, // method (not constructor)
1350 MN_IS_CONSTRUCTOR = 0x00020000, // constructor
1351 MN_IS_FIELD = 0x00040000, // field
1352 MN_IS_TYPE = 0x00080000, // nested type
1353 MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected
1354 MN_TRUSTED_FINAL = 0x00200000, // trusted final field
1355 MN_HIDDEN_MEMBER = 0x00400000, // @Hidden annotation detected
1356 MN_REFERENCE_KIND_SHIFT = 24, // refKind
1357 MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
1358 MN_NESTMATE_CLASS = 0x00000001,
1359 MN_HIDDEN_CLASS = 0x00000002,
1360 MN_STRONG_LOADER_LINK = 0x00000004,
1361 MN_ACCESS_VM_ANNOTATIONS = 0x00000008,
1362 // Lookup modes
1363 MN_MODULE_MODE = 0x00000010,
1364 MN_UNCONDITIONAL_MODE = 0x00000020,
1365 MN_TRUSTED_MODE = -1
1366 };
1367
1368 // Accessors for code generation:
1369 static int clazz_offset() { CHECK_INIT(_clazz_offset); }
1370 static int type_offset() { CHECK_INIT(_type_offset); }
1371 static int flags_offset() { CHECK_INIT(_flags_offset); }
1372 static int method_offset() { CHECK_INIT(_method_offset); }
1373 static int vmindex_offset() { CHECK_INIT(_vmindex_offset); }
1374 };
1375
1376
1377 // Interface to java.lang.invoke.MethodType objects
1378
1379 class java_lang_invoke_MethodType: AllStatic {
1380 friend class JavaClasses;
1381
1382 private:
1383 static int _rtype_offset;
1384 static int _ptypes_offset;
1385
1386 static void compute_offsets();
1387
1388 public:
1389 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1390 // Accessors
1391 static oop rtype(oop mt);
1392 static objArrayOop ptypes(oop mt);
1393
1394 static oop ptype(oop mt, int index);
1395 static int ptype_count(oop mt);
1396
1397 static int ptype_slot_count(oop mt); // extra counts for long/double
1398 static int rtype_slot_count(oop mt); // extra counts for long/double
1399
1400 static Symbol* as_signature(oop mt, bool intern_if_not_found);
1401 static void print_signature(oop mt, outputStream* st);
1402
1403 static bool is_instance(oop obj);
1404
1405 static bool equals(oop mt1, oop mt2);
1406
1407 // Accessors for code generation:
1408 static int rtype_offset() { CHECK_INIT(_rtype_offset); }
1409 static int ptypes_offset() { CHECK_INIT(_ptypes_offset); }
1410 };
1411
1412
1797
1798 class java_lang_Boolean : AllStatic {
1799 private:
1800 static int _static_TRUE_offset;
1801 static int _static_FALSE_offset;
1802 public:
1803 static Symbol* symbol();
1804 static void compute_offsets(InstanceKlass* k);
1805 static oop get_TRUE(InstanceKlass *k);
1806 static oop get_FALSE(InstanceKlass *k);
1807 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1808 static jboolean value(oop obj);
1809 };
1810
1811 class java_lang_Integer_IntegerCache : AllStatic {
1812 private:
1813 static int _static_cache_offset;
1814 public:
1815 static Symbol* symbol();
1816 static void compute_offsets(InstanceKlass* k);
1817 static objArrayOop cache(InstanceKlass *k);
1818 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1819 };
1820
1821 class java_lang_Long_LongCache : AllStatic {
1822 private:
1823 static int _static_cache_offset;
1824 public:
1825 static Symbol* symbol();
1826 static void compute_offsets(InstanceKlass* k);
1827 static objArrayOop cache(InstanceKlass *k);
1828 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1829 };
1830
1831 class java_lang_Character_CharacterCache : AllStatic {
1832 private:
1833 static int _static_cache_offset;
1834 public:
1835 static Symbol* symbol();
1836 static void compute_offsets(InstanceKlass* k);
1837 static objArrayOop cache(InstanceKlass *k);
1838 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1839 };
1840
1841 class java_lang_Short_ShortCache : AllStatic {
1842 private:
1843 static int _static_cache_offset;
1844 public:
1845 static Symbol* symbol();
1846 static void compute_offsets(InstanceKlass* k);
1847 static objArrayOop cache(InstanceKlass *k);
1848 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1849 };
1850
1851 class java_lang_Byte_ByteCache : AllStatic {
1852 private:
1853 static int _static_cache_offset;
1854 public:
1855 static Symbol* symbol();
1856 static void compute_offsets(InstanceKlass* k);
1857 static objArrayOop cache(InstanceKlass *k);
1858 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1859 };
1860
1861
1862 // Interface to java.lang.InternalError objects
1863
1864 #define INTERNALERROR_INJECTED_FIELDS(macro) \
1865 macro(java_lang_InternalError, during_unsafe_access, bool_signature, false)
1866
1867 class java_lang_InternalError : AllStatic {
1868 private:
1869 static int _during_unsafe_access_offset;
1870 public:
1871 static jboolean during_unsafe_access(oop internal_error);
1872 static void set_during_unsafe_access(oop internal_error);
1873 static void compute_offsets();
1874 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1875 };
1876
1877 // Use to declare fields that need to be injected into Java classes
1878 // for the JVM to use. The name_index and signature_index are
1879 // declared in vmSymbols. The may_be_java flag is used to declare
1880 // fields that might already exist in Java but should be injected if
1881 // they don't. Otherwise the field is unconditionally injected and
|
235 friend class VMStructs;
236 friend class JVMCIVMStructs;
237 friend class HeapShared;
238
239 private:
240
241 // The fake offsets are added by the class loader when java.lang.Class is loaded
242
243 static int _klass_offset;
244 static int _array_klass_offset;
245
246 static int _oop_size_offset;
247 static int _static_oop_field_count_offset;
248
249 static int _protection_domain_offset;
250 static int _init_lock_offset;
251 static int _signers_offset;
252 static int _class_loader_offset;
253 static int _module_offset;
254 static int _component_mirror_offset;
255
256 static int _name_offset;
257 static int _source_file_offset;
258 static int _classData_offset;
259 static int _classRedefinedCount_offset;
260 static int _reflectionData_offset;
261 static int _modifiers_offset;
262 static int _is_primitive_offset;
263 static int _raw_access_flags_offset;
264
265 static bool _offsets_computed;
266
267 static GrowableArray<Klass*>* _fixup_mirror_list;
268 static GrowableArray<Klass*>* _fixup_module_field_list;
269
270 static void set_init_lock(oop java_class, oop init_lock);
271 static void set_protection_domain(oop java_class, oop protection_domain);
272 static void set_class_loader(oop java_class, oop class_loader);
273 static void set_component_mirror(oop java_class, oop comp_mirror);
274 static void initialize_mirror_fields(InstanceKlass* ik, Handle mirror, Handle protection_domain,
275 Handle classData, TRAPS);
304 // Conversion -- java_class must not be null. The return value is null only if java_class is a primitive type.
305 static Klass* as_Klass(oop java_class);
306 static InstanceKlass* as_InstanceKlass(oop java_class);
307
308 static void set_klass(oop java_class, Klass* klass);
309 static BasicType as_BasicType(oop java_class, Klass** reference_klass = nullptr);
310 static Symbol* as_signature(oop java_class, bool intern_if_not_found);
311 static void print_signature(oop java_class, outputStream *st);
312 static const char* as_external_name(oop java_class);
313 // Testing
314 static bool is_instance(oop obj);
315
316 static bool is_primitive(oop java_class);
317 static BasicType primitive_type(oop java_class);
318 static oop primitive_mirror(BasicType t);
319 static Klass* array_klass_acquire(oop java_class);
320
321 // compiler support for class operations
322 static int klass_offset() { CHECK_INIT(_klass_offset); }
323 static int array_klass_offset() { CHECK_INIT(_array_klass_offset); }
324
325 // Support for classRedefinedCount field
326 static int classRedefinedCount(oop the_class_mirror);
327 static void set_classRedefinedCount(oop the_class_mirror, int value);
328
329 // Support for embedded per-class oops
330 static oop protection_domain(oop java_class);
331 static oop init_lock(oop java_class);
332 static void clear_init_lock(oop java_class) {
333 set_init_lock(java_class, nullptr);
334 }
335 static oop component_mirror(oop java_class);
336 static int component_mirror_offset() { return _component_mirror_offset; }
337 static objArrayOop signers(oop java_class);
338 static oop class_data(oop java_class);
339 static void set_class_data(oop java_class, oop classData);
340 static int reflection_data_offset() { return _reflectionData_offset; }
341
342 static oop class_loader(oop java_class);
343 static void set_module(oop java_class, oop module);
344 static oop module(oop java_class);
646 trace_hidden_offset = 6,
647 trace_size = 7,
648 trace_chunk_size = 32
649 };
650
651 static int _backtrace_offset;
652 static int _detailMessage_offset;
653 static int _stackTrace_offset;
654 static int _depth_offset;
655 static int _cause_offset;
656 static int _static_unassigned_stacktrace_offset;
657
658 // StackTrace (programmatic access, new since 1.4)
659 static void clear_stacktrace(oop throwable);
660 // Stacktrace (post JDK 1.7.0 to allow immutability protocol to be followed)
661 static void set_stacktrace(oop throwable, oop st_element_array);
662 static oop unassigned_stacktrace();
663
664 public:
665 // Backtrace
666 static refArrayOop backtrace(oop throwable);
667 static void set_backtrace(oop throwable, refArrayOop value);
668 static int depth(oop throwable);
669 static void set_depth(oop throwable, int value);
670 // Message
671 static int get_detailMessage_offset() { CHECK_INIT(_detailMessage_offset); }
672 static oop message(oop throwable);
673 static const char* message_as_utf8(oop throwable);
674 static void set_message(oop throwable, oop value);
675
676 static oop cause(oop throwable);
677
678 static void print_stack_element(outputStream *st, Method* method, int bci);
679
680 static void compute_offsets();
681 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
682
683 // Allocate space for backtrace (created but stack trace not filled in)
684 static void allocate_backtrace(Handle throwable, TRAPS);
685 // Fill in current stack trace for throwable with preallocated backtrace (no GC)
686 static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
687 // Fill in current stack trace, can cause GC
688 static void fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS);
689 static void fill_in_stack_trace(Handle throwable, const methodHandle& method = methodHandle());
690
691 // Programmatic access to stack trace
692 static void get_stack_trace_elements(int depth, Handle backtrace, refArrayHandle stack_trace, TRAPS);
693
694 // For recreating class initialization error exceptions.
695 static Handle create_initialization_error(JavaThread* current, Handle throwable);
696
697 // Printing
698 static void print(oop throwable, outputStream* st);
699 static void print_stack_trace(Handle throwable, outputStream* st);
700 static void java_printStackTrace(Handle throwable, TRAPS);
701 // Debugging
702 friend class JavaClasses;
703 // Gets the method and bci of the top frame (TOS). Returns false if this failed.
704 static bool get_top_method_and_bci(oop throwable, Method** method, int* bci);
705 };
706
707
708 // Interface to java.lang.reflect.AccessibleObject objects
709
710 class java_lang_reflect_AccessibleObject: AllStatic {
711 private:
712 // Note that to reduce dependencies on the JDK we compute these
816 static void set_signature(oop constructor, oop value);
817 static void set_annotations(oop constructor, oop value);
818 static void set_parameter_annotations(oop method, oop value);
819
820 // Debugging
821 friend class JavaClasses;
822 };
823
824
825 // Interface to java.lang.reflect.Field objects
826
827 class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
828 private:
829 // Note that to reduce dependencies on the JDK we compute these
830 // offsets at run-time.
831 static int _clazz_offset;
832 static int _name_offset;
833 static int _type_offset;
834 static int _slot_offset;
835 static int _modifiers_offset;
836 static int _flags_offset;
837 static int _signature_offset;
838 static int _annotations_offset;
839
840 static void compute_offsets();
841
842 public:
843 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
844
845 // Allocation
846 static Handle create(TRAPS);
847
848 // Accessors
849 static oop clazz(oop reflect);
850 static void set_clazz(oop reflect, oop value);
851
852 static oop name(oop field);
853 static void set_name(oop field, oop value);
854
855 static oop type(oop field);
856 static void set_type(oop field, oop value);
857
858 static int slot(oop reflect);
859 static void set_slot(oop reflect, int value);
860
861 static int modifiers(oop field);
862 static void set_modifiers(oop field, int value);
863
864 static void set_flags(oop field, int value);
865
866 static void set_signature(oop constructor, oop value);
867 static void set_annotations(oop constructor, oop value);
868
869 // Debugging
870 friend class JavaClasses;
871 };
872
873 class java_lang_reflect_Parameter {
874 private:
875 // Note that to reduce dependencies on the JDK we compute these
876 // offsets at run-time.
877 static int _name_offset;
878 static int _modifiers_offset;
879 static int _index_offset;
880 static int _executable_offset;
881
882 static void compute_offsets();
883
884 public:
966
967 // Debugging
968 friend class JavaClasses;
969 };
970
971
972 // Interface to java.lang primitive type boxing objects:
973 // - java.lang.Boolean
974 // - java.lang.Character
975 // - java.lang.Float
976 // - java.lang.Double
977 // - java.lang.Byte
978 // - java.lang.Short
979 // - java.lang.Integer
980 // - java.lang.Long
981
982 // This could be separated out into 8 individual classes.
983
984 class java_lang_boxing_object: AllStatic {
985 private:
986 static int* _offsets;
987
988 static void compute_offsets();
989 static oop initialize_and_allocate(BasicType type, TRAPS);
990 public:
991 // Allocation. Returns a boxed value, or null for invalid type.
992 static oop create(BasicType type, jvalue* value, TRAPS);
993 // Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.
994 static BasicType get_value(oop box, jvalue* value);
995 static BasicType set_value(oop box, jvalue* value);
996 static BasicType basic_type(oop box);
997 static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; }
998 static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }
999 static void print(oop box, outputStream* st) { jvalue value; print(get_value(box, &value), &value, st); }
1000 static void print(BasicType type, jvalue* value, outputStream* st);
1001
1002 static int value_offset(BasicType type) {
1003 assert(type >= T_BOOLEAN && type <= T_LONG, "BasicType out of range");
1004 assert(_offsets != nullptr, "Uninitialized offsets");
1005 return _offsets[type - T_BOOLEAN];
1006 }
1007
1008 static void serialize_offsets(SerializeClosure* f);
1009
1010 // Debugging
1011 friend class JavaClasses;
1012 };
1013
1014
1015
1016 // Interface to java.lang.ref.Reference objects
1017
1018 class java_lang_ref_Reference: AllStatic {
1019 static int _referent_offset;
1020 static int _queue_offset;
1021 static int _next_offset;
1022 static int _discovered_offset;
1023
1024 static bool _offsets_initialized;
1025
1185 };
1186
1187 class jdk_internal_foreign_abi_ABIDescriptor: AllStatic {
1188 friend class JavaClasses;
1189
1190 private:
1191 static int _inputStorage_offset;
1192 static int _outputStorage_offset;
1193 static int _volatileStorage_offset;
1194 static int _stackAlignment_offset;
1195 static int _shadowSpace_offset;
1196 static int _scratch1_offset;
1197 static int _scratch2_offset;
1198
1199 static void compute_offsets();
1200
1201 public:
1202 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1203
1204 // Accessors
1205 static refArrayOop inputStorage(oop entry);
1206 static refArrayOop outputStorage(oop entry);
1207 static refArrayOop volatileStorage(oop entry);
1208 static jint stackAlignment(oop entry);
1209 static jint shadowSpace(oop entry);
1210 static oop scratch1(oop entry);
1211 static oop scratch2(oop entry);
1212 };
1213
1214 class jdk_internal_foreign_abi_VMStorage: AllStatic {
1215 friend class JavaClasses;
1216
1217 private:
1218 static int _type_offset;
1219 static int _indexOrOffset_offset;
1220 static int _segmentMaskOrSize_offset;
1221 static int _debugName_offset;
1222
1223 static void compute_offsets();
1224
1225 public:
1226 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1227
1235 static bool is_subclass(Klass* klass) {
1236 return vmClasses::VMStorage_klass() != nullptr &&
1237 klass->is_subclass_of(vmClasses::VMStorage_klass());
1238 }
1239 static bool is_instance(oop obj);
1240 };
1241
1242 class jdk_internal_foreign_abi_CallConv: AllStatic {
1243 friend class JavaClasses;
1244
1245 private:
1246 static int _argRegs_offset;
1247 static int _retRegs_offset;
1248
1249 static void compute_offsets();
1250
1251 public:
1252 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1253
1254 // Accessors
1255 static refArrayOop argRegs(oop entry);
1256 static refArrayOop retRegs(oop entry);
1257
1258 // Testers
1259 static bool is_subclass(Klass* klass) {
1260 return vmClasses::CallConv_klass() != nullptr &&
1261 klass->is_subclass_of(vmClasses::CallConv_klass());
1262 }
1263 static bool is_instance(oop obj);
1264 };
1265
1266 // Interface to java.lang.invoke.MemberName objects
1267 // (These are a private interface for Java code to query the class hierarchy.)
1268
1269 #define RESOLVEDMETHOD_INJECTED_FIELDS(macro) \
1270 macro(java_lang_invoke_ResolvedMethodName, vmtarget, intptr_signature, false)
1271
1272 class java_lang_invoke_ResolvedMethodName : AllStatic {
1273 friend class JavaClasses;
1274
1275 static int _vmtarget_offset;
1276 static int _vmholder_offset;
1333 static void set_flags(oop mname, int flags);
1334
1335 // Link through ResolvedMethodName field to get Method*
1336 static Method* vmtarget(oop mname);
1337 static void set_method(oop mname, oop method);
1338
1339 static intptr_t vmindex(oop mname);
1340 static void set_vmindex(oop mname, intptr_t index);
1341
1342 // Testers
1343 static bool is_subclass(Klass* klass) {
1344 return klass->is_subclass_of(vmClasses::MemberName_klass());
1345 }
1346 static bool is_instance(oop obj);
1347
1348 static bool is_method(oop obj);
1349
1350 // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
1351 enum {
1352 MN_IS_METHOD = 0x00010000, // method (not constructor)
1353 MN_IS_OBJECT_CONSTRUCTOR = 0x00020000, // constructor
1354 MN_IS_FIELD = 0x00040000, // field
1355 MN_IS_TYPE = 0x00080000, // nested type
1356 MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected
1357 MN_TRUSTED_FINAL = 0x00200000, // trusted final field
1358 MN_HIDDEN_MEMBER = 0x00400000, // @Hidden annotation detected
1359 MN_NULL_RESTRICTED_FIELD = 0x00800000, // null-restricted field
1360 MN_REFERENCE_KIND_SHIFT = 24, // refKind
1361 MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT, // 4 bits
1362 MN_LAYOUT_SHIFT = 28, // field layout
1363 MN_LAYOUT_MASK = 0x70000000 >> MN_LAYOUT_SHIFT, // 3 bits
1364 MN_NESTMATE_CLASS = 0x00000001,
1365 MN_HIDDEN_CLASS = 0x00000002,
1366 MN_STRONG_LOADER_LINK = 0x00000004,
1367 MN_ACCESS_VM_ANNOTATIONS = 0x00000008,
1368 // Lookup modes
1369 MN_MODULE_MODE = 0x00000010,
1370 MN_UNCONDITIONAL_MODE = 0x00000020,
1371 MN_TRUSTED_MODE = -1
1372 };
1373
1374 // Accessors for code generation:
1375 static int clazz_offset() { CHECK_INIT(_clazz_offset); }
1376 static int type_offset() { CHECK_INIT(_type_offset); }
1377 static int flags_offset() { CHECK_INIT(_flags_offset); }
1378 static int method_offset() { CHECK_INIT(_method_offset); }
1379 static int vmindex_offset() { CHECK_INIT(_vmindex_offset); }
1380 };
1381
1382
1383 // Interface to java.lang.invoke.MethodType objects
1384
1385 class java_lang_invoke_MethodType: AllStatic {
1386 friend class JavaClasses;
1387
1388 private:
1389 static int _rtype_offset;
1390 static int _ptypes_offset;
1391
1392 static void compute_offsets();
1393
1394 public:
1395 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1396 // Accessors
1397 static oop rtype(oop mt);
1398 static refArrayOop ptypes(oop mt);
1399
1400 static oop ptype(oop mt, int index);
1401 static int ptype_count(oop mt);
1402
1403 static int ptype_slot_count(oop mt); // extra counts for long/double
1404 static int rtype_slot_count(oop mt); // extra counts for long/double
1405
1406 static Symbol* as_signature(oop mt, bool intern_if_not_found);
1407 static void print_signature(oop mt, outputStream* st);
1408
1409 static bool is_instance(oop obj);
1410
1411 static bool equals(oop mt1, oop mt2);
1412
1413 // Accessors for code generation:
1414 static int rtype_offset() { CHECK_INIT(_rtype_offset); }
1415 static int ptypes_offset() { CHECK_INIT(_ptypes_offset); }
1416 };
1417
1418
1803
1804 class java_lang_Boolean : AllStatic {
1805 private:
1806 static int _static_TRUE_offset;
1807 static int _static_FALSE_offset;
1808 public:
1809 static Symbol* symbol();
1810 static void compute_offsets(InstanceKlass* k);
1811 static oop get_TRUE(InstanceKlass *k);
1812 static oop get_FALSE(InstanceKlass *k);
1813 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1814 static jboolean value(oop obj);
1815 };
1816
1817 class java_lang_Integer_IntegerCache : AllStatic {
1818 private:
1819 static int _static_cache_offset;
1820 public:
1821 static Symbol* symbol();
1822 static void compute_offsets(InstanceKlass* k);
1823 static refArrayOop cache(InstanceKlass *k);
1824 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1825 };
1826
1827 class java_lang_Long_LongCache : AllStatic {
1828 private:
1829 static int _static_cache_offset;
1830 public:
1831 static Symbol* symbol();
1832 static void compute_offsets(InstanceKlass* k);
1833 static refArrayOop cache(InstanceKlass *k);
1834 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1835 };
1836
1837 class java_lang_Character_CharacterCache : AllStatic {
1838 private:
1839 static int _static_cache_offset;
1840 public:
1841 static Symbol* symbol();
1842 static void compute_offsets(InstanceKlass* k);
1843 static refArrayOop cache(InstanceKlass *k);
1844 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1845 };
1846
1847 class java_lang_Short_ShortCache : AllStatic {
1848 private:
1849 static int _static_cache_offset;
1850 public:
1851 static Symbol* symbol();
1852 static void compute_offsets(InstanceKlass* k);
1853 static refArrayOop cache(InstanceKlass *k);
1854 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1855 };
1856
1857 class java_lang_Byte_ByteCache : AllStatic {
1858 private:
1859 static int _static_cache_offset;
1860 public:
1861 static Symbol* symbol();
1862 static void compute_offsets(InstanceKlass* k);
1863 static refArrayOop cache(InstanceKlass *k);
1864 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1865 };
1866
1867 // Interface to java.lang.InternalError objects
1868
1869 #define INTERNALERROR_INJECTED_FIELDS(macro) \
1870 macro(java_lang_InternalError, during_unsafe_access, bool_signature, false)
1871
1872 class java_lang_InternalError : AllStatic {
1873 private:
1874 static int _during_unsafe_access_offset;
1875 public:
1876 static jboolean during_unsafe_access(oop internal_error);
1877 static void set_during_unsafe_access(oop internal_error);
1878 static void compute_offsets();
1879 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1880 };
1881
1882 // Use to declare fields that need to be injected into Java classes
1883 // for the JVM to use. The name_index and signature_index are
1884 // declared in vmSymbols. The may_be_java flag is used to declare
1885 // fields that might already exist in Java but should be injected if
1886 // they don't. Otherwise the field is unconditionally injected and
|