mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8194963: SystemDictionary::link_method_handle_constant() can't link MethodHandle.invoke()/invokeExact()
Reviewed-by: kvn, psandoz
This commit is contained in:
parent
4714dab4cb
commit
72ba3f508c
2 changed files with 12 additions and 1 deletions
|
@ -2775,7 +2775,17 @@ Handle SystemDictionary::link_method_handle_constant(Klass* caller,
|
||||||
java_lang_invoke_MemberName::set_name (mname(), name_str());
|
java_lang_invoke_MemberName::set_name (mname(), name_str());
|
||||||
java_lang_invoke_MemberName::set_type (mname(), signature_str());
|
java_lang_invoke_MemberName::set_type (mname(), signature_str());
|
||||||
java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind));
|
java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind));
|
||||||
|
|
||||||
|
if (ref_kind == JVM_REF_invokeVirtual &&
|
||||||
|
callee->name() == vmSymbols::java_lang_invoke_MethodHandle() &&
|
||||||
|
(name == vmSymbols::invoke_name() || name == vmSymbols::invokeExact_name())) {
|
||||||
|
// Skip resolution for j.l.i.MethodHandle.invoke()/invokeExact().
|
||||||
|
// They are public signature polymorphic methods, but require appendix argument
|
||||||
|
// which MemberName resolution doesn't handle. There's special logic on JDK side to handle them
|
||||||
|
// (see MethodHandles.linkMethodHandleConstant() and MethodHandles.findVirtualForMH()).
|
||||||
|
} else {
|
||||||
MethodHandles::resolve_MemberName(mname, caller, CHECK_(empty));
|
MethodHandles::resolve_MemberName(mname, caller, CHECK_(empty));
|
||||||
|
}
|
||||||
|
|
||||||
// After method/field resolution succeeded, it's safe to resolve MH signature as well.
|
// After method/field resolution succeeded, it's safe to resolve MH signature as well.
|
||||||
Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty));
|
Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty));
|
||||||
|
|
|
@ -304,6 +304,7 @@
|
||||||
/* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \
|
/* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \
|
||||||
template(findMethodHandleType_name, "findMethodHandleType") \
|
template(findMethodHandleType_name, "findMethodHandleType") \
|
||||||
template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \
|
template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \
|
||||||
|
template(invokeExact_name, "invokeExact") \
|
||||||
template(linkMethodHandleConstant_name, "linkMethodHandleConstant") \
|
template(linkMethodHandleConstant_name, "linkMethodHandleConstant") \
|
||||||
template(linkMethodHandleConstant_signature, "(Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;") \
|
template(linkMethodHandleConstant_signature, "(Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;") \
|
||||||
template(linkMethod_name, "linkMethod") \
|
template(linkMethod_name, "linkMethod") \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue