98
99 static bool find_field(InstanceKlass* ik,
100 Symbol* name_symbol, Symbol* signature_symbol,
101 fieldDescriptor* fd,
102 bool allow_super = false) {
103 if (allow_super)
104 return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
105 else
106 return ik->find_local_field(name_symbol, signature_symbol, fd);
107 }
108
109 // Helpful routine for computing field offsets at run time rather than hardcoding them
110 static void
111 compute_offset(int &dest_offset,
112 Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
113 bool allow_super = false) {
114 fieldDescriptor fd;
115 InstanceKlass* ik = InstanceKlass::cast(klass_oop);
116 if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
117 ResourceMark rm;
118 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
119 #ifndef PRODUCT
120 klass_oop->print();
121 tty->print_cr("all fields:");
122 for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
123 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
124 }
125 #endif //PRODUCT
126 fatal("Invalid layout of preloaded class");
127 }
128 dest_offset = fd.offset();
129 }
130
131 // Same as above but for "optional" offsets that might not be present in certain JDK versions
132 static void
133 compute_optional_offset(int& dest_offset,
134 Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
135 bool allow_super = false) {
136 fieldDescriptor fd;
137 InstanceKlass* ik = InstanceKlass::cast(klass_oop);
138 if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
857 (*reference_klass) = as_Klass(java_class);
858 return T_OBJECT;
859 }
860 }
861
862
863 oop java_lang_Class::primitive_mirror(BasicType t) {
864 oop mirror = Universe::java_mirror(t);
865 assert(mirror != NULL && mirror->is_a(SystemDictionary::Class_klass()), "must be a Class");
866 assert(java_lang_Class::is_primitive(mirror), "must be primitive");
867 return mirror;
868 }
869
870 bool java_lang_Class::offsets_computed = false;
871 int java_lang_Class::classRedefinedCount_offset = -1;
872
873 void java_lang_Class::compute_offsets() {
874 assert(!offsets_computed, "offsets should be initialized only once");
875 offsets_computed = true;
876
877 Klass* k = SystemDictionary::Class_klass();
878 // The classRedefinedCount field is only present starting in 1.5,
879 // so don't go fatal.
880 compute_optional_offset(classRedefinedCount_offset,
881 k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
882
883 // Needs to be optional because the old build runs Queens during bootstrapping
884 // and jdk8-9 doesn't have coordinated pushes yet.
885 compute_optional_offset(_class_loader_offset,
886 k, vmSymbols::classLoader_name(),
887 vmSymbols::classloader_signature());
888
889 compute_offset(_component_mirror_offset,
890 k, vmSymbols::componentType_name(),
891 vmSymbols::class_signature());
892
893 // Init lock is a C union with component_mirror. Only instanceKlass mirrors have
894 // init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops
895 // GC treats them the same.
896 _init_lock_offset = _component_mirror_offset;
897
898 CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
899 }
900
901 int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
902 if (classRedefinedCount_offset == -1) {
903 // If we don't have an offset for it then just return -1 as a marker.
904 return -1;
905 }
906
907 return the_class_mirror->int_field(classRedefinedCount_offset);
908 }
909
910 void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
911 if (classRedefinedCount_offset == -1) {
912 // If we don't have an offset for it then nothing to set.
913 return;
914 }
915
916 the_class_mirror->int_field_put(classRedefinedCount_offset, value);
917 }
918
919
920 // Note: JDK1.1 and before had a privateInfo_offset field which was used for the
921 // platform thread structure, and a eetop offset which was used for thread
922 // local storage (and unused by the HotSpot VM). In JDK1.2 the two structures
923 // merged, so in the HotSpot VM we just use the eetop field for the thread
924 // instead of the privateInfo_offset.
925 //
926 // Note: The stackSize field is only present starting in 1.4.
927
928 int java_lang_Thread::_name_offset = 0;
929 int java_lang_Thread::_group_offset = 0;
930 int java_lang_Thread::_contextClassLoader_offset = 0;
931 int java_lang_Thread::_inheritedAccessControlContext_offset = 0;
932 int java_lang_Thread::_priority_offset = 0;
933 int java_lang_Thread::_eetop_offset = 0;
934 int java_lang_Thread::_daemon_offset = 0;
935 int java_lang_Thread::_stillborn_offset = 0;
936 int java_lang_Thread::_stackSize_offset = 0;
937 int java_lang_Thread::_tid_offset = 0;
938 int java_lang_Thread::_thread_status_offset = 0;
2683 }
2684 return member_name;
2685 }
2686
2687 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
2688 Klass* klass_oop = SystemDictionary::DirectMethodHandle_klass();
2689 if (klass_oop != NULL) {
2690 compute_offset(_member_offset, klass_oop, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature());
2691 }
2692 }
2693
2694 // Support for java_lang_invoke_MethodHandle
2695
2696 int java_lang_invoke_MethodHandle::_type_offset;
2697 int java_lang_invoke_MethodHandle::_form_offset;
2698
2699 int java_lang_invoke_MemberName::_clazz_offset;
2700 int java_lang_invoke_MemberName::_name_offset;
2701 int java_lang_invoke_MemberName::_type_offset;
2702 int java_lang_invoke_MemberName::_flags_offset;
2703 int java_lang_invoke_MemberName::_vmtarget_offset;
2704 int java_lang_invoke_MemberName::_vmloader_offset;
2705 int java_lang_invoke_MemberName::_vmindex_offset;
2706
2707 int java_lang_invoke_LambdaForm::_vmentry_offset;
2708
2709 void java_lang_invoke_MethodHandle::compute_offsets() {
2710 Klass* klass_oop = SystemDictionary::MethodHandle_klass();
2711 if (klass_oop != NULL) {
2712 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature());
2713 compute_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature());
2714 }
2715 }
2716
2717 void java_lang_invoke_MemberName::compute_offsets() {
2718 Klass* klass_oop = SystemDictionary::MemberName_klass();
2719 if (klass_oop != NULL) {
2720 compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature());
2721 compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature());
2722 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature());
2723 compute_offset(_flags_offset, klass_oop, vmSymbols::flags_name(), vmSymbols::int_signature());
2724 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2725 }
2726 }
2727
2728 void java_lang_invoke_LambdaForm::compute_offsets() {
2729 Klass* klass_oop = SystemDictionary::LambdaForm_klass();
2730 if (klass_oop != NULL) {
2731 compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature());
2732 }
2733 }
2734
2735 oop java_lang_invoke_MethodHandle::type(oop mh) {
2736 return mh->obj_field(_type_offset);
2737 }
2738
2739 void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) {
2740 mh->obj_field_put(_type_offset, mtype);
2741 }
2742
2743 oop java_lang_invoke_MethodHandle::form(oop mh) {
2775 oop java_lang_invoke_MemberName::type(oop mname) {
2776 assert(is_instance(mname), "wrong type");
2777 return mname->obj_field(_type_offset);
2778 }
2779
2780 void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
2781 assert(is_instance(mname), "wrong type");
2782 mname->obj_field_put(_type_offset, type);
2783 }
2784
2785 int java_lang_invoke_MemberName::flags(oop mname) {
2786 assert(is_instance(mname), "wrong type");
2787 return mname->int_field(_flags_offset);
2788 }
2789
2790 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
2791 assert(is_instance(mname), "wrong type");
2792 mname->int_field_put(_flags_offset, flags);
2793 }
2794
2795 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
2796 assert(is_instance(mname), "wrong type");
2797 return (Metadata*)mname->address_field(_vmtarget_offset);
2798 }
2799
2800 #if INCLUDE_JVMTI
2801 // Can be executed on VM thread only
2802 void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) {
2803 assert((is_instance(mname) && (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0), "wrong type");
2804 assert(Thread::current()->is_VM_thread(), "not VM thread");
2805 mname->address_field_put(_vmtarget_offset, (address)ref);
2806 }
2807 #endif // INCLUDE_JVMTI
2808
2809 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
2810 assert(is_instance(mname), "wrong type");
2811 // check the type of the vmtarget
2812 oop dependency = NULL;
2813 if (ref != NULL) {
2814 switch (flags(mname) & (MN_IS_METHOD |
3113
3114 bool java_lang_System::has_security_manager() {
3115 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::System_klass());
3116 address addr = ik->static_field_addr(static_security_offset);
3117 if (UseCompressedOops) {
3118 return oopDesc::load_decode_heap_oop((narrowOop *)addr) != NULL;
3119 } else {
3120 return oopDesc::load_decode_heap_oop((oop*)addr) != NULL;
3121 }
3122 }
3123
3124 int java_lang_Class::_klass_offset;
3125 int java_lang_Class::_array_klass_offset;
3126 int java_lang_Class::_oop_size_offset;
3127 int java_lang_Class::_static_oop_field_count_offset;
3128 int java_lang_Class::_class_loader_offset;
3129 int java_lang_Class::_protection_domain_offset;
3130 int java_lang_Class::_component_mirror_offset;
3131 int java_lang_Class::_init_lock_offset;
3132 int java_lang_Class::_signers_offset;
3133 GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
3134 int java_lang_Throwable::backtrace_offset;
3135 int java_lang_Throwable::detailMessage_offset;
3136 int java_lang_Throwable::cause_offset;
3137 int java_lang_Throwable::stackTrace_offset;
3138 int java_lang_Throwable::static_unassigned_stacktrace_offset;
3139 int java_lang_reflect_AccessibleObject::override_offset;
3140 int java_lang_reflect_Method::clazz_offset;
3141 int java_lang_reflect_Method::name_offset;
3142 int java_lang_reflect_Method::returnType_offset;
3143 int java_lang_reflect_Method::parameterTypes_offset;
3144 int java_lang_reflect_Method::exceptionTypes_offset;
3145 int java_lang_reflect_Method::slot_offset;
3146 int java_lang_reflect_Method::modifiers_offset;
3147 int java_lang_reflect_Method::signature_offset;
3148 int java_lang_reflect_Method::annotations_offset;
3149 int java_lang_reflect_Method::parameter_annotations_offset;
3150 int java_lang_reflect_Method::annotation_default_offset;
3151 int java_lang_reflect_Method::type_annotations_offset;
3152 int java_lang_reflect_Constructor::clazz_offset;
3153 int java_lang_reflect_Constructor::parameterTypes_offset;
3154 int java_lang_reflect_Constructor::exceptionTypes_offset;
3155 int java_lang_reflect_Constructor::slot_offset;
3156 int java_lang_reflect_Constructor::modifiers_offset;
3157 int java_lang_reflect_Constructor::signature_offset;
3158 int java_lang_reflect_Constructor::annotations_offset;
3159 int java_lang_reflect_Constructor::parameter_annotations_offset;
3160 int java_lang_reflect_Constructor::type_annotations_offset;
3161 int java_lang_reflect_Field::clazz_offset;
3162 int java_lang_reflect_Field::name_offset;
3163 int java_lang_reflect_Field::type_offset;
3164 int java_lang_reflect_Field::slot_offset;
3165 int java_lang_reflect_Field::modifiers_offset;
3166 int java_lang_reflect_Field::signature_offset;
3167 int java_lang_reflect_Field::annotations_offset;
3168 int java_lang_reflect_Field::type_annotations_offset;
3169 int java_lang_reflect_Parameter::name_offset;
3170 int java_lang_reflect_Parameter::modifiers_offset;
3171 int java_lang_reflect_Parameter::index_offset;
3172 int java_lang_reflect_Parameter::executable_offset;
3173 int java_lang_boxing_object::value_offset;
3174 int java_lang_boxing_object::long_value_offset;
3175 int java_lang_ref_Reference::referent_offset;
3176 int java_lang_ref_Reference::queue_offset;
3177 int java_lang_ref_Reference::next_offset;
3178 int java_lang_ref_Reference::discovered_offset;
3179 int java_lang_ref_Reference::static_lock_offset;
3180 int java_lang_ref_Reference::static_pending_offset;
3181 int java_lang_ref_Reference::number_of_fake_oop_fields;
3182 int java_lang_ref_SoftReference::timestamp_offset;
3183 int java_lang_ref_SoftReference::static_clock_offset;
3184 int java_lang_ClassLoader::parent_offset;
3185 int java_lang_System::static_in_offset;
3186 int java_lang_System::static_out_offset;
3187 int java_lang_System::static_err_offset;
3188 int java_lang_System::static_security_offset;
3189 int java_lang_StackTraceElement::declaringClass_offset;
3190 int java_lang_StackTraceElement::methodName_offset;
3191 int java_lang_StackTraceElement::fileName_offset;
3192 int java_lang_StackTraceElement::lineNumber_offset;
3193 int java_lang_AssertionStatusDirectives::classes_offset;
3194 int java_lang_AssertionStatusDirectives::classEnabled_offset;
3195 int java_lang_AssertionStatusDirectives::packages_offset;
3196 int java_lang_AssertionStatusDirectives::packageEnabled_offset;
3197 int java_lang_AssertionStatusDirectives::deflt_offset;
3198 int java_nio_Buffer::_limit_offset;
3199 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
3200 int sun_reflect_ConstantPool::_oop_offset;
3201 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
3202
3203
3204 // Support for java_lang_StackTraceElement
3205
3206 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
3207 element->obj_field_put(fileName_offset, value);
3208 }
3209
3210 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
3211 element->obj_field_put(declaringClass_offset, value);
3212 }
3213
3214 void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
3215 element->obj_field_put(methodName_offset, value);
3216 }
3217
3218 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
3219 element->int_field_put(lineNumber_offset, value);
3220 }
3318 java_lang_StackTraceElement::fileName_offset = java_lang_StackTraceElement::hc_fileName_offset * x + header;
3319 java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
3320 java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
3321 java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
3322 java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
3323 java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;
3324 java_lang_AssertionStatusDirectives::deflt_offset = java_lang_AssertionStatusDirectives::hc_deflt_offset * x + header;
3325
3326 }
3327
3328
3329 // Compute non-hard-coded field offsets of all the classes in this file
3330 void JavaClasses::compute_offsets() {
3331 // java_lang_Class::compute_offsets was called earlier in bootstrap
3332 java_lang_ClassLoader::compute_offsets();
3333 java_lang_Thread::compute_offsets();
3334 java_lang_ThreadGroup::compute_offsets();
3335 java_lang_invoke_MethodHandle::compute_offsets();
3336 java_lang_invoke_DirectMethodHandle::compute_offsets();
3337 java_lang_invoke_MemberName::compute_offsets();
3338 java_lang_invoke_LambdaForm::compute_offsets();
3339 java_lang_invoke_MethodType::compute_offsets();
3340 java_lang_invoke_CallSite::compute_offsets();
3341 java_security_AccessControlContext::compute_offsets();
3342 // Initialize reflection classes. The layouts of these classes
3343 // changed with the new reflection implementation in JDK 1.4, and
3344 // since the Universe doesn't know what JDK version it is until this
3345 // point we defer computation of these offsets until now.
3346 java_lang_reflect_AccessibleObject::compute_offsets();
3347 java_lang_reflect_Method::compute_offsets();
3348 java_lang_reflect_Constructor::compute_offsets();
3349 java_lang_reflect_Field::compute_offsets();
3350 java_nio_Buffer::compute_offsets();
3351 sun_reflect_ConstantPool::compute_offsets();
3352 sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
3353 java_lang_reflect_Parameter::compute_offsets();
3354
3355 // generated interpreter code wants to know about the offsets we just computed:
3356 AbstractAssembler::update_delayed_values();
3357 }
|
98
99 static bool find_field(InstanceKlass* ik,
100 Symbol* name_symbol, Symbol* signature_symbol,
101 fieldDescriptor* fd,
102 bool allow_super = false) {
103 if (allow_super)
104 return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
105 else
106 return ik->find_local_field(name_symbol, signature_symbol, fd);
107 }
108
109 // Helpful routine for computing field offsets at run time rather than hardcoding them
110 static void
111 compute_offset(int &dest_offset,
112 Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
113 bool allow_super = false) {
114 fieldDescriptor fd;
115 InstanceKlass* ik = InstanceKlass::cast(klass_oop);
116 if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
117 ResourceMark rm;
118 tty->print_cr("Invalid layout of %s at %s sig %s", ik->external_name(), name_symbol->as_C_string(), signature_symbol->as_C_string());
119 #ifndef PRODUCT
120 klass_oop->print();
121 tty->print_cr("all fields:");
122 for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
123 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
124 }
125 #endif //PRODUCT
126 fatal("Invalid layout of preloaded class");
127 }
128 dest_offset = fd.offset();
129 }
130
131 // Same as above but for "optional" offsets that might not be present in certain JDK versions
132 static void
133 compute_optional_offset(int& dest_offset,
134 Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
135 bool allow_super = false) {
136 fieldDescriptor fd;
137 InstanceKlass* ik = InstanceKlass::cast(klass_oop);
138 if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
857 (*reference_klass) = as_Klass(java_class);
858 return T_OBJECT;
859 }
860 }
861
862
863 oop java_lang_Class::primitive_mirror(BasicType t) {
864 oop mirror = Universe::java_mirror(t);
865 assert(mirror != NULL && mirror->is_a(SystemDictionary::Class_klass()), "must be a Class");
866 assert(java_lang_Class::is_primitive(mirror), "must be primitive");
867 return mirror;
868 }
869
870 bool java_lang_Class::offsets_computed = false;
871 int java_lang_Class::classRedefinedCount_offset = -1;
872
873 void java_lang_Class::compute_offsets() {
874 assert(!offsets_computed, "offsets should be initialized only once");
875 offsets_computed = true;
876
877 Thread* THREAD = Thread::current();
878 Klass* k = SystemDictionary::Class_klass();
879 compute_offset(_classData_offset, k, vmSymbols::classData_name(), vmSymbols::object_signature());
880 // The classRedefinedCount field is only present starting in 1.5,
881 // so don't go fatal.
882 compute_optional_offset(classRedefinedCount_offset, k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
883
884 // Needs to be optional because the old build runs Queens during bootstrapping
885 // and jdk8-9 doesn't have coordinated pushes yet.
886 compute_optional_offset(_class_loader_offset,
887 k, vmSymbols::classLoader_name(),
888 vmSymbols::classloader_signature());
889
890 compute_offset(_component_mirror_offset,
891 k, vmSymbols::componentType_name(),
892 vmSymbols::class_signature());
893
894 // Init lock is a C union with component_mirror. Only instanceKlass mirrors have
895 // init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops
896 // GC treats them the same.
897 _init_lock_offset = _component_mirror_offset;
898
899 CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
900 }
901
902 oop java_lang_Class::classData(oop obj) {
903 return obj->obj_field_volatile(_classData_offset);
904 }
905
906 int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
907 if (classRedefinedCount_offset == -1) {
908 // If we don't have an offset for it then just return -1 as a marker.
909 return -1;
910 }
911
912 return the_class_mirror->int_field(classRedefinedCount_offset);
913 }
914
915 void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
916 if (classRedefinedCount_offset == -1) {
917 // If we don't have an offset for it then nothing to set.
918 return;
919 }
920
921 the_class_mirror->int_field_put(classRedefinedCount_offset, value);
922 }
923
924 int java_lang_invoke_MemberName_ClassData::_publishedToVM_offset;
925
926 void java_lang_invoke_MemberName_ClassData::compute_offsets() {
927 Thread* THREAD = Thread::current();
928 Klass* k = SystemDictionary::MemberName_ClassData_klass();
929 compute_offset(_publishedToVM_offset, k, vmSymbols::publishedToVM_name(), vmSymbols::java_lang_invoke_MemberName_signature());
930 }
931
932 bool java_lang_invoke_MemberName_ClassData::is_instance(oop obj) {
933 return obj != NULL && obj->klass() == SystemDictionary::MemberName_ClassData_klass();
934 }
935
936 oop java_lang_invoke_MemberName_ClassData::publishedToVM(oop obj) {
937 assert(is_instance(obj), err_msg("%s", obj == NULL ? "null" : obj->klass()->external_name()));
938 return obj->obj_field(_publishedToVM_offset);
939 }
940
941 // Note: JDK1.1 and before had a privateInfo_offset field which was used for the
942 // platform thread structure, and a eetop offset which was used for thread
943 // local storage (and unused by the HotSpot VM). In JDK1.2 the two structures
944 // merged, so in the HotSpot VM we just use the eetop field for the thread
945 // instead of the privateInfo_offset.
946 //
947 // Note: The stackSize field is only present starting in 1.4.
948
949 int java_lang_Thread::_name_offset = 0;
950 int java_lang_Thread::_group_offset = 0;
951 int java_lang_Thread::_contextClassLoader_offset = 0;
952 int java_lang_Thread::_inheritedAccessControlContext_offset = 0;
953 int java_lang_Thread::_priority_offset = 0;
954 int java_lang_Thread::_eetop_offset = 0;
955 int java_lang_Thread::_daemon_offset = 0;
956 int java_lang_Thread::_stillborn_offset = 0;
957 int java_lang_Thread::_stackSize_offset = 0;
958 int java_lang_Thread::_tid_offset = 0;
959 int java_lang_Thread::_thread_status_offset = 0;
2704 }
2705 return member_name;
2706 }
2707
2708 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
2709 Klass* klass_oop = SystemDictionary::DirectMethodHandle_klass();
2710 if (klass_oop != NULL) {
2711 compute_offset(_member_offset, klass_oop, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature());
2712 }
2713 }
2714
2715 // Support for java_lang_invoke_MethodHandle
2716
2717 int java_lang_invoke_MethodHandle::_type_offset;
2718 int java_lang_invoke_MethodHandle::_form_offset;
2719
2720 int java_lang_invoke_MemberName::_clazz_offset;
2721 int java_lang_invoke_MemberName::_name_offset;
2722 int java_lang_invoke_MemberName::_type_offset;
2723 int java_lang_invoke_MemberName::_flags_offset;
2724 int java_lang_invoke_MemberName::_next_offset;
2725 int java_lang_invoke_MemberName::_vmtarget_offset;
2726 int java_lang_invoke_MemberName::_vmloader_offset;
2727 int java_lang_invoke_MemberName::_vmindex_offset;
2728
2729 int java_lang_invoke_LambdaForm::_vmentry_offset;
2730
2731 void java_lang_invoke_MethodHandle::compute_offsets() {
2732 Klass* klass_oop = SystemDictionary::MethodHandle_klass();
2733 if (klass_oop != NULL) {
2734 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature());
2735 compute_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature());
2736 }
2737 }
2738
2739 void java_lang_invoke_MemberName::compute_offsets() {
2740 Klass* klass_oop = SystemDictionary::MemberName_klass();
2741 if (klass_oop != NULL) {
2742 compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature());
2743 compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature());
2744 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature());
2745 compute_offset(_flags_offset, klass_oop, vmSymbols::flags_name(), vmSymbols::int_signature());
2746 compute_offset(_next_offset, klass_oop, vmSymbols::next_name(), vmSymbols::java_lang_invoke_MemberName_signature());
2747 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2748 }
2749 }
2750
2751 void java_lang_invoke_LambdaForm::compute_offsets() {
2752 Klass* klass_oop = SystemDictionary::LambdaForm_klass();
2753 if (klass_oop != NULL) {
2754 compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature());
2755 }
2756 }
2757
2758 oop java_lang_invoke_MethodHandle::type(oop mh) {
2759 return mh->obj_field(_type_offset);
2760 }
2761
2762 void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) {
2763 mh->obj_field_put(_type_offset, mtype);
2764 }
2765
2766 oop java_lang_invoke_MethodHandle::form(oop mh) {
2798 oop java_lang_invoke_MemberName::type(oop mname) {
2799 assert(is_instance(mname), "wrong type");
2800 return mname->obj_field(_type_offset);
2801 }
2802
2803 void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
2804 assert(is_instance(mname), "wrong type");
2805 mname->obj_field_put(_type_offset, type);
2806 }
2807
2808 int java_lang_invoke_MemberName::flags(oop mname) {
2809 assert(is_instance(mname), "wrong type");
2810 return mname->int_field(_flags_offset);
2811 }
2812
2813 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
2814 assert(is_instance(mname), "wrong type");
2815 mname->int_field_put(_flags_offset, flags);
2816 }
2817
2818 oop java_lang_invoke_MemberName::next(oop mname) {
2819 assert(is_instance(mname), "wrong type");
2820 return mname->obj_field(_next_offset);
2821 }
2822
2823 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
2824 assert(is_instance(mname), "wrong type");
2825 return (Metadata*)mname->address_field(_vmtarget_offset);
2826 }
2827
2828 #if INCLUDE_JVMTI
2829 // Can be executed on VM thread only
2830 void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) {
2831 assert((is_instance(mname) && (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0), "wrong type");
2832 assert(Thread::current()->is_VM_thread(), "not VM thread");
2833 mname->address_field_put(_vmtarget_offset, (address)ref);
2834 }
2835 #endif // INCLUDE_JVMTI
2836
2837 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
2838 assert(is_instance(mname), "wrong type");
2839 // check the type of the vmtarget
2840 oop dependency = NULL;
2841 if (ref != NULL) {
2842 switch (flags(mname) & (MN_IS_METHOD |
3141
3142 bool java_lang_System::has_security_manager() {
3143 InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::System_klass());
3144 address addr = ik->static_field_addr(static_security_offset);
3145 if (UseCompressedOops) {
3146 return oopDesc::load_decode_heap_oop((narrowOop *)addr) != NULL;
3147 } else {
3148 return oopDesc::load_decode_heap_oop((oop*)addr) != NULL;
3149 }
3150 }
3151
3152 int java_lang_Class::_klass_offset;
3153 int java_lang_Class::_array_klass_offset;
3154 int java_lang_Class::_oop_size_offset;
3155 int java_lang_Class::_static_oop_field_count_offset;
3156 int java_lang_Class::_class_loader_offset;
3157 int java_lang_Class::_protection_domain_offset;
3158 int java_lang_Class::_component_mirror_offset;
3159 int java_lang_Class::_init_lock_offset;
3160 int java_lang_Class::_signers_offset;
3161 int java_lang_Class::_classData_offset;
3162
3163 GrowableArray<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
3164
3165 int java_lang_Throwable::backtrace_offset;
3166 int java_lang_Throwable::detailMessage_offset;
3167 int java_lang_Throwable::cause_offset;
3168 int java_lang_Throwable::stackTrace_offset;
3169 int java_lang_Throwable::static_unassigned_stacktrace_offset;
3170
3171 int java_lang_reflect_AccessibleObject::override_offset;
3172
3173 int java_lang_reflect_Method::clazz_offset;
3174 int java_lang_reflect_Method::name_offset;
3175 int java_lang_reflect_Method::returnType_offset;
3176 int java_lang_reflect_Method::parameterTypes_offset;
3177 int java_lang_reflect_Method::exceptionTypes_offset;
3178 int java_lang_reflect_Method::slot_offset;
3179 int java_lang_reflect_Method::modifiers_offset;
3180 int java_lang_reflect_Method::signature_offset;
3181 int java_lang_reflect_Method::annotations_offset;
3182 int java_lang_reflect_Method::parameter_annotations_offset;
3183 int java_lang_reflect_Method::annotation_default_offset;
3184 int java_lang_reflect_Method::type_annotations_offset;
3185
3186 int java_lang_reflect_Constructor::clazz_offset;
3187 int java_lang_reflect_Constructor::parameterTypes_offset;
3188 int java_lang_reflect_Constructor::exceptionTypes_offset;
3189 int java_lang_reflect_Constructor::slot_offset;
3190 int java_lang_reflect_Constructor::modifiers_offset;
3191 int java_lang_reflect_Constructor::signature_offset;
3192 int java_lang_reflect_Constructor::annotations_offset;
3193 int java_lang_reflect_Constructor::parameter_annotations_offset;
3194 int java_lang_reflect_Constructor::type_annotations_offset;
3195
3196 int java_lang_reflect_Field::clazz_offset;
3197 int java_lang_reflect_Field::name_offset;
3198 int java_lang_reflect_Field::type_offset;
3199 int java_lang_reflect_Field::slot_offset;
3200 int java_lang_reflect_Field::modifiers_offset;
3201 int java_lang_reflect_Field::signature_offset;
3202 int java_lang_reflect_Field::annotations_offset;
3203 int java_lang_reflect_Field::type_annotations_offset;
3204
3205 int java_lang_reflect_Parameter::name_offset;
3206 int java_lang_reflect_Parameter::modifiers_offset;
3207 int java_lang_reflect_Parameter::index_offset;
3208 int java_lang_reflect_Parameter::executable_offset;
3209
3210 int java_lang_boxing_object::value_offset;
3211 int java_lang_boxing_object::long_value_offset;
3212
3213 int java_lang_ref_Reference::referent_offset;
3214 int java_lang_ref_Reference::queue_offset;
3215 int java_lang_ref_Reference::next_offset;
3216 int java_lang_ref_Reference::discovered_offset;
3217 int java_lang_ref_Reference::static_lock_offset;
3218 int java_lang_ref_Reference::static_pending_offset;
3219 int java_lang_ref_Reference::number_of_fake_oop_fields;
3220
3221 int java_lang_ref_SoftReference::timestamp_offset;
3222 int java_lang_ref_SoftReference::static_clock_offset;
3223
3224 int java_lang_ClassLoader::parent_offset;
3225
3226 int java_lang_System::static_in_offset;
3227 int java_lang_System::static_out_offset;
3228 int java_lang_System::static_err_offset;
3229 int java_lang_System::static_security_offset;
3230
3231 int java_lang_StackTraceElement::declaringClass_offset;
3232 int java_lang_StackTraceElement::methodName_offset;
3233 int java_lang_StackTraceElement::fileName_offset;
3234 int java_lang_StackTraceElement::lineNumber_offset;
3235
3236 int java_lang_AssertionStatusDirectives::classes_offset;
3237 int java_lang_AssertionStatusDirectives::classEnabled_offset;
3238 int java_lang_AssertionStatusDirectives::packages_offset;
3239 int java_lang_AssertionStatusDirectives::packageEnabled_offset;
3240 int java_lang_AssertionStatusDirectives::deflt_offset;
3241
3242 int java_nio_Buffer::_limit_offset;
3243
3244 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
3245
3246 int sun_reflect_ConstantPool::_oop_offset;
3247
3248 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
3249
3250
3251 // Support for java_lang_StackTraceElement
3252
3253 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
3254 element->obj_field_put(fileName_offset, value);
3255 }
3256
3257 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
3258 element->obj_field_put(declaringClass_offset, value);
3259 }
3260
3261 void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
3262 element->obj_field_put(methodName_offset, value);
3263 }
3264
3265 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
3266 element->int_field_put(lineNumber_offset, value);
3267 }
3365 java_lang_StackTraceElement::fileName_offset = java_lang_StackTraceElement::hc_fileName_offset * x + header;
3366 java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
3367 java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
3368 java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
3369 java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
3370 java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;
3371 java_lang_AssertionStatusDirectives::deflt_offset = java_lang_AssertionStatusDirectives::hc_deflt_offset * x + header;
3372
3373 }
3374
3375
3376 // Compute non-hard-coded field offsets of all the classes in this file
3377 void JavaClasses::compute_offsets() {
3378 // java_lang_Class::compute_offsets was called earlier in bootstrap
3379 java_lang_ClassLoader::compute_offsets();
3380 java_lang_Thread::compute_offsets();
3381 java_lang_ThreadGroup::compute_offsets();
3382 java_lang_invoke_MethodHandle::compute_offsets();
3383 java_lang_invoke_DirectMethodHandle::compute_offsets();
3384 java_lang_invoke_MemberName::compute_offsets();
3385 java_lang_invoke_MemberName_ClassData::compute_offsets();
3386 java_lang_invoke_LambdaForm::compute_offsets();
3387 java_lang_invoke_MethodType::compute_offsets();
3388 java_lang_invoke_CallSite::compute_offsets();
3389 java_security_AccessControlContext::compute_offsets();
3390 // Initialize reflection classes. The layouts of these classes
3391 // changed with the new reflection implementation in JDK 1.4, and
3392 // since the Universe doesn't know what JDK version it is until this
3393 // point we defer computation of these offsets until now.
3394 java_lang_reflect_AccessibleObject::compute_offsets();
3395 java_lang_reflect_Method::compute_offsets();
3396 java_lang_reflect_Constructor::compute_offsets();
3397 java_lang_reflect_Field::compute_offsets();
3398 java_nio_Buffer::compute_offsets();
3399 sun_reflect_ConstantPool::compute_offsets();
3400 sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
3401 java_lang_reflect_Parameter::compute_offsets();
3402
3403 // generated interpreter code wants to know about the offsets we just computed:
3404 AbstractAssembler::update_delayed_values();
3405 }
|