43 #include "oops/method.hpp" |
43 #include "oops/method.hpp" |
44 #include "oops/objArrayOop.inline.hpp" |
44 #include "oops/objArrayOop.inline.hpp" |
45 #include "oops/oop.inline.hpp" |
45 #include "oops/oop.inline.hpp" |
46 #include "oops/symbol.hpp" |
46 #include "oops/symbol.hpp" |
47 #include "oops/typeArrayOop.hpp" |
47 #include "oops/typeArrayOop.hpp" |
|
48 #include "prims/resolvedMethodTable.hpp" |
48 #include "runtime/fieldDescriptor.hpp" |
49 #include "runtime/fieldDescriptor.hpp" |
49 #include "runtime/handles.inline.hpp" |
50 #include "runtime/handles.inline.hpp" |
50 #include "runtime/interfaceSupport.hpp" |
51 #include "runtime/interfaceSupport.hpp" |
51 #include "runtime/java.hpp" |
52 #include "runtime/java.hpp" |
52 #include "runtime/javaCalls.hpp" |
53 #include "runtime/javaCalls.hpp" |
2226 // we should expand MemberName::name when Throwable uses StackTrace |
2227 // we should expand MemberName::name when Throwable uses StackTrace |
2227 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); |
2228 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); |
2228 return method; |
2229 return method; |
2229 } |
2230 } |
2230 |
2231 |
2231 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { |
2232 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) { |
2232 // set Method* or mid/cpref |
2233 // set Method* or mid/cpref |
2233 Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset)); |
2234 Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset)); |
2234 InstanceKlass* ik = method->method_holder(); |
2235 InstanceKlass* ik = method->method_holder(); |
2235 CallInfo info(method(), ik); |
2236 CallInfo info(method(), ik, CHECK); |
2236 MethodHandles::init_method_MemberName(mname, info); |
2237 MethodHandles::init_method_MemberName(mname, info); |
2237 // set bci |
2238 // set bci |
2238 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); |
2239 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); |
2239 // method may be redefined; store the version |
2240 // method may be redefined; store the version |
2240 int version = method->constants()->version(); |
2241 int version = method->constants()->version(); |
3096 |
3097 |
3097 int java_lang_invoke_MemberName::_clazz_offset; |
3098 int java_lang_invoke_MemberName::_clazz_offset; |
3098 int java_lang_invoke_MemberName::_name_offset; |
3099 int java_lang_invoke_MemberName::_name_offset; |
3099 int java_lang_invoke_MemberName::_type_offset; |
3100 int java_lang_invoke_MemberName::_type_offset; |
3100 int java_lang_invoke_MemberName::_flags_offset; |
3101 int java_lang_invoke_MemberName::_flags_offset; |
3101 int java_lang_invoke_MemberName::_vmtarget_offset; |
3102 int java_lang_invoke_MemberName::_method_offset; |
3102 int java_lang_invoke_MemberName::_vmloader_offset; |
|
3103 int java_lang_invoke_MemberName::_vmindex_offset; |
3103 int java_lang_invoke_MemberName::_vmindex_offset; |
3104 |
3104 |
|
3105 int java_lang_invoke_ResolvedMethodName::_vmtarget_offset; |
|
3106 int java_lang_invoke_ResolvedMethodName::_vmholder_offset; |
|
3107 |
3105 int java_lang_invoke_LambdaForm::_vmentry_offset; |
3108 int java_lang_invoke_LambdaForm::_vmentry_offset; |
3106 |
3109 |
3107 void java_lang_invoke_MethodHandle::compute_offsets() { |
3110 void java_lang_invoke_MethodHandle::compute_offsets() { |
3108 Klass* klass_oop = SystemDictionary::MethodHandle_klass(); |
3111 Klass* k = SystemDictionary::MethodHandle_klass(); |
3109 if (klass_oop != NULL) { |
3112 if (k != NULL) { |
3110 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); |
3113 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); |
3111 compute_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); |
3114 compute_offset(_form_offset, k, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); |
3112 } |
3115 } |
3113 } |
3116 } |
3114 |
3117 |
3115 void java_lang_invoke_MemberName::compute_offsets() { |
3118 void java_lang_invoke_MemberName::compute_offsets() { |
3116 Klass* klass_oop = SystemDictionary::MemberName_klass(); |
3119 Klass* k = SystemDictionary::MemberName_klass(); |
3117 if (klass_oop != NULL) { |
3120 assert (k != NULL, "jdk mismatch"); |
3118 compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
3121 compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
3119 compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature()); |
3122 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
3120 compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature()); |
3123 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::object_signature()); |
3121 compute_offset(_flags_offset, klass_oop, vmSymbols::flags_name(), vmSymbols::int_signature()); |
3124 compute_offset(_flags_offset, k, vmSymbols::flags_name(), vmSymbols::int_signature()); |
3122 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3125 compute_offset(_method_offset, k, vmSymbols::method_name(), vmSymbols::java_lang_invoke_ResolvedMethodName_signature()); |
3123 } |
3126 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
|
3127 } |
|
3128 |
|
3129 void java_lang_invoke_ResolvedMethodName::compute_offsets() { |
|
3130 Klass* k = SystemDictionary::ResolvedMethodName_klass(); |
|
3131 assert(k != NULL, "jdk mismatch"); |
|
3132 RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3124 } |
3133 } |
3125 |
3134 |
3126 void java_lang_invoke_LambdaForm::compute_offsets() { |
3135 void java_lang_invoke_LambdaForm::compute_offsets() { |
3127 Klass* klass_oop = SystemDictionary::LambdaForm_klass(); |
3136 Klass* k = SystemDictionary::LambdaForm_klass(); |
3128 if (klass_oop != NULL) { |
3137 assert (k != NULL, "jdk mismatch"); |
3129 compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature()); |
3138 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature()); |
3130 } |
|
3131 } |
3139 } |
3132 |
3140 |
3133 bool java_lang_invoke_LambdaForm::is_instance(oop obj) { |
3141 bool java_lang_invoke_LambdaForm::is_instance(oop obj) { |
3134 return obj != NULL && is_subclass(obj->klass()); |
3142 return obj != NULL && is_subclass(obj->klass()); |
3135 } |
3143 } |
3193 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) { |
3201 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) { |
3194 assert(is_instance(mname), "wrong type"); |
3202 assert(is_instance(mname), "wrong type"); |
3195 mname->int_field_put(_flags_offset, flags); |
3203 mname->int_field_put(_flags_offset, flags); |
3196 } |
3204 } |
3197 |
3205 |
3198 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) { |
3206 |
|
3207 // Return vmtarget from ResolvedMethodName method field through indirection |
|
3208 Method* java_lang_invoke_MemberName::vmtarget(oop mname) { |
3199 assert(is_instance(mname), "wrong type"); |
3209 assert(is_instance(mname), "wrong type"); |
3200 return (Metadata*)mname->address_field(_vmtarget_offset); |
3210 oop method = mname->obj_field(_method_offset); |
|
3211 return method == NULL ? NULL : java_lang_invoke_ResolvedMethodName::vmtarget(method); |
3201 } |
3212 } |
3202 |
3213 |
3203 bool java_lang_invoke_MemberName::is_method(oop mname) { |
3214 bool java_lang_invoke_MemberName::is_method(oop mname) { |
3204 assert(is_instance(mname), "must be MemberName"); |
3215 assert(is_instance(mname), "must be MemberName"); |
3205 return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0; |
3216 return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0; |
3206 } |
3217 } |
3207 |
3218 |
3208 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { |
3219 void java_lang_invoke_MemberName::set_method(oop mname, oop resolved_method) { |
3209 assert(is_instance(mname), "wrong type"); |
3220 assert(is_instance(mname), "wrong type"); |
3210 // check the type of the vmtarget |
3221 mname->obj_field_put(_method_offset, resolved_method); |
3211 oop dependency = NULL; |
|
3212 if (ref != NULL) { |
|
3213 switch (flags(mname) & (MN_IS_METHOD | |
|
3214 MN_IS_CONSTRUCTOR | |
|
3215 MN_IS_FIELD)) { |
|
3216 case MN_IS_METHOD: |
|
3217 case MN_IS_CONSTRUCTOR: |
|
3218 assert(ref->is_method(), "should be a method"); |
|
3219 dependency = ((Method*)ref)->method_holder()->java_mirror(); |
|
3220 break; |
|
3221 case MN_IS_FIELD: |
|
3222 assert(ref->is_klass(), "should be a class"); |
|
3223 dependency = ((Klass*)ref)->java_mirror(); |
|
3224 break; |
|
3225 default: |
|
3226 ShouldNotReachHere(); |
|
3227 } |
|
3228 } |
|
3229 mname->address_field_put(_vmtarget_offset, (address)ref); |
|
3230 // Add a reference to the loader (actually mirror because anonymous classes will not have |
|
3231 // distinct loaders) to ensure the metadata is kept alive |
|
3232 // This mirror may be different than the one in clazz field. |
|
3233 mname->obj_field_put(_vmloader_offset, dependency); |
|
3234 } |
3222 } |
3235 |
3223 |
3236 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { |
3224 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) { |
3237 assert(is_instance(mname), "wrong type"); |
3225 assert(is_instance(mname), "wrong type"); |
3238 return (intptr_t) mname->address_field(_vmindex_offset); |
3226 return (intptr_t) mname->address_field(_vmindex_offset); |
3241 void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) { |
3229 void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) { |
3242 assert(is_instance(mname), "wrong type"); |
3230 assert(is_instance(mname), "wrong type"); |
3243 mname->address_field_put(_vmindex_offset, (address) index); |
3231 mname->address_field_put(_vmindex_offset, (address) index); |
3244 } |
3232 } |
3245 |
3233 |
3246 bool java_lang_invoke_MemberName::equals(oop mn1, oop mn2) { |
3234 |
3247 if (mn1 == mn2) { |
3235 Method* java_lang_invoke_ResolvedMethodName::vmtarget(oop resolved_method) { |
3248 return true; |
3236 assert(is_instance(resolved_method), "wrong type"); |
3249 } |
3237 Method* m = (Method*)resolved_method->address_field(_vmtarget_offset); |
3250 return (vmtarget(mn1) == vmtarget(mn2) && flags(mn1) == flags(mn2) && |
3238 assert(m->is_method(), "must be"); |
3251 vmindex(mn1) == vmindex(mn2) && |
3239 return m; |
3252 clazz(mn1) == clazz(mn2)); |
3240 } |
|
3241 |
|
3242 // Used by redefinition to change Method* to new Method* with same hash (name, signature) |
|
3243 void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) { |
|
3244 assert(is_instance(resolved_method), "wrong type"); |
|
3245 resolved_method->address_field_put(_vmtarget_offset, (address)m); |
|
3246 } |
|
3247 |
|
3248 oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPS) { |
|
3249 // lookup ResolvedMethod oop in the table, or create a new one and intern it |
|
3250 oop resolved_method = ResolvedMethodTable::find_method(m()); |
|
3251 if (resolved_method == NULL) { |
|
3252 InstanceKlass* k = SystemDictionary::ResolvedMethodName_klass(); |
|
3253 if (!k->is_initialized()) { |
|
3254 k->initialize(CHECK_NULL); |
|
3255 } |
|
3256 oop new_resolved_method = k->allocate_instance(CHECK_NULL); |
|
3257 new_resolved_method->address_field_put(_vmtarget_offset, (address)m()); |
|
3258 // Add a reference to the loader (actually mirror because anonymous classes will not have |
|
3259 // distinct loaders) to ensure the metadata is kept alive. |
|
3260 // This mirror may be different than the one in clazz field. |
|
3261 new_resolved_method->obj_field_put(_vmholder_offset, m->method_holder()->java_mirror()); |
|
3262 resolved_method = ResolvedMethodTable::add_method(Handle(THREAD, new_resolved_method)); |
|
3263 } |
|
3264 return resolved_method; |
3253 } |
3265 } |
3254 |
3266 |
3255 oop java_lang_invoke_LambdaForm::vmentry(oop lform) { |
3267 oop java_lang_invoke_LambdaForm::vmentry(oop lform) { |
3256 assert(is_instance(lform), "wrong type"); |
3268 assert(is_instance(lform), "wrong type"); |
3257 return lform->obj_field(_vmentry_offset); |
3269 return lform->obj_field(_vmentry_offset); |
3854 java_lang_Thread::compute_offsets(); |
3866 java_lang_Thread::compute_offsets(); |
3855 java_lang_ThreadGroup::compute_offsets(); |
3867 java_lang_ThreadGroup::compute_offsets(); |
3856 java_lang_invoke_MethodHandle::compute_offsets(); |
3868 java_lang_invoke_MethodHandle::compute_offsets(); |
3857 java_lang_invoke_DirectMethodHandle::compute_offsets(); |
3869 java_lang_invoke_DirectMethodHandle::compute_offsets(); |
3858 java_lang_invoke_MemberName::compute_offsets(); |
3870 java_lang_invoke_MemberName::compute_offsets(); |
|
3871 java_lang_invoke_ResolvedMethodName::compute_offsets(); |
3859 java_lang_invoke_LambdaForm::compute_offsets(); |
3872 java_lang_invoke_LambdaForm::compute_offsets(); |
3860 java_lang_invoke_MethodType::compute_offsets(); |
3873 java_lang_invoke_MethodType::compute_offsets(); |
3861 java_lang_invoke_CallSite::compute_offsets(); |
3874 java_lang_invoke_CallSite::compute_offsets(); |
3862 java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets(); |
3875 java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets(); |
3863 java_security_AccessControlContext::compute_offsets(); |
3876 java_security_AccessControlContext::compute_offsets(); |