src/share/vm/classfile/javaClasses.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/classfile/javaClasses.hpp	Fri Sep  9 11:54:57 2011
--- new/src/share/vm/classfile/javaClasses.hpp	Fri Sep  9 11:54:57 2011

*** 154,187 **** --- 154,189 ---- }; // Interface to java.lang.Class objects + #define CLASS_INJECTED_FIELDS(macro) \ + macro(java_lang_Class, klass, object_signature, false) \ + macro(java_lang_Class, resolved_constructor, object_signature, false) \ + macro(java_lang_Class, array_klass, object_signature, false) \ + macro(java_lang_Class, oop_size, int_signature, false) \ + macro(java_lang_Class, static_oop_field_count, int_signature, false) + class java_lang_Class : AllStatic { friend class VMStructs; + private: // The fake offsets are added by the class loader when java.lang.Class is loaded enum { hc_number_of_fake_oop_fields = 3, hc_number_of_fake_int_fields = 2 }; + static int _klass_offset; + static int _resolved_constructor_offset; + static int _array_klass_offset; ! static int klass_offset; ! static int resolved_constructor_offset; static int array_klass_offset; static int number_of_fake_oop_fields; ! static int _oop_size_offset; ! static int _static_oop_field_count_offset; static int oop_size_offset; static int static_oop_field_count_offset; static void compute_offsets(); static bool offsets_computed; static int classRedefinedCount_offset; static int parallelCapable_offset; public: + static void compute_offsets(); + // Instance creation static oop create_mirror(KlassHandle k, TRAPS); static void fixup_mirror(KlassHandle k, TRAPS); static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); // Conversion
*** 207,224 **** --- 209,224 ---- static void set_resolved_constructor(oop java_class, methodOop constructor); // JVM_NewArray support static klassOop array_klass(oop java_class); static void set_array_klass(oop java_class, klassOop klass); // compiler support for class operations ! static int klass_offset_in_bytes() { return _klass_offset; } ! static int resolved_constructor_offset_in_bytes() { return _resolved_constructor_offset; } ! static int array_klass_offset_in_bytes() { return _array_klass_offset; } // Support for classRedefinedCount field static int classRedefinedCount(oop the_class_mirror); static void set_classRedefinedCount(oop the_class_mirror, int value); // Support for parallelCapable field static bool parallelCapable(oop the_class_mirror); static int oop_size(oop java_class); static void set_oop_size(oop java_class, int size); static int static_oop_field_count(oop java_class); static void set_static_oop_field_count(oop java_class, int size);
*** 832,851 **** --- 832,854 ---- }; // Interface to java.lang.invoke.MethodHandle objects + #define METHODHANDLE_INJECTED_FIELDS(macro) \ + macro(java_lang_invoke_MethodHandle, vmentry, intptr_signature, false) \ + macro(java_lang_invoke_MethodHandle, vmtarget, object_signature, true) + class MethodHandleEntry; class java_lang_invoke_MethodHandle: AllStatic { friend class JavaClasses; private: static int _vmentry_offset; // assembly code trampoline for MH static int _vmtarget_offset; // class-specific target reference static int _type_offset; // the MethodType of this MH static int _vmslots_offset; // OPTIONAL hoisted type.form.vmslots static void compute_offsets(); public: // Accessors
*** 857,868 **** --- 860,869 ---- static MethodHandleEntry* vmentry(oop mh); static void set_vmentry(oop mh, MethodHandleEntry* data); static int vmslots(oop mh); static void init_vmslots(oop mh); static int compute_vmslots(oop mh); // Testers static bool is_subclass(klassOop klass) { return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass()); }
*** 872,889 **** --- 873,891 ---- // Accessors for code generation: static int type_offset_in_bytes() { return _type_offset; } static int vmtarget_offset_in_bytes() { return _vmtarget_offset; } static int vmentry_offset_in_bytes() { return _vmentry_offset; } static int vmslots_offset_in_bytes() { return _vmslots_offset; } }; + #define DIRECTMETHODHANDLE_INJECTED_FIELDS(macro) \ + macro(java_lang_invoke_DirectMethodHandle, vmindex, int_signature, true) + class java_lang_invoke_DirectMethodHandle: public java_lang_invoke_MethodHandle { friend class JavaClasses; private: // _vmtarget_offset; // method or class or interface static int _vmindex_offset; // negative or vtable idx or itable idx static void compute_offsets(); public: // Accessors
*** 1010,1019 **** --- 1012,1024 ---- // Interface to java.lang.invoke.MemberName objects // (These are a private interface for Java code to query the class hierarchy.) + #define MEMBERNAME_INJECTED_FIELDS(macro) \ + macro(java_lang_invoke_MemberName, vmtarget, object_signature, true) + class java_lang_invoke_MemberName: AllStatic { friend class JavaClasses; private: // From java.lang.invoke.MemberName:
*** 1119,1128 **** --- 1124,1137 ---- static int rtype_offset_in_bytes() { return _rtype_offset; } static int ptypes_offset_in_bytes() { return _ptypes_offset; } static int form_offset_in_bytes() { return _form_offset; } }; + #define METHODTYPEFORM_INJECTED_FIELDS(macro) \ + macro(java_lang_invoke_MethodTypeForm, vmslots, int_signature, true) \ + macro(java_lang_invoke_MethodTypeForm, vmlayout, object_signature, true) + class java_lang_invoke_MethodTypeForm: AllStatic { friend class JavaClasses; private: static int _vmslots_offset; // number of argument slots needed
*** 1133,1142 **** --- 1142,1153 ---- static void compute_offsets(); public: // Accessors static int vmslots(oop mtform); + static void set_vmslots(oop mtform, int vmslots); + static oop erasedType(oop mtform); static oop genericInvoker(oop mtform); static oop vmlayout(oop mtform); static oop init_vmlayout(oop mtform, oop cookie);
*** 1154,1165 **** --- 1165,1174 ---- class java_lang_invoke_CallSite: AllStatic { friend class JavaClasses; private: static int _target_offset; static int _caller_method_offset; static int _caller_bci_offset; static void compute_offsets(); public: // Accessors
*** 1167,1182 **** --- 1176,1185 ---- static void set_target( oop site, oop target) { site->obj_field_put( _target_offset, target); } static volatile oop target_volatile(oop site) { return site->obj_field_volatile( _target_offset); } static void set_target_volatile(oop site, oop target) { site->obj_field_put_volatile(_target_offset, target); } static oop caller_method(oop site); static void set_caller_method(oop site, oop ref); static jint caller_bci(oop site); static void set_caller_bci(oop site, jint bci); // Testers static bool is_subclass(klassOop klass) { return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass()); } static bool is_instance(oop obj) {
*** 1183,1194 **** --- 1186,1195 ---- return obj != NULL && is_subclass(obj->klass()); } // Accessors for code generation: static int target_offset_in_bytes() { return _target_offset; } static int caller_method_offset_in_bytes() { return _caller_method_offset; } static int caller_bci_offset_in_bytes() { return _caller_bci_offset; } }; // Interface to java.security.AccessControlContext objects
*** 1215,1229 **** --- 1216,1237 ---- private: enum { hc_parent_offset = 0 }; + static bool offsets_computed; static int parent_offset; + static int parallelCapable_offset; + static void compute_offsets(); + public: static oop parent(oop loader); + // Support for parallelCapable field + static bool parallelCapable(oop the_class_mirror); + static bool is_trusted_loader(oop loader); // Fix for 4474172 static oop non_reflection_class_loader(oop loader);
*** 1341,1359 **** --- 1349,1421 ---- public: static void initialize(TRAPS); static oop get_owner_threadObj(oop obj); }; + // Use to declare fields that need to be injected into Java classes + // for the JVM to use. The name_index and signature_index are + // declared in vmSymbols. The may_be_java flag is used to declare + // fields that might already exist in Java but should be injected if + // they don't. Otherwise the field is unconditionally injected and + // the JVM uses the injected one. This is to ensure that name + // collisions don't occur. In general may_be_java should be false + // unless there's a good reason. + + class InjectedField { + public: + const SystemDictionary::WKID klass_id; + const vmSymbols::SID name_index; + const vmSymbols::SID signature_index; + const bool may_be_java; + + + klassOop klass() const { return SystemDictionary::well_known_klass(klass_id); } + Symbol* name() const { return lookup_symbol(name_index); } + Symbol* signature() const { return lookup_symbol(signature_index); } + + int compute_offset(); + + // Find the Symbol for this index + static Symbol* lookup_symbol(int symbol_index) { + return vmSymbols::symbol_at((vmSymbols::SID)symbol_index); + } + }; + + #define DECLARE_INJECTED_FIELD_ENUM(klass, name, signature, may_be_java) \ + klass##_##name##_enum, + + #define ALL_INJECTED_FIELDS(macro) \ + CLASS_INJECTED_FIELDS(macro) \ + METHODHANDLE_INJECTED_FIELDS(macro) \ + DIRECTMETHODHANDLE_INJECTED_FIELDS(macro) \ + MEMBERNAME_INJECTED_FIELDS(macro) \ + METHODTYPEFORM_INJECTED_FIELDS(macro) + // Interface to hard-coded offset checking class JavaClasses : AllStatic { private: + + static InjectedField _injected_fields[]; + static bool check_offset(const char *klass_name, int offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0; static bool check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) PRODUCT_RETURN0; static bool check_constant(const char *klass_name, int constant, const char *field_name, const char* field_sig) PRODUCT_RETURN0; + public: + enum InjectedFieldID { + ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD_ENUM) + MAX_enum + }; + + static int compute_injected_offset(InjectedFieldID id); + static void compute_hard_coded_offsets(); static void compute_offsets(); static void check_offsets() PRODUCT_RETURN; + + static InjectedField* get_injected(Symbol* class_name, int* field_count); }; + #undef DECLARE_INJECTED_FIELD_ENUM + #endif // SHARE_VM_CLASSFILE_JAVACLASSES_HPP

src/share/vm/classfile/javaClasses.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File