57 static int count_offset; |
57 static int count_offset; |
58 static int hash_offset; |
58 static int hash_offset; |
59 |
59 |
60 static bool initialized; |
60 static bool initialized; |
61 |
61 |
62 static Handle basic_create(int length, bool tenured, TRAPS); |
62 static Handle basic_create(int length, TRAPS); |
63 static Handle basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS); |
|
64 |
63 |
65 static void set_value( oop string, typeArrayOop buffer) { |
64 static void set_value( oop string, typeArrayOop buffer) { |
66 assert(initialized, "Must be initialized"); |
65 assert(initialized, "Must be initialized"); |
67 string->obj_field_put(value_offset, (oop)buffer); |
66 string->obj_field_put(value_offset, (oop)buffer); |
68 } |
67 } |
82 public: |
81 public: |
83 static void compute_offsets(); |
82 static void compute_offsets(); |
84 |
83 |
85 // Instance creation |
84 // Instance creation |
86 static Handle create_from_unicode(jchar* unicode, int len, TRAPS); |
85 static Handle create_from_unicode(jchar* unicode, int len, TRAPS); |
87 static Handle create_tenured_from_unicode(jchar* unicode, int len, TRAPS); |
|
88 static oop create_oop_from_unicode(jchar* unicode, int len, TRAPS); |
86 static oop create_oop_from_unicode(jchar* unicode, int len, TRAPS); |
89 static Handle create_from_str(const char* utf8_str, TRAPS); |
87 static Handle create_from_str(const char* utf8_str, TRAPS); |
90 static oop create_oop_from_str(const char* utf8_str, TRAPS); |
88 static oop create_oop_from_str(const char* utf8_str, TRAPS); |
91 static Handle create_from_symbol(Symbol* symbol, TRAPS); |
89 static Handle create_from_symbol(Symbol* symbol, TRAPS); |
92 static Handle create_from_platform_dependent_str(const char* str, TRAPS); |
90 static Handle create_from_platform_dependent_str(const char* str, TRAPS); |
203 |
201 |
204 |
202 |
205 // Interface to java.lang.Class objects |
203 // Interface to java.lang.Class objects |
206 |
204 |
207 #define CLASS_INJECTED_FIELDS(macro) \ |
205 #define CLASS_INJECTED_FIELDS(macro) \ |
208 macro(java_lang_Class, klass, object_signature, false) \ |
206 macro(java_lang_Class, klass, intptr_signature, false) \ |
209 macro(java_lang_Class, resolved_constructor, object_signature, false) \ |
207 macro(java_lang_Class, resolved_constructor, intptr_signature, false) \ |
210 macro(java_lang_Class, array_klass, object_signature, false) \ |
208 macro(java_lang_Class, array_klass, intptr_signature, false) \ |
211 macro(java_lang_Class, oop_size, int_signature, false) \ |
209 macro(java_lang_Class, oop_size, int_signature, false) \ |
212 macro(java_lang_Class, static_oop_field_count, int_signature, false) |
210 macro(java_lang_Class, static_oop_field_count, int_signature, false) |
213 |
211 |
214 class java_lang_Class : AllStatic { |
212 class java_lang_Class : AllStatic { |
215 friend class VMStructs; |
213 friend class VMStructs; |
224 static int _oop_size_offset; |
222 static int _oop_size_offset; |
225 static int _static_oop_field_count_offset; |
223 static int _static_oop_field_count_offset; |
226 |
224 |
227 static bool offsets_computed; |
225 static bool offsets_computed; |
228 static int classRedefinedCount_offset; |
226 static int classRedefinedCount_offset; |
|
227 static GrowableArray<Klass*>* _fixup_mirror_list; |
229 |
228 |
230 public: |
229 public: |
231 static void compute_offsets(); |
230 static void compute_offsets(); |
232 |
231 |
233 // Instance creation |
232 // Instance creation |
234 static oop create_mirror(KlassHandle k, TRAPS); |
233 static oop create_mirror(KlassHandle k, TRAPS); |
235 static void fixup_mirror(KlassHandle k, TRAPS); |
234 static void fixup_mirror(KlassHandle k, TRAPS); |
236 static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); |
235 static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); |
237 // Conversion |
236 // Conversion |
238 static klassOop as_klassOop(oop java_class); |
237 static Klass* as_Klass(oop java_class); |
239 static void set_klass(oop java_class, klassOop klass); |
238 static void set_klass(oop java_class, Klass* klass); |
240 static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL); |
239 static BasicType as_BasicType(oop java_class, Klass** reference_klass = NULL); |
241 static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) { |
240 static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) { |
242 klassOop refk_oop = NULL; |
241 Klass* refk_oop = NULL; |
243 BasicType result = as_BasicType(java_class, &refk_oop); |
242 BasicType result = as_BasicType(java_class, &refk_oop); |
244 (*reference_klass) = KlassHandle(refk_oop); |
243 (*reference_klass) = KlassHandle(refk_oop); |
245 return result; |
244 return result; |
246 } |
245 } |
247 static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS); |
246 static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS); |
252 } |
251 } |
253 static bool is_primitive(oop java_class); |
252 static bool is_primitive(oop java_class); |
254 static BasicType primitive_type(oop java_class); |
253 static BasicType primitive_type(oop java_class); |
255 static oop primitive_mirror(BasicType t); |
254 static oop primitive_mirror(BasicType t); |
256 // JVM_NewInstance support |
255 // JVM_NewInstance support |
257 static methodOop resolved_constructor(oop java_class); |
256 static Method* resolved_constructor(oop java_class); |
258 static void set_resolved_constructor(oop java_class, methodOop constructor); |
257 static void set_resolved_constructor(oop java_class, Method* constructor); |
259 // JVM_NewArray support |
258 // JVM_NewArray support |
260 static klassOop array_klass(oop java_class); |
259 static Klass* array_klass(oop java_class); |
261 static void set_array_klass(oop java_class, klassOop klass); |
260 static void set_array_klass(oop java_class, Klass* klass); |
262 // compiler support for class operations |
261 // compiler support for class operations |
263 static int klass_offset_in_bytes() { return _klass_offset; } |
262 static int klass_offset_in_bytes() { return _klass_offset; } |
264 static int resolved_constructor_offset_in_bytes() { return _resolved_constructor_offset; } |
263 static int resolved_constructor_offset_in_bytes() { return _resolved_constructor_offset; } |
265 static int array_klass_offset_in_bytes() { return _array_klass_offset; } |
264 static int array_klass_offset_in_bytes() { return _array_klass_offset; } |
266 // Support for classRedefinedCount field |
265 // Support for classRedefinedCount field |
270 static int oop_size(oop java_class); |
269 static int oop_size(oop java_class); |
271 static void set_oop_size(oop java_class, int size); |
270 static void set_oop_size(oop java_class, int size); |
272 static int static_oop_field_count(oop java_class); |
271 static int static_oop_field_count(oop java_class); |
273 static void set_static_oop_field_count(oop java_class, int size); |
272 static void set_static_oop_field_count(oop java_class, int size); |
274 |
273 |
275 // Debugging |
274 static GrowableArray<Klass*>* fixup_mirror_list() { |
276 friend class JavaClasses; |
275 return _fixup_mirror_list; |
277 friend class instanceKlass; // verification code accesses offsets |
276 } |
|
277 static void set_fixup_mirror_list(GrowableArray<Klass*>* v) { |
|
278 _fixup_mirror_list = v; |
|
279 } |
|
280 // Debugging |
|
281 friend class JavaClasses; |
|
282 friend class InstanceKlass; // verification code accesses offsets |
278 friend class ClassFileParser; // access to number_of_fake_fields |
283 friend class ClassFileParser; // access to number_of_fake_fields |
279 }; |
284 }; |
280 |
285 |
281 // Interface to java.lang.Thread objects |
286 // Interface to java.lang.Thread objects |
282 |
287 |
447 }; |
452 }; |
448 // Trace constants |
453 // Trace constants |
449 enum { |
454 enum { |
450 trace_methods_offset = 0, |
455 trace_methods_offset = 0, |
451 trace_bcis_offset = 1, |
456 trace_bcis_offset = 1, |
452 trace_next_offset = 2, |
457 trace_mirrors_offset = 2, |
453 trace_size = 3, |
458 trace_next_offset = 3, |
|
459 trace_size = 4, |
454 trace_chunk_size = 32 |
460 trace_chunk_size = 32 |
455 }; |
461 }; |
456 |
462 |
457 static int backtrace_offset; |
463 static int backtrace_offset; |
458 static int detailMessage_offset; |
464 static int detailMessage_offset; |
459 static int cause_offset; |
465 static int cause_offset; |
460 static int stackTrace_offset; |
466 static int stackTrace_offset; |
461 static int static_unassigned_stacktrace_offset; |
467 static int static_unassigned_stacktrace_offset; |
462 |
468 |
463 // Printing |
469 // Printing |
464 static char* print_stack_element_to_buffer(methodOop method, int bci); |
470 static char* print_stack_element_to_buffer(Method* method, int bci); |
465 static void print_to_stream(Handle stream, const char* str); |
471 static void print_to_stream(Handle stream, const char* str); |
466 // StackTrace (programmatic access, new since 1.4) |
472 // StackTrace (programmatic access, new since 1.4) |
467 static void clear_stacktrace(oop throwable); |
473 static void clear_stacktrace(oop throwable); |
468 // No stack trace available |
474 // No stack trace available |
469 static const char* no_stack_trace_message(); |
475 static const char* no_stack_trace_message(); |
484 static void set_message(oop throwable, oop value); |
490 static void set_message(oop throwable, oop value); |
485 // Print stack trace stored in exception by call-back to Java |
491 // Print stack trace stored in exception by call-back to Java |
486 // Note: this is no longer used in Merlin, but we still suppport |
492 // Note: this is no longer used in Merlin, but we still suppport |
487 // it for compatibility. |
493 // it for compatibility. |
488 static void print_stack_trace(oop throwable, oop print_stream); |
494 static void print_stack_trace(oop throwable, oop print_stream); |
489 static void print_stack_element(Handle stream, methodOop method, int bci); |
495 static void print_stack_element(Handle stream, Method* method, int bci); |
490 static void print_stack_element(outputStream *st, methodOop method, int bci); |
496 static void print_stack_element(outputStream *st, Method* method, int bci); |
491 static void print_stack_usage(Handle stream); |
497 static void print_stack_usage(Handle stream); |
492 |
498 |
493 // Allocate space for backtrace (created but stack trace not filled in) |
499 // Allocate space for backtrace (created but stack trace not filled in) |
494 static void allocate_backtrace(Handle throwable, TRAPS); |
500 static void allocate_backtrace(Handle throwable, TRAPS); |
495 // Fill in current stack trace for throwable with preallocated backtrace (no GC) |
501 // Fill in current stack trace for throwable with preallocated backtrace (no GC) |
709 // Interface to sun.reflect.ConstantPool objects |
715 // Interface to sun.reflect.ConstantPool objects |
710 class sun_reflect_ConstantPool { |
716 class sun_reflect_ConstantPool { |
711 private: |
717 private: |
712 // Note that to reduce dependencies on the JDK we compute these |
718 // Note that to reduce dependencies on the JDK we compute these |
713 // offsets at run-time. |
719 // offsets at run-time. |
714 static int _cp_oop_offset; |
720 static int _oop_offset; |
715 |
721 |
716 static void compute_offsets(); |
722 static void compute_offsets(); |
717 |
723 |
718 public: |
724 public: |
719 // Allocation |
725 // Allocation |
720 static Handle create(TRAPS); |
726 static Handle create(TRAPS); |
721 |
727 |
722 // Accessors |
728 // Accessors |
723 static oop cp_oop(oop reflect); |
729 static void set_cp(oop reflect, ConstantPool* value); |
724 static void set_cp_oop(oop reflect, oop value); |
730 static int oop_offset() { |
725 static int cp_oop_offset() { |
731 return _oop_offset; |
726 return _cp_oop_offset; |
732 } |
727 } |
733 |
|
734 static ConstantPool* get_cp(oop reflect); |
728 |
735 |
729 // Debugging |
736 // Debugging |
730 friend class JavaClasses; |
737 friend class JavaClasses; |
731 }; |
738 }; |
732 |
739 |
901 |
909 |
902 static oop form(oop mh); |
910 static oop form(oop mh); |
903 static void set_form(oop mh, oop lform); |
911 static void set_form(oop mh, oop lform); |
904 |
912 |
905 // Testers |
913 // Testers |
906 static bool is_subclass(klassOop klass) { |
914 static bool is_subclass(Klass* klass) { |
907 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass()); |
915 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass()); |
908 } |
916 } |
909 static bool is_instance(oop obj) { |
917 static bool is_instance(oop obj) { |
910 return obj != NULL && is_subclass(obj->klass()); |
918 return obj != NULL && is_subclass(obj->klass()); |
911 } |
919 } |
930 // Accessors |
938 // Accessors |
931 static oop vmentry(oop lform); |
939 static oop vmentry(oop lform); |
932 static void set_vmentry(oop lform, oop invoker); |
940 static void set_vmentry(oop lform, oop invoker); |
933 |
941 |
934 // Testers |
942 // Testers |
935 static bool is_subclass(klassOop klass) { |
943 static bool is_subclass(Klass* klass) { |
936 return SystemDictionary::LambdaForm_klass() != NULL && |
944 return SystemDictionary::LambdaForm_klass() != NULL && |
937 Klass::cast(klass)->is_subclass_of(SystemDictionary::LambdaForm_klass()); |
945 Klass::cast(klass)->is_subclass_of(SystemDictionary::LambdaForm_klass()); |
938 } |
946 } |
939 static bool is_instance(oop obj) { |
947 static bool is_instance(oop obj) { |
940 return obj != NULL && is_subclass(obj->klass()); |
948 return obj != NULL && is_subclass(obj->klass()); |
947 |
955 |
948 // Interface to java.lang.invoke.MemberName objects |
956 // Interface to java.lang.invoke.MemberName objects |
949 // (These are a private interface for Java code to query the class hierarchy.) |
957 // (These are a private interface for Java code to query the class hierarchy.) |
950 |
958 |
951 #define MEMBERNAME_INJECTED_FIELDS(macro) \ |
959 #define MEMBERNAME_INJECTED_FIELDS(macro) \ |
|
960 macro(java_lang_invoke_MemberName, vmloader, object_signature, false) \ |
952 macro(java_lang_invoke_MemberName, vmindex, intptr_signature, false) \ |
961 macro(java_lang_invoke_MemberName, vmindex, intptr_signature, false) \ |
953 macro(java_lang_invoke_MemberName, vmtarget, object_signature, false) |
962 macro(java_lang_invoke_MemberName, vmtarget, intptr_signature, false) |
954 |
963 |
955 class java_lang_invoke_MemberName: AllStatic { |
964 class java_lang_invoke_MemberName: AllStatic { |
956 friend class JavaClasses; |
965 friend class JavaClasses; |
957 |
966 |
958 private: |
967 private: |
959 // From java.lang.invoke.MemberName: |
968 // From java.lang.invoke.MemberName: |
960 // private Class<?> clazz; // class in which the method is defined |
969 // private Class<?> clazz; // class in which the method is defined |
961 // private String name; // may be null if not yet materialized |
970 // private String name; // may be null if not yet materialized |
962 // private Object type; // may be null if not yet materialized |
971 // private Object type; // may be null if not yet materialized |
963 // private int flags; // modifier bits; see reflect.Modifier |
972 // private int flags; // modifier bits; see reflect.Modifier |
964 // private Object vmtarget; // VM-specific target value |
973 // private intptr vmtarget; // VM-specific target value |
965 // private intptr_t vmindex; // member index within class or interface |
974 // private intptr_t vmindex; // member index within class or interface |
966 static int _clazz_offset; |
975 static int _clazz_offset; |
967 static int _name_offset; |
976 static int _name_offset; |
968 static int _type_offset; |
977 static int _type_offset; |
969 static int _flags_offset; |
978 static int _flags_offset; |
970 static int _vmtarget_offset; |
979 static int _vmtarget_offset; |
|
980 static int _vmloader_offset; |
971 static int _vmindex_offset; |
981 static int _vmindex_offset; |
972 |
982 |
973 static void compute_offsets(); |
983 static void compute_offsets(); |
974 |
984 |
975 public: |
985 public: |
984 static void set_name(oop mname, oop name); |
994 static void set_name(oop mname, oop name); |
985 |
995 |
986 static int flags(oop mname); |
996 static int flags(oop mname); |
987 static void set_flags(oop mname, int flags); |
997 static void set_flags(oop mname, int flags); |
988 |
998 |
989 static oop vmtarget(oop mname); |
999 static Metadata* vmtarget(oop mname); |
990 static void set_vmtarget(oop mname, oop target); |
1000 static void set_vmtarget(oop mname, Metadata* target); |
991 |
1001 |
992 static intptr_t vmindex(oop mname); |
1002 static intptr_t vmindex(oop mname); |
993 static void set_vmindex(oop mname, intptr_t index); |
1003 static void set_vmindex(oop mname, intptr_t index); |
994 |
1004 |
995 // Testers |
1005 // Testers |
996 static bool is_subclass(klassOop klass) { |
1006 static bool is_subclass(Klass* klass) { |
997 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MemberName_klass()); |
1007 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MemberName_klass()); |
998 } |
1008 } |
999 static bool is_instance(oop obj) { |
1009 static bool is_instance(oop obj) { |
1000 return obj != NULL && is_subclass(obj->klass()); |
1010 return obj != NULL && is_subclass(obj->klass()); |
1001 } |
1011 } |
1077 |
1087 |
1078 static volatile oop target_volatile(oop site) { return site->obj_field_volatile( _target_offset); } |
1088 static volatile oop target_volatile(oop site) { return site->obj_field_volatile( _target_offset); } |
1079 static void set_target_volatile(oop site, oop target) { site->obj_field_put_volatile(_target_offset, target); } |
1089 static void set_target_volatile(oop site, oop target) { site->obj_field_put_volatile(_target_offset, target); } |
1080 |
1090 |
1081 // Testers |
1091 // Testers |
1082 static bool is_subclass(klassOop klass) { |
1092 static bool is_subclass(Klass* klass) { |
1083 return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass()); |
1093 return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass()); |
1084 } |
1094 } |
1085 static bool is_instance(oop obj) { |
1095 static bool is_instance(oop obj) { |
1086 return obj != NULL && is_subclass(obj->klass()); |
1096 return obj != NULL && is_subclass(obj->klass()); |
1087 } |
1097 } |
1110 }; |
1120 }; |
1111 |
1121 |
1112 |
1122 |
1113 // Interface to java.lang.ClassLoader objects |
1123 // Interface to java.lang.ClassLoader objects |
1114 |
1124 |
|
1125 #define CLASSLOADER_INJECTED_FIELDS(macro) \ |
|
1126 macro(java_lang_ClassLoader, loader_data, intptr_signature, false) \ |
|
1127 macro(java_lang_ClassLoader, dependencies, object_signature, false) |
|
1128 |
1115 class java_lang_ClassLoader : AllStatic { |
1129 class java_lang_ClassLoader : AllStatic { |
1116 private: |
1130 private: |
|
1131 // The fake offsets are added by the class loader when java.lang.Class is loaded |
1117 enum { |
1132 enum { |
1118 hc_parent_offset = 0 |
1133 hc_parent_offset = 0 |
1119 }; |
1134 }; |
1120 |
1135 static int _loader_data_offset; |
|
1136 static int _dependencies_offset; |
1121 static bool offsets_computed; |
1137 static bool offsets_computed; |
1122 static int parent_offset; |
1138 static int parent_offset; |
1123 static int parallelCapable_offset; |
1139 static int parallelCapable_offset; |
1124 |
1140 |
1125 static void compute_offsets(); |
1141 public: |
1126 |
1142 static void compute_offsets(); |
1127 public: |
1143 |
|
1144 static ClassLoaderData** loader_data_addr(oop loader); |
|
1145 static ClassLoaderData* loader_data(oop loader); |
|
1146 |
|
1147 static oop dependencies(oop loader); |
|
1148 static HeapWord* dependencies_addr(oop loader); |
|
1149 |
1128 static oop parent(oop loader); |
1150 static oop parent(oop loader); |
1129 static bool isAncestor(oop loader, oop cl); |
1151 static bool isAncestor(oop loader, oop cl); |
1130 |
1152 |
1131 // Support for parallelCapable field |
1153 // Support for parallelCapable field |
1132 static bool parallelCapable(oop the_class_mirror); |
1154 static bool parallelCapable(oop the_class_mirror); |
1135 |
1157 |
1136 // Fix for 4474172 |
1158 // Fix for 4474172 |
1137 static oop non_reflection_class_loader(oop loader); |
1159 static oop non_reflection_class_loader(oop loader); |
1138 |
1160 |
1139 // Testers |
1161 // Testers |
1140 static bool is_subclass(klassOop klass) { |
1162 static bool is_subclass(Klass* klass) { |
1141 return Klass::cast(klass)->is_subclass_of(SystemDictionary::ClassLoader_klass()); |
1163 return Klass::cast(klass)->is_subclass_of(SystemDictionary::ClassLoader_klass()); |
1142 } |
1164 } |
1143 static bool is_instance(oop obj) { |
1165 static bool is_instance(oop obj) { |
1144 return obj != NULL && is_subclass(obj->klass()); |
1166 return obj != NULL && is_subclass(obj->klass()); |
1145 } |
1167 } |
1146 |
1168 |
1147 // Debugging |
1169 // Debugging |
1148 friend class JavaClasses; |
1170 friend class JavaClasses; |
|
1171 friend class ClassFileParser; // access to number_of_fake_fields |
1149 }; |
1172 }; |
1150 |
1173 |
1151 |
1174 |
1152 // Interface to java.lang.System objects |
1175 // Interface to java.lang.System objects |
1153 |
1176 |
1266 const vmSymbols::SID name_index; |
1289 const vmSymbols::SID name_index; |
1267 const vmSymbols::SID signature_index; |
1290 const vmSymbols::SID signature_index; |
1268 const bool may_be_java; |
1291 const bool may_be_java; |
1269 |
1292 |
1270 |
1293 |
1271 klassOop klass() const { return SystemDictionary::well_known_klass(klass_id); } |
1294 Klass* klass() const { return SystemDictionary::well_known_klass(klass_id); } |
1272 Symbol* name() const { return lookup_symbol(name_index); } |
1295 Symbol* name() const { return lookup_symbol(name_index); } |
1273 Symbol* signature() const { return lookup_symbol(signature_index); } |
1296 Symbol* signature() const { return lookup_symbol(signature_index); } |
1274 |
1297 |
1275 int compute_offset(); |
1298 int compute_offset(); |
1276 |
1299 |
1283 #define DECLARE_INJECTED_FIELD_ENUM(klass, name, signature, may_be_java) \ |
1306 #define DECLARE_INJECTED_FIELD_ENUM(klass, name, signature, may_be_java) \ |
1284 klass##_##name##_enum, |
1307 klass##_##name##_enum, |
1285 |
1308 |
1286 #define ALL_INJECTED_FIELDS(macro) \ |
1309 #define ALL_INJECTED_FIELDS(macro) \ |
1287 CLASS_INJECTED_FIELDS(macro) \ |
1310 CLASS_INJECTED_FIELDS(macro) \ |
|
1311 CLASSLOADER_INJECTED_FIELDS(macro) \ |
1288 MEMBERNAME_INJECTED_FIELDS(macro) |
1312 MEMBERNAME_INJECTED_FIELDS(macro) |
1289 |
1313 |
1290 // Interface to hard-coded offset checking |
1314 // Interface to hard-coded offset checking |
1291 |
1315 |
1292 class JavaClasses : AllStatic { |
1316 class JavaClasses : AllStatic { |