2773 Handle mname = MemberName_klass()->allocate_instance_handle(CHECK_(empty)); |
2773 Handle mname = MemberName_klass()->allocate_instance_handle(CHECK_(empty)); |
2774 java_lang_invoke_MemberName::set_clazz(mname(), callee->java_mirror()); |
2774 java_lang_invoke_MemberName::set_clazz(mname(), callee->java_mirror()); |
2775 java_lang_invoke_MemberName::set_name (mname(), name_str()); |
2775 java_lang_invoke_MemberName::set_name (mname(), name_str()); |
2776 java_lang_invoke_MemberName::set_type (mname(), signature_str()); |
2776 java_lang_invoke_MemberName::set_type (mname(), signature_str()); |
2777 java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind)); |
2777 java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind)); |
2778 MethodHandles::resolve_MemberName(mname, caller, CHECK_(empty)); |
2778 |
|
2779 if (ref_kind == JVM_REF_invokeVirtual && |
|
2780 callee->name() == vmSymbols::java_lang_invoke_MethodHandle() && |
|
2781 (name == vmSymbols::invoke_name() || name == vmSymbols::invokeExact_name())) { |
|
2782 // Skip resolution for j.l.i.MethodHandle.invoke()/invokeExact(). |
|
2783 // They are public signature polymorphic methods, but require appendix argument |
|
2784 // which MemberName resolution doesn't handle. There's special logic on JDK side to handle them |
|
2785 // (see MethodHandles.linkMethodHandleConstant() and MethodHandles.findVirtualForMH()). |
|
2786 } else { |
|
2787 MethodHandles::resolve_MemberName(mname, caller, CHECK_(empty)); |
|
2788 } |
2779 |
2789 |
2780 // After method/field resolution succeeded, it's safe to resolve MH signature as well. |
2790 // After method/field resolution succeeded, it's safe to resolve MH signature as well. |
2781 Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty)); |
2791 Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty)); |
2782 |
2792 |
2783 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2793 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |