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);
643 trace_hidden_offset = 6,
644 trace_size = 7,
645 trace_chunk_size = 32
646 };
647
648 static int _backtrace_offset;
649 static int _detailMessage_offset;
650 static int _stackTrace_offset;
651 static int _depth_offset;
652 static int _cause_offset;
653 static int _static_unassigned_stacktrace_offset;
654
655 // StackTrace (programmatic access, new since 1.4)
656 static void clear_stacktrace(oop throwable);
657 // Stacktrace (post JDK 1.7.0 to allow immutability protocol to be followed)
658 static void set_stacktrace(oop throwable, oop st_element_array);
659 static oop unassigned_stacktrace();
660
661 public:
662 // Backtrace
663 static oop backtrace(oop throwable);
664 static void set_backtrace(oop throwable, oop value);
665 static int depth(oop throwable);
666 static void set_depth(oop throwable, int value);
667 // Message
668 static int get_detailMessage_offset() { CHECK_INIT(_detailMessage_offset); }
669 static oop message(oop throwable);
670 static const char* message_as_utf8(oop throwable);
671 static void set_message(oop throwable, oop value);
672
673 static oop cause(oop throwable);
674
675 static void print_stack_element(outputStream *st, Method* method, int bci);
676
677 static void compute_offsets();
678 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
679
680 // Allocate space for backtrace (created but stack trace not filled in)
681 static void allocate_backtrace(Handle throwable, TRAPS);
682 // Fill in current stack trace for throwable with preallocated backtrace (no GC)
683 static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
684 // Fill in current stack trace, can cause GC
685 static void fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS);
686 static void fill_in_stack_trace(Handle throwable, const methodHandle& method = methodHandle());
687
688 // Programmatic access to stack trace
689 static void get_stack_trace_elements(int depth, Handle backtrace, objArrayHandle stack_trace, TRAPS);
690
691 // For recreating class initialization error exceptions.
692 static Handle create_initialization_error(JavaThread* current, Handle throwable);
693
694 // Printing
695 static void print(oop throwable, outputStream* st);
696 static void print_stack_trace(Handle throwable, outputStream* st);
697 static void java_printStackTrace(Handle throwable, TRAPS);
698 // Debugging
699 friend class JavaClasses;
700 // Gets the method and bci of the top frame (TOS). Returns false if this failed.
701 static bool get_top_method_and_bci(oop throwable, Method** method, int* bci);
702 };
703
704
705 // Interface to java.lang.reflect.AccessibleObject objects
706
707 class java_lang_reflect_AccessibleObject: AllStatic {
708 private:
709 // Note that to reduce dependencies on the JDK we compute these
817 // Debugging
818 friend class JavaClasses;
819 };
820
821 #if INCLUDE_JFR
822 #define FIELD_INJECTED_FIELDS(macro) \
823 macro(java_lang_reflect_Field, jfr_epoch, int_signature, false)
824 #endif // INCLUDE_JFR
825
826 // Interface to java.lang.reflect.Field objects
827
828 class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
829 private:
830 // Note that to reduce dependencies on the JDK we compute these
831 // offsets at run-time.
832 static int _clazz_offset;
833 static int _name_offset;
834 static int _type_offset;
835 static int _slot_offset;
836 static int _modifiers_offset;
837 static int _trusted_final_offset;
838 static int _signature_offset;
839 static int _annotations_offset;
840 JFR_ONLY(static int _jfr_epoch_offset;)
841
842 static void compute_offsets();
843
844 public:
845 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
846
847 // Allocation
848 static Handle create(TRAPS);
849
850 // Accessors
851 static oop clazz(oop reflect);
852 static void set_clazz(oop reflect, oop value);
853
854 static oop name(oop field);
855 static void set_name(oop field, oop value);
856
857 static oop type(oop field);
858 static void set_type(oop field, oop value);
859
860 static int slot(oop reflect);
861 static void set_slot(oop reflect, int value);
862
863 static int modifiers(oop field);
864 static void set_modifiers(oop field, int value);
865
866 static void set_trusted_final(oop field);
867
868 static void set_signature(oop constructor, oop value);
869 static void set_annotations(oop constructor, oop value);
870
871 JFR_ONLY(static u2 epoch(oop field);)
872 JFR_ONLY(static int epoch_offset() { CHECK_INIT(_jfr_epoch_offset); })
873
874 // Debugging
875 friend class JavaClasses;
876 };
877
878 class java_lang_reflect_Parameter {
879 private:
880 // Note that to reduce dependencies on the JDK we compute these
881 // offsets at run-time.
882 static int _name_offset;
883 static int _modifiers_offset;
884 static int _index_offset;
885 static int _executable_offset;
886
971
972 // Debugging
973 friend class JavaClasses;
974 };
975
976
977 // Interface to java.lang primitive type boxing objects:
978 // - java.lang.Boolean
979 // - java.lang.Character
980 // - java.lang.Float
981 // - java.lang.Double
982 // - java.lang.Byte
983 // - java.lang.Short
984 // - java.lang.Integer
985 // - java.lang.Long
986
987 // This could be separated out into 8 individual classes.
988
989 class java_lang_boxing_object: AllStatic {
990 private:
991 static int _value_offset;
992 static int _long_value_offset;
993
994 static void compute_offsets();
995 static oop initialize_and_allocate(BasicType type, TRAPS);
996 public:
997 // Allocation. Returns a boxed value, or null for invalid type.
998 static oop create(BasicType type, jvalue* value, TRAPS);
999 // Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.
1000 static BasicType get_value(oop box, jvalue* value);
1001 static BasicType set_value(oop box, jvalue* value);
1002 static BasicType basic_type(oop box);
1003 static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; }
1004 static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }
1005 static void print(oop box, outputStream* st) { jvalue value; print(get_value(box, &value), &value, st); }
1006 static void print(BasicType type, jvalue* value, outputStream* st);
1007
1008 static int value_offset(BasicType type) {
1009 return is_double_word_type(type) ? _long_value_offset : _value_offset;
1010 }
1011
1012 static void serialize_offsets(SerializeClosure* f);
1013
1014 // Debugging
1015 friend class JavaClasses;
1016 };
1017
1018
1019
1020 // Interface to java.lang.ref.Reference objects
1021
1022 class java_lang_ref_Reference: AllStatic {
1023 static int _referent_offset;
1024 static int _queue_offset;
1025 static int _next_offset;
1026 static int _discovered_offset;
1027
1028 static bool _offsets_initialized;
1029
1189 };
1190
1191 class jdk_internal_foreign_abi_ABIDescriptor: AllStatic {
1192 friend class JavaClasses;
1193
1194 private:
1195 static int _inputStorage_offset;
1196 static int _outputStorage_offset;
1197 static int _volatileStorage_offset;
1198 static int _stackAlignment_offset;
1199 static int _shadowSpace_offset;
1200 static int _scratch1_offset;
1201 static int _scratch2_offset;
1202
1203 static void compute_offsets();
1204
1205 public:
1206 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1207
1208 // Accessors
1209 static objArrayOop inputStorage(oop entry);
1210 static objArrayOop outputStorage(oop entry);
1211 static objArrayOop volatileStorage(oop entry);
1212 static jint stackAlignment(oop entry);
1213 static jint shadowSpace(oop entry);
1214 static oop scratch1(oop entry);
1215 static oop scratch2(oop entry);
1216 };
1217
1218 class jdk_internal_foreign_abi_VMStorage: AllStatic {
1219 friend class JavaClasses;
1220
1221 private:
1222 static int _type_offset;
1223 static int _indexOrOffset_offset;
1224 static int _segmentMaskOrSize_offset;
1225 static int _debugName_offset;
1226
1227 static void compute_offsets();
1228
1229 public:
1230 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1231
1239 static bool is_subclass(Klass* klass) {
1240 return vmClasses::VMStorage_klass() != nullptr &&
1241 klass->is_subclass_of(vmClasses::VMStorage_klass());
1242 }
1243 static bool is_instance(oop obj);
1244 };
1245
1246 class jdk_internal_foreign_abi_CallConv: AllStatic {
1247 friend class JavaClasses;
1248
1249 private:
1250 static int _argRegs_offset;
1251 static int _retRegs_offset;
1252
1253 static void compute_offsets();
1254
1255 public:
1256 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1257
1258 // Accessors
1259 static objArrayOop argRegs(oop entry);
1260 static objArrayOop retRegs(oop entry);
1261
1262 // Testers
1263 static bool is_subclass(Klass* klass) {
1264 return vmClasses::CallConv_klass() != nullptr &&
1265 klass->is_subclass_of(vmClasses::CallConv_klass());
1266 }
1267 static bool is_instance(oop obj);
1268 };
1269
1270 // Interface to java.lang.invoke.MemberName objects
1271 // (These are a private interface for Java code to query the class hierarchy.)
1272
1273 #define RESOLVEDMETHOD_INJECTED_FIELDS(macro) \
1274 macro(java_lang_invoke_ResolvedMethodName, vmtarget, intptr_signature, false)
1275
1276 class java_lang_invoke_ResolvedMethodName : AllStatic {
1277 friend class JavaClasses;
1278
1279 static int _vmtarget_offset;
1280 static int _vmholder_offset;
1337 static void set_flags(oop mname, int flags);
1338
1339 // Link through ResolvedMethodName field to get Method*
1340 static Method* vmtarget(oop mname);
1341 static void set_method(oop mname, oop method);
1342
1343 static intptr_t vmindex(oop mname);
1344 static void set_vmindex(oop mname, intptr_t index);
1345
1346 // Testers
1347 static bool is_subclass(Klass* klass) {
1348 return klass->is_subclass_of(vmClasses::MemberName_klass());
1349 }
1350 static bool is_instance(oop obj);
1351
1352 static bool is_method(oop obj);
1353
1354 // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
1355 enum {
1356 MN_IS_METHOD = 0x00010000, // method (not constructor)
1357 MN_IS_CONSTRUCTOR = 0x00020000, // constructor
1358 MN_IS_FIELD = 0x00040000, // field
1359 MN_IS_TYPE = 0x00080000, // nested type
1360 MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected
1361 MN_TRUSTED_FINAL = 0x00200000, // trusted final field
1362 MN_HIDDEN_MEMBER = 0x00400000, // @Hidden annotation detected
1363 MN_REFERENCE_KIND_SHIFT = 24, // refKind
1364 MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
1365 MN_NESTMATE_CLASS = 0x00000001,
1366 MN_HIDDEN_CLASS = 0x00000002,
1367 MN_STRONG_LOADER_LINK = 0x00000004,
1368 MN_ACCESS_VM_ANNOTATIONS = 0x00000008,
1369 // Lookup modes
1370 MN_MODULE_MODE = 0x00000010,
1371 MN_UNCONDITIONAL_MODE = 0x00000020,
1372 MN_TRUSTED_MODE = -1
1373 };
1374
1375 // Accessors for code generation:
1376 static int clazz_offset() { CHECK_INIT(_clazz_offset); }
1377 static int type_offset() { CHECK_INIT(_type_offset); }
1378 static int flags_offset() { CHECK_INIT(_flags_offset); }
1379 static int method_offset() { CHECK_INIT(_method_offset); }
1380 static int vmindex_offset() { CHECK_INIT(_vmindex_offset); }
1381 };
1382
1383
1384 // Interface to java.lang.invoke.MethodType objects
1385
1386 class java_lang_invoke_MethodType: AllStatic {
1387 friend class JavaClasses;
1388
1389 private:
1390 static int _rtype_offset;
1391 static int _ptypes_offset;
1392
1393 static void compute_offsets();
1394
1395 public:
1396 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1397 // Accessors
1398 static oop rtype(oop mt);
1399 static objArrayOop ptypes(oop mt);
1400
1401 static oop ptype(oop mt, int index);
1402 static int ptype_count(oop mt);
1403
1404 static int ptype_slot_count(oop mt); // extra counts for long/double
1405 static int rtype_slot_count(oop mt); // extra counts for long/double
1406
1407 static Symbol* as_signature(oop mt, bool intern_if_not_found);
1408 static void print_signature(oop mt, outputStream* st);
1409
1410 static bool is_instance(oop obj);
1411
1412 static bool equals(oop mt1, oop mt2);
1413
1414 // Accessors for code generation:
1415 static int rtype_offset() { CHECK_INIT(_rtype_offset); }
1416 static int ptypes_offset() { CHECK_INIT(_ptypes_offset); }
1417 };
1418
1419
1772 }
1773 static bool is_instance(oop obj);
1774 };
1775
1776 class java_lang_Boolean : AllStatic {
1777 private:
1778 static int _static_TRUE_offset;
1779 static int _static_FALSE_offset;
1780 public:
1781 static Symbol* symbol();
1782 static void compute_offsets(InstanceKlass* k);
1783 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1784 };
1785
1786 class java_lang_Integer_IntegerCache : AllStatic {
1787 private:
1788 static int _static_cache_offset;
1789 public:
1790 static Symbol* symbol();
1791 static void compute_offsets(InstanceKlass* k);
1792 static objArrayOop cache(InstanceKlass *k);
1793 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1794 };
1795
1796 class java_lang_Long_LongCache : AllStatic {
1797 private:
1798 static int _static_cache_offset;
1799 public:
1800 static Symbol* symbol();
1801 static void compute_offsets(InstanceKlass* k);
1802 static objArrayOop cache(InstanceKlass *k);
1803 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1804 };
1805
1806 class java_lang_Character_CharacterCache : AllStatic {
1807 private:
1808 static int _static_cache_offset;
1809 public:
1810 static Symbol* symbol();
1811 static void compute_offsets(InstanceKlass* k);
1812 static objArrayOop cache(InstanceKlass *k);
1813 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1814 };
1815
1816 class java_lang_Short_ShortCache : AllStatic {
1817 private:
1818 static int _static_cache_offset;
1819 public:
1820 static Symbol* symbol();
1821 static void compute_offsets(InstanceKlass* k);
1822 static objArrayOop cache(InstanceKlass *k);
1823 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1824 };
1825
1826 class java_lang_Byte_ByteCache : AllStatic {
1827 private:
1828 static int _static_cache_offset;
1829 public:
1830 static Symbol* symbol();
1831 static void compute_offsets(InstanceKlass* k);
1832 static objArrayOop cache(InstanceKlass *k);
1833 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1834 };
1835
1836
1837 // Interface to java.lang.InternalError objects
1838
1839 #define INTERNALERROR_INJECTED_FIELDS(macro) \
1840 macro(java_lang_InternalError, during_unsafe_access, bool_signature, false)
1841
1842 class java_lang_InternalError : AllStatic {
1843 private:
1844 static int _during_unsafe_access_offset;
1845 public:
1846 static jboolean during_unsafe_access(oop internal_error);
1847 static void set_during_unsafe_access(oop internal_error);
1848 static void compute_offsets();
1849 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1850 };
1851
1852 // Use to declare fields that need to be injected into Java classes
1853 // for the JVM to use. The name_index and signature_index are
1854 // declared in vmSymbols. The may_be_java flag is used to declare
1855 // fields that might already exist in Java but should be injected if
1856 // they don't. Otherwise the field is unconditionally injected and
|
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
324 // Support for classRedefinedCount field
325 static int classRedefinedCount(oop the_class_mirror);
326 static void set_classRedefinedCount(oop the_class_mirror, int value);
327
328 // Support for embedded per-class oops
329 static oop protection_domain(oop java_class);
330 static oop init_lock(oop java_class);
331 static void clear_init_lock(oop java_class) {
332 set_init_lock(java_class, nullptr);
333 }
334 static oop component_mirror(oop java_class);
335 static int component_mirror_offset() { return _component_mirror_offset; }
336 static objArrayOop signers(oop java_class);
337 static oop class_data(oop java_class);
338 static void set_class_data(oop java_class, oop classData);
339 static int reflection_data_offset() { return _reflectionData_offset; }
340
341 static oop class_loader(oop java_class);
342 static void set_module(oop java_class, oop module);
343 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 refArrayOop backtrace(oop throwable);
665 static void set_backtrace(oop throwable, refArrayOop 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, refArrayHandle 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
818 // Debugging
819 friend class JavaClasses;
820 };
821
822 #if INCLUDE_JFR
823 #define FIELD_INJECTED_FIELDS(macro) \
824 macro(java_lang_reflect_Field, jfr_epoch, int_signature, false)
825 #endif // INCLUDE_JFR
826
827 // Interface to java.lang.reflect.Field objects
828
829 class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
830 private:
831 // Note that to reduce dependencies on the JDK we compute these
832 // offsets at run-time.
833 static int _clazz_offset;
834 static int _name_offset;
835 static int _type_offset;
836 static int _slot_offset;
837 static int _modifiers_offset;
838 static int _flags_offset;
839 static int _signature_offset;
840 static int _annotations_offset;
841 JFR_ONLY(static int _jfr_epoch_offset;)
842
843 static void compute_offsets();
844
845 public:
846 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
847
848 // Allocation
849 static Handle create(TRAPS);
850
851 // Accessors
852 static oop clazz(oop reflect);
853 static void set_clazz(oop reflect, oop value);
854
855 static oop name(oop field);
856 static void set_name(oop field, oop value);
857
858 static oop type(oop field);
859 static void set_type(oop field, oop value);
860
861 static int slot(oop reflect);
862 static void set_slot(oop reflect, int value);
863
864 static int modifiers(oop field);
865 static void set_modifiers(oop field, int value);
866
867 static void set_flags(oop field, int value);
868
869 static void set_signature(oop constructor, oop value);
870 static void set_annotations(oop constructor, oop value);
871
872 JFR_ONLY(static u2 epoch(oop field);)
873 JFR_ONLY(static int epoch_offset() { CHECK_INIT(_jfr_epoch_offset); })
874
875 // Debugging
876 friend class JavaClasses;
877 };
878
879 class java_lang_reflect_Parameter {
880 private:
881 // Note that to reduce dependencies on the JDK we compute these
882 // offsets at run-time.
883 static int _name_offset;
884 static int _modifiers_offset;
885 static int _index_offset;
886 static int _executable_offset;
887
972
973 // Debugging
974 friend class JavaClasses;
975 };
976
977
978 // Interface to java.lang primitive type boxing objects:
979 // - java.lang.Boolean
980 // - java.lang.Character
981 // - java.lang.Float
982 // - java.lang.Double
983 // - java.lang.Byte
984 // - java.lang.Short
985 // - java.lang.Integer
986 // - java.lang.Long
987
988 // This could be separated out into 8 individual classes.
989
990 class java_lang_boxing_object: AllStatic {
991 private:
992 static int* _offsets;
993
994 static void compute_offsets();
995 static oop initialize_and_allocate(BasicType type, TRAPS);
996 public:
997 // Allocation. Returns a boxed value, or null for invalid type.
998 static oop create(BasicType type, jvalue* value, TRAPS);
999 // Accessors. Returns the basic type being boxed, or T_ILLEGAL for invalid oop.
1000 static BasicType get_value(oop box, jvalue* value);
1001 static BasicType set_value(oop box, jvalue* value);
1002 static BasicType basic_type(oop box);
1003 static bool is_instance(oop box) { return basic_type(box) != T_ILLEGAL; }
1004 static bool is_instance(oop box, BasicType type) { return basic_type(box) == type; }
1005 static void print(oop box, outputStream* st) { jvalue value; print(get_value(box, &value), &value, st); }
1006 static void print(BasicType type, jvalue* value, outputStream* st);
1007
1008 static int value_offset(BasicType type) {
1009 assert(type >= T_BOOLEAN && type <= T_LONG, "BasicType out of range");
1010 assert(_offsets != nullptr, "Uninitialized offsets");
1011 return _offsets[type - T_BOOLEAN];
1012 }
1013
1014 static void serialize_offsets(SerializeClosure* f);
1015
1016 // Debugging
1017 friend class JavaClasses;
1018 };
1019
1020
1021
1022 // Interface to java.lang.ref.Reference objects
1023
1024 class java_lang_ref_Reference: AllStatic {
1025 static int _referent_offset;
1026 static int _queue_offset;
1027 static int _next_offset;
1028 static int _discovered_offset;
1029
1030 static bool _offsets_initialized;
1031
1191 };
1192
1193 class jdk_internal_foreign_abi_ABIDescriptor: AllStatic {
1194 friend class JavaClasses;
1195
1196 private:
1197 static int _inputStorage_offset;
1198 static int _outputStorage_offset;
1199 static int _volatileStorage_offset;
1200 static int _stackAlignment_offset;
1201 static int _shadowSpace_offset;
1202 static int _scratch1_offset;
1203 static int _scratch2_offset;
1204
1205 static void compute_offsets();
1206
1207 public:
1208 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1209
1210 // Accessors
1211 static refArrayOop inputStorage(oop entry);
1212 static refArrayOop outputStorage(oop entry);
1213 static refArrayOop volatileStorage(oop entry);
1214 static jint stackAlignment(oop entry);
1215 static jint shadowSpace(oop entry);
1216 static oop scratch1(oop entry);
1217 static oop scratch2(oop entry);
1218 };
1219
1220 class jdk_internal_foreign_abi_VMStorage: AllStatic {
1221 friend class JavaClasses;
1222
1223 private:
1224 static int _type_offset;
1225 static int _indexOrOffset_offset;
1226 static int _segmentMaskOrSize_offset;
1227 static int _debugName_offset;
1228
1229 static void compute_offsets();
1230
1231 public:
1232 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1233
1241 static bool is_subclass(Klass* klass) {
1242 return vmClasses::VMStorage_klass() != nullptr &&
1243 klass->is_subclass_of(vmClasses::VMStorage_klass());
1244 }
1245 static bool is_instance(oop obj);
1246 };
1247
1248 class jdk_internal_foreign_abi_CallConv: AllStatic {
1249 friend class JavaClasses;
1250
1251 private:
1252 static int _argRegs_offset;
1253 static int _retRegs_offset;
1254
1255 static void compute_offsets();
1256
1257 public:
1258 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1259
1260 // Accessors
1261 static refArrayOop argRegs(oop entry);
1262 static refArrayOop retRegs(oop entry);
1263
1264 // Testers
1265 static bool is_subclass(Klass* klass) {
1266 return vmClasses::CallConv_klass() != nullptr &&
1267 klass->is_subclass_of(vmClasses::CallConv_klass());
1268 }
1269 static bool is_instance(oop obj);
1270 };
1271
1272 // Interface to java.lang.invoke.MemberName objects
1273 // (These are a private interface for Java code to query the class hierarchy.)
1274
1275 #define RESOLVEDMETHOD_INJECTED_FIELDS(macro) \
1276 macro(java_lang_invoke_ResolvedMethodName, vmtarget, intptr_signature, false)
1277
1278 class java_lang_invoke_ResolvedMethodName : AllStatic {
1279 friend class JavaClasses;
1280
1281 static int _vmtarget_offset;
1282 static int _vmholder_offset;
1339 static void set_flags(oop mname, int flags);
1340
1341 // Link through ResolvedMethodName field to get Method*
1342 static Method* vmtarget(oop mname);
1343 static void set_method(oop mname, oop method);
1344
1345 static intptr_t vmindex(oop mname);
1346 static void set_vmindex(oop mname, intptr_t index);
1347
1348 // Testers
1349 static bool is_subclass(Klass* klass) {
1350 return klass->is_subclass_of(vmClasses::MemberName_klass());
1351 }
1352 static bool is_instance(oop obj);
1353
1354 static bool is_method(oop obj);
1355
1356 // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
1357 enum {
1358 MN_IS_METHOD = 0x00010000, // method (not constructor)
1359 MN_IS_OBJECT_CONSTRUCTOR = 0x00020000, // constructor
1360 MN_IS_FIELD = 0x00040000, // field
1361 MN_IS_TYPE = 0x00080000, // nested type
1362 MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected
1363 MN_TRUSTED_FINAL = 0x00200000, // trusted final field
1364 MN_HIDDEN_MEMBER = 0x00400000, // @Hidden annotation detected
1365 MN_NULL_RESTRICTED_FIELD = 0x00800000, // null-restricted field
1366 MN_REFERENCE_KIND_SHIFT = 24, // refKind
1367 MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT, // 4 bits
1368 MN_LAYOUT_SHIFT = 28, // field layout
1369 MN_LAYOUT_MASK = 0x70000000 >> MN_LAYOUT_SHIFT, // 3 bits
1370 MN_NESTMATE_CLASS = 0x00000001,
1371 MN_HIDDEN_CLASS = 0x00000002,
1372 MN_STRONG_LOADER_LINK = 0x00000004,
1373 MN_ACCESS_VM_ANNOTATIONS = 0x00000008,
1374 // Lookup modes
1375 MN_MODULE_MODE = 0x00000010,
1376 MN_UNCONDITIONAL_MODE = 0x00000020,
1377 MN_TRUSTED_MODE = -1
1378 };
1379
1380 // Accessors for code generation:
1381 static int clazz_offset() { CHECK_INIT(_clazz_offset); }
1382 static int type_offset() { CHECK_INIT(_type_offset); }
1383 static int flags_offset() { CHECK_INIT(_flags_offset); }
1384 static int method_offset() { CHECK_INIT(_method_offset); }
1385 static int vmindex_offset() { CHECK_INIT(_vmindex_offset); }
1386 };
1387
1388
1389 // Interface to java.lang.invoke.MethodType objects
1390
1391 class java_lang_invoke_MethodType: AllStatic {
1392 friend class JavaClasses;
1393
1394 private:
1395 static int _rtype_offset;
1396 static int _ptypes_offset;
1397
1398 static void compute_offsets();
1399
1400 public:
1401 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1402 // Accessors
1403 static oop rtype(oop mt);
1404 static refArrayOop ptypes(oop mt);
1405
1406 static oop ptype(oop mt, int index);
1407 static int ptype_count(oop mt);
1408
1409 static int ptype_slot_count(oop mt); // extra counts for long/double
1410 static int rtype_slot_count(oop mt); // extra counts for long/double
1411
1412 static Symbol* as_signature(oop mt, bool intern_if_not_found);
1413 static void print_signature(oop mt, outputStream* st);
1414
1415 static bool is_instance(oop obj);
1416
1417 static bool equals(oop mt1, oop mt2);
1418
1419 // Accessors for code generation:
1420 static int rtype_offset() { CHECK_INIT(_rtype_offset); }
1421 static int ptypes_offset() { CHECK_INIT(_ptypes_offset); }
1422 };
1423
1424
1777 }
1778 static bool is_instance(oop obj);
1779 };
1780
1781 class java_lang_Boolean : AllStatic {
1782 private:
1783 static int _static_TRUE_offset;
1784 static int _static_FALSE_offset;
1785 public:
1786 static Symbol* symbol();
1787 static void compute_offsets(InstanceKlass* k);
1788 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1789 };
1790
1791 class java_lang_Integer_IntegerCache : AllStatic {
1792 private:
1793 static int _static_cache_offset;
1794 public:
1795 static Symbol* symbol();
1796 static void compute_offsets(InstanceKlass* k);
1797 static refArrayOop cache(InstanceKlass *k);
1798 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1799 };
1800
1801 class java_lang_Long_LongCache : AllStatic {
1802 private:
1803 static int _static_cache_offset;
1804 public:
1805 static Symbol* symbol();
1806 static void compute_offsets(InstanceKlass* k);
1807 static refArrayOop cache(InstanceKlass *k);
1808 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1809 };
1810
1811 class java_lang_Character_CharacterCache : AllStatic {
1812 private:
1813 static int _static_cache_offset;
1814 public:
1815 static Symbol* symbol();
1816 static void compute_offsets(InstanceKlass* k);
1817 static refArrayOop cache(InstanceKlass *k);
1818 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1819 };
1820
1821 class java_lang_Short_ShortCache : AllStatic {
1822 private:
1823 static int _static_cache_offset;
1824 public:
1825 static Symbol* symbol();
1826 static void compute_offsets(InstanceKlass* k);
1827 static refArrayOop cache(InstanceKlass *k);
1828 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1829 };
1830
1831 class java_lang_Byte_ByteCache : AllStatic {
1832 private:
1833 static int _static_cache_offset;
1834 public:
1835 static Symbol* symbol();
1836 static void compute_offsets(InstanceKlass* k);
1837 static refArrayOop cache(InstanceKlass *k);
1838 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1839 };
1840
1841 // Interface to java.lang.InternalError objects
1842
1843 #define INTERNALERROR_INJECTED_FIELDS(macro) \
1844 macro(java_lang_InternalError, during_unsafe_access, bool_signature, false)
1845
1846 class java_lang_InternalError : AllStatic {
1847 private:
1848 static int _during_unsafe_access_offset;
1849 public:
1850 static jboolean during_unsafe_access(oop internal_error);
1851 static void set_during_unsafe_access(oop internal_error);
1852 static void compute_offsets();
1853 static void serialize_offsets(SerializeClosure* f) NOT_CDS_RETURN;
1854 };
1855
1856 // Use to declare fields that need to be injected into Java classes
1857 // for the JVM to use. The name_index and signature_index are
1858 // declared in vmSymbols. The may_be_java flag is used to declare
1859 // fields that might already exist in Java but should be injected if
1860 // they don't. Otherwise the field is unconditionally injected and
|