8281866: Enhance MethodHandle invocations
Co-authored-by: Vladimir Ivanov <vlivanov@openjdk.org> Reviewed-by: chagedorn
This commit is contained in:
parent
84b4e9bb41
commit
632d2d2690
@ -1735,8 +1735,31 @@ void LinkResolver::resolve_handle_call(CallInfo& result,
|
||||
resolved_klass == vmClasses::VarHandle_klass(), "");
|
||||
assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), "");
|
||||
Handle resolved_appendix;
|
||||
Method* resolved_method = lookup_polymorphic_method(link_info, &resolved_appendix, CHECK);
|
||||
result.set_handle(resolved_klass, methodHandle(THREAD, resolved_method), resolved_appendix, CHECK);
|
||||
Method* m = lookup_polymorphic_method(link_info, &resolved_appendix, CHECK);
|
||||
methodHandle resolved_method(THREAD, m);
|
||||
|
||||
if (link_info.check_access()) {
|
||||
Symbol* name = link_info.name();
|
||||
vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
|
||||
if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
|
||||
// Check if method can be accessed by the referring class.
|
||||
// MH.linkTo* invocations are not rewritten to invokehandle.
|
||||
assert(iid == vmIntrinsicID::_invokeBasic, "%s", vmIntrinsics::name_at(iid));
|
||||
|
||||
Klass* current_klass = link_info.current_klass();
|
||||
assert(current_klass != NULL , "current_klass should not be null");
|
||||
check_method_accessability(current_klass,
|
||||
resolved_klass,
|
||||
resolved_method->method_holder(),
|
||||
resolved_method,
|
||||
CHECK);
|
||||
} else {
|
||||
// Java code is free to arbitrarily link signature-polymorphic invokers.
|
||||
assert(iid == vmIntrinsics::_invokeGeneric, "not an invoker: %s", vmIntrinsics::name_at(iid));
|
||||
assert(MethodHandles::is_signature_polymorphic_public_name(resolved_klass, name), "not public");
|
||||
}
|
||||
}
|
||||
result.set_handle(resolved_klass, resolved_method, resolved_appendix, CHECK);
|
||||
JFR_ONLY(Jfr::on_resolution(result, CHECK);)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user