Mercurial > hg > truffle
comparison src/share/vm/classfile/javaClasses.hpp @ 3938:e6b1331a51d2
7086585: make Java field injection more flexible
Reviewed-by: jrose, twisti, kvn, coleenp
author | never |
---|---|
date | Sat, 10 Sep 2011 17:29:02 -0700 |
parents | b0efc7ee3b31 |
children | e5928e7dab26 |
comparison
equal
deleted
inserted
replaced
3937:c565834fb592 | 3938:e6b1331a51d2 |
---|---|
154 }; | 154 }; |
155 | 155 |
156 | 156 |
157 // Interface to java.lang.Class objects | 157 // Interface to java.lang.Class objects |
158 | 158 |
159 #define CLASS_INJECTED_FIELDS(macro) \ | |
160 macro(java_lang_Class, klass, object_signature, false) \ | |
161 macro(java_lang_Class, resolved_constructor, object_signature, false) \ | |
162 macro(java_lang_Class, array_klass, object_signature, false) \ | |
163 macro(java_lang_Class, oop_size, int_signature, false) \ | |
164 macro(java_lang_Class, static_oop_field_count, int_signature, false) | |
165 | |
159 class java_lang_Class : AllStatic { | 166 class java_lang_Class : AllStatic { |
160 friend class VMStructs; | 167 friend class VMStructs; |
168 | |
161 private: | 169 private: |
162 // The fake offsets are added by the class loader when java.lang.Class is loaded | 170 // The fake offsets are added by the class loader when java.lang.Class is loaded |
163 | 171 |
164 enum { | 172 static int _klass_offset; |
165 hc_number_of_fake_oop_fields = 3, | 173 static int _resolved_constructor_offset; |
166 hc_number_of_fake_int_fields = 2 | 174 static int _array_klass_offset; |
167 }; | 175 |
168 | 176 static int _oop_size_offset; |
169 static int klass_offset; | 177 static int _static_oop_field_count_offset; |
170 static int resolved_constructor_offset; | 178 |
171 static int array_klass_offset; | |
172 static int number_of_fake_oop_fields; | |
173 | |
174 static int oop_size_offset; | |
175 static int static_oop_field_count_offset; | |
176 | |
177 static void compute_offsets(); | |
178 static bool offsets_computed; | 179 static bool offsets_computed; |
179 static int classRedefinedCount_offset; | 180 static int classRedefinedCount_offset; |
180 static int parallelCapable_offset; | 181 |
181 | 182 public: |
182 public: | 183 static void compute_offsets(); |
184 | |
183 // Instance creation | 185 // Instance creation |
184 static oop create_mirror(KlassHandle k, TRAPS); | 186 static oop create_mirror(KlassHandle k, TRAPS); |
185 static void fixup_mirror(KlassHandle k, TRAPS); | 187 static void fixup_mirror(KlassHandle k, TRAPS); |
186 static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); | 188 static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); |
187 // Conversion | 189 // Conversion |
207 static void set_resolved_constructor(oop java_class, methodOop constructor); | 209 static void set_resolved_constructor(oop java_class, methodOop constructor); |
208 // JVM_NewArray support | 210 // JVM_NewArray support |
209 static klassOop array_klass(oop java_class); | 211 static klassOop array_klass(oop java_class); |
210 static void set_array_klass(oop java_class, klassOop klass); | 212 static void set_array_klass(oop java_class, klassOop klass); |
211 // compiler support for class operations | 213 // compiler support for class operations |
212 static int klass_offset_in_bytes() { return klass_offset; } | 214 static int klass_offset_in_bytes() { return _klass_offset; } |
213 static int resolved_constructor_offset_in_bytes() { return resolved_constructor_offset; } | 215 static int resolved_constructor_offset_in_bytes() { return _resolved_constructor_offset; } |
214 static int array_klass_offset_in_bytes() { return array_klass_offset; } | 216 static int array_klass_offset_in_bytes() { return _array_klass_offset; } |
215 // Support for classRedefinedCount field | 217 // Support for classRedefinedCount field |
216 static int classRedefinedCount(oop the_class_mirror); | 218 static int classRedefinedCount(oop the_class_mirror); |
217 static void set_classRedefinedCount(oop the_class_mirror, int value); | 219 static void set_classRedefinedCount(oop the_class_mirror, int value); |
218 // Support for parallelCapable field | |
219 static bool parallelCapable(oop the_class_mirror); | |
220 | 220 |
221 static int oop_size(oop java_class); | 221 static int oop_size(oop java_class); |
222 static void set_oop_size(oop java_class, int size); | 222 static void set_oop_size(oop java_class, int size); |
223 static int static_oop_field_count(oop java_class); | 223 static int static_oop_field_count(oop java_class); |
224 static void set_static_oop_field_count(oop java_class, int size); | 224 static void set_static_oop_field_count(oop java_class, int size); |
832 }; | 832 }; |
833 | 833 |
834 | 834 |
835 // Interface to java.lang.invoke.MethodHandle objects | 835 // Interface to java.lang.invoke.MethodHandle objects |
836 | 836 |
837 #define METHODHANDLE_INJECTED_FIELDS(macro) \ | |
838 macro(java_lang_invoke_MethodHandle, vmentry, intptr_signature, false) \ | |
839 macro(java_lang_invoke_MethodHandle, vmtarget, object_signature, true) | |
840 | |
837 class MethodHandleEntry; | 841 class MethodHandleEntry; |
838 | 842 |
839 class java_lang_invoke_MethodHandle: AllStatic { | 843 class java_lang_invoke_MethodHandle: AllStatic { |
840 friend class JavaClasses; | 844 friend class JavaClasses; |
841 | 845 |
842 private: | 846 private: |
843 static int _vmentry_offset; // assembly code trampoline for MH | 847 static int _vmentry_offset; // assembly code trampoline for MH |
844 static int _vmtarget_offset; // class-specific target reference | 848 static int _vmtarget_offset; // class-specific target reference |
845 static int _type_offset; // the MethodType of this MH | 849 static int _type_offset; // the MethodType of this MH |
846 static int _vmslots_offset; // OPTIONAL hoisted type.form.vmslots | |
847 | 850 |
848 static void compute_offsets(); | 851 static void compute_offsets(); |
849 | 852 |
850 public: | 853 public: |
851 // Accessors | 854 // Accessors |
857 | 860 |
858 static MethodHandleEntry* vmentry(oop mh); | 861 static MethodHandleEntry* vmentry(oop mh); |
859 static void set_vmentry(oop mh, MethodHandleEntry* data); | 862 static void set_vmentry(oop mh, MethodHandleEntry* data); |
860 | 863 |
861 static int vmslots(oop mh); | 864 static int vmslots(oop mh); |
862 static void init_vmslots(oop mh); | |
863 static int compute_vmslots(oop mh); | |
864 | 865 |
865 // Testers | 866 // Testers |
866 static bool is_subclass(klassOop klass) { | 867 static bool is_subclass(klassOop klass) { |
867 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass()); | 868 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass()); |
868 } | 869 } |
872 | 873 |
873 // Accessors for code generation: | 874 // Accessors for code generation: |
874 static int type_offset_in_bytes() { return _type_offset; } | 875 static int type_offset_in_bytes() { return _type_offset; } |
875 static int vmtarget_offset_in_bytes() { return _vmtarget_offset; } | 876 static int vmtarget_offset_in_bytes() { return _vmtarget_offset; } |
876 static int vmentry_offset_in_bytes() { return _vmentry_offset; } | 877 static int vmentry_offset_in_bytes() { return _vmentry_offset; } |
877 static int vmslots_offset_in_bytes() { return _vmslots_offset; } | 878 }; |
878 }; | 879 |
880 #define DIRECTMETHODHANDLE_INJECTED_FIELDS(macro) \ | |
881 macro(java_lang_invoke_DirectMethodHandle, vmindex, int_signature, true) | |
879 | 882 |
880 class java_lang_invoke_DirectMethodHandle: public java_lang_invoke_MethodHandle { | 883 class java_lang_invoke_DirectMethodHandle: public java_lang_invoke_MethodHandle { |
881 friend class JavaClasses; | 884 friend class JavaClasses; |
882 | 885 |
883 private: | 886 private: |
884 // _vmtarget_offset; // method or class or interface | |
885 static int _vmindex_offset; // negative or vtable idx or itable idx | 887 static int _vmindex_offset; // negative or vtable idx or itable idx |
886 static void compute_offsets(); | 888 static void compute_offsets(); |
887 | 889 |
888 public: | 890 public: |
889 // Accessors | 891 // Accessors |
1010 | 1012 |
1011 | 1013 |
1012 // Interface to java.lang.invoke.MemberName objects | 1014 // Interface to java.lang.invoke.MemberName objects |
1013 // (These are a private interface for Java code to query the class hierarchy.) | 1015 // (These are a private interface for Java code to query the class hierarchy.) |
1014 | 1016 |
1017 #define MEMBERNAME_INJECTED_FIELDS(macro) \ | |
1018 macro(java_lang_invoke_MemberName, vmtarget, object_signature, true) | |
1019 | |
1015 class java_lang_invoke_MemberName: AllStatic { | 1020 class java_lang_invoke_MemberName: AllStatic { |
1016 friend class JavaClasses; | 1021 friend class JavaClasses; |
1017 | 1022 |
1018 private: | 1023 private: |
1019 // From java.lang.invoke.MemberName: | 1024 // From java.lang.invoke.MemberName: |
1119 static int rtype_offset_in_bytes() { return _rtype_offset; } | 1124 static int rtype_offset_in_bytes() { return _rtype_offset; } |
1120 static int ptypes_offset_in_bytes() { return _ptypes_offset; } | 1125 static int ptypes_offset_in_bytes() { return _ptypes_offset; } |
1121 static int form_offset_in_bytes() { return _form_offset; } | 1126 static int form_offset_in_bytes() { return _form_offset; } |
1122 }; | 1127 }; |
1123 | 1128 |
1129 #define METHODTYPEFORM_INJECTED_FIELDS(macro) \ | |
1130 macro(java_lang_invoke_MethodTypeForm, vmslots, int_signature, true) \ | |
1131 macro(java_lang_invoke_MethodTypeForm, vmlayout, object_signature, true) | |
1132 | |
1124 class java_lang_invoke_MethodTypeForm: AllStatic { | 1133 class java_lang_invoke_MethodTypeForm: AllStatic { |
1125 friend class JavaClasses; | 1134 friend class JavaClasses; |
1126 | 1135 |
1127 private: | 1136 private: |
1128 static int _vmslots_offset; // number of argument slots needed | 1137 static int _vmslots_offset; // number of argument slots needed |
1133 static void compute_offsets(); | 1142 static void compute_offsets(); |
1134 | 1143 |
1135 public: | 1144 public: |
1136 // Accessors | 1145 // Accessors |
1137 static int vmslots(oop mtform); | 1146 static int vmslots(oop mtform); |
1147 static void set_vmslots(oop mtform, int vmslots); | |
1148 | |
1138 static oop erasedType(oop mtform); | 1149 static oop erasedType(oop mtform); |
1139 static oop genericInvoker(oop mtform); | 1150 static oop genericInvoker(oop mtform); |
1140 | 1151 |
1141 static oop vmlayout(oop mtform); | 1152 static oop vmlayout(oop mtform); |
1142 static oop init_vmlayout(oop mtform, oop cookie); | 1153 static oop init_vmlayout(oop mtform, oop cookie); |
1154 class java_lang_invoke_CallSite: AllStatic { | 1165 class java_lang_invoke_CallSite: AllStatic { |
1155 friend class JavaClasses; | 1166 friend class JavaClasses; |
1156 | 1167 |
1157 private: | 1168 private: |
1158 static int _target_offset; | 1169 static int _target_offset; |
1159 static int _caller_method_offset; | |
1160 static int _caller_bci_offset; | |
1161 | 1170 |
1162 static void compute_offsets(); | 1171 static void compute_offsets(); |
1163 | 1172 |
1164 public: | 1173 public: |
1165 // Accessors | 1174 // Accessors |
1167 static void set_target( oop site, oop target) { site->obj_field_put( _target_offset, target); } | 1176 static void set_target( oop site, oop target) { site->obj_field_put( _target_offset, target); } |
1168 | 1177 |
1169 static volatile oop target_volatile(oop site) { return site->obj_field_volatile( _target_offset); } | 1178 static volatile oop target_volatile(oop site) { return site->obj_field_volatile( _target_offset); } |
1170 static void set_target_volatile(oop site, oop target) { site->obj_field_put_volatile(_target_offset, target); } | 1179 static void set_target_volatile(oop site, oop target) { site->obj_field_put_volatile(_target_offset, target); } |
1171 | 1180 |
1172 static oop caller_method(oop site); | |
1173 static void set_caller_method(oop site, oop ref); | |
1174 | |
1175 static jint caller_bci(oop site); | |
1176 static void set_caller_bci(oop site, jint bci); | |
1177 | |
1178 // Testers | 1181 // Testers |
1179 static bool is_subclass(klassOop klass) { | 1182 static bool is_subclass(klassOop klass) { |
1180 return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass()); | 1183 return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass()); |
1181 } | 1184 } |
1182 static bool is_instance(oop obj) { | 1185 static bool is_instance(oop obj) { |
1183 return obj != NULL && is_subclass(obj->klass()); | 1186 return obj != NULL && is_subclass(obj->klass()); |
1184 } | 1187 } |
1185 | 1188 |
1186 // Accessors for code generation: | 1189 // Accessors for code generation: |
1187 static int target_offset_in_bytes() { return _target_offset; } | 1190 static int target_offset_in_bytes() { return _target_offset; } |
1188 static int caller_method_offset_in_bytes() { return _caller_method_offset; } | |
1189 static int caller_bci_offset_in_bytes() { return _caller_bci_offset; } | |
1190 }; | 1191 }; |
1191 | 1192 |
1192 | 1193 |
1193 // Interface to java.security.AccessControlContext objects | 1194 // Interface to java.security.AccessControlContext objects |
1194 | 1195 |
1215 private: | 1216 private: |
1216 enum { | 1217 enum { |
1217 hc_parent_offset = 0 | 1218 hc_parent_offset = 0 |
1218 }; | 1219 }; |
1219 | 1220 |
1221 static bool offsets_computed; | |
1220 static int parent_offset; | 1222 static int parent_offset; |
1223 static int parallelCapable_offset; | |
1224 | |
1225 static void compute_offsets(); | |
1221 | 1226 |
1222 public: | 1227 public: |
1223 static oop parent(oop loader); | 1228 static oop parent(oop loader); |
1229 | |
1230 // Support for parallelCapable field | |
1231 static bool parallelCapable(oop the_class_mirror); | |
1224 | 1232 |
1225 static bool is_trusted_loader(oop loader); | 1233 static bool is_trusted_loader(oop loader); |
1226 | 1234 |
1227 // Fix for 4474172 | 1235 // Fix for 4474172 |
1228 static oop non_reflection_class_loader(oop loader); | 1236 static oop non_reflection_class_loader(oop loader); |
1341 public: | 1349 public: |
1342 static void initialize(TRAPS); | 1350 static void initialize(TRAPS); |
1343 static oop get_owner_threadObj(oop obj); | 1351 static oop get_owner_threadObj(oop obj); |
1344 }; | 1352 }; |
1345 | 1353 |
1354 // Use to declare fields that need to be injected into Java classes | |
1355 // for the JVM to use. The name_index and signature_index are | |
1356 // declared in vmSymbols. The may_be_java flag is used to declare | |
1357 // fields that might already exist in Java but should be injected if | |
1358 // they don't. Otherwise the field is unconditionally injected and | |
1359 // the JVM uses the injected one. This is to ensure that name | |
1360 // collisions don't occur. In general may_be_java should be false | |
1361 // unless there's a good reason. | |
1362 | |
1363 class InjectedField { | |
1364 public: | |
1365 const SystemDictionary::WKID klass_id; | |
1366 const vmSymbols::SID name_index; | |
1367 const vmSymbols::SID signature_index; | |
1368 const bool may_be_java; | |
1369 | |
1370 | |
1371 klassOop klass() const { return SystemDictionary::well_known_klass(klass_id); } | |
1372 Symbol* name() const { return lookup_symbol(name_index); } | |
1373 Symbol* signature() const { return lookup_symbol(signature_index); } | |
1374 | |
1375 int compute_offset(); | |
1376 | |
1377 // Find the Symbol for this index | |
1378 static Symbol* lookup_symbol(int symbol_index) { | |
1379 return vmSymbols::symbol_at((vmSymbols::SID)symbol_index); | |
1380 } | |
1381 }; | |
1382 | |
1383 #define DECLARE_INJECTED_FIELD_ENUM(klass, name, signature, may_be_java) \ | |
1384 klass##_##name##_enum, | |
1385 | |
1386 #define ALL_INJECTED_FIELDS(macro) \ | |
1387 CLASS_INJECTED_FIELDS(macro) \ | |
1388 METHODHANDLE_INJECTED_FIELDS(macro) \ | |
1389 DIRECTMETHODHANDLE_INJECTED_FIELDS(macro) \ | |
1390 MEMBERNAME_INJECTED_FIELDS(macro) \ | |
1391 METHODTYPEFORM_INJECTED_FIELDS(macro) | |
1392 | |
1346 // Interface to hard-coded offset checking | 1393 // Interface to hard-coded offset checking |
1347 | 1394 |
1348 class JavaClasses : AllStatic { | 1395 class JavaClasses : AllStatic { |
1349 private: | 1396 private: |
1397 | |
1398 static InjectedField _injected_fields[]; | |
1399 | |
1350 static bool check_offset(const char *klass_name, int offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0; | 1400 static bool check_offset(const char *klass_name, int offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0; |
1351 static bool check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0; | 1401 static bool check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0; |
1352 static bool check_constant(const char *klass_name, int constant, const char *field_name, const char* field_sig) PRODUCT_RETURN0; | 1402 static bool check_constant(const char *klass_name, int constant, const char *field_name, const char* field_sig) PRODUCT_RETURN0; |
1353 public: | 1403 |
1404 public: | |
1405 enum InjectedFieldID { | |
1406 ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD_ENUM) | |
1407 MAX_enum | |
1408 }; | |
1409 | |
1410 static int compute_injected_offset(InjectedFieldID id); | |
1411 | |
1354 static void compute_hard_coded_offsets(); | 1412 static void compute_hard_coded_offsets(); |
1355 static void compute_offsets(); | 1413 static void compute_offsets(); |
1356 static void check_offsets() PRODUCT_RETURN; | 1414 static void check_offsets() PRODUCT_RETURN; |
1357 }; | 1415 |
1416 static InjectedField* get_injected(Symbol* class_name, int* field_count); | |
1417 }; | |
1418 | |
1419 #undef DECLARE_INJECTED_FIELD_ENUM | |
1358 | 1420 |
1359 #endif // SHARE_VM_CLASSFILE_JAVACLASSES_HPP | 1421 #endif // SHARE_VM_CLASSFILE_JAVACLASSES_HPP |