2776 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty);
2777 }
2778 Handle name_str = java_lang_String::create_from_symbol(name, CHECK_(empty));
2779 Handle signature_str = java_lang_String::create_from_symbol(signature, CHECK_(empty));
2780
2781 // Put symbolic info from the MH constant into freshly created MemberName and resolve it.
2782 Handle mname = MemberName_klass()->allocate_instance_handle(CHECK_(empty));
2783 java_lang_invoke_MemberName::set_clazz(mname(), callee->java_mirror());
2784 java_lang_invoke_MemberName::set_name (mname(), name_str());
2785 java_lang_invoke_MemberName::set_type (mname(), signature_str());
2786 java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind));
2787
2788 if (ref_kind == JVM_REF_invokeVirtual &&
2789 callee->name() == vmSymbols::java_lang_invoke_MethodHandle() &&
2790 (name == vmSymbols::invoke_name() || name == vmSymbols::invokeExact_name())) {
2791 // Skip resolution for j.l.i.MethodHandle.invoke()/invokeExact().
2792 // They are public signature polymorphic methods, but require appendix argument
2793 // which MemberName resolution doesn't handle. There's special logic on JDK side to handle them
2794 // (see MethodHandles.linkMethodHandleConstant() and MethodHandles.findVirtualForMH()).
2795 } else {
2796 MethodHandles::resolve_MemberName(mname, caller, CHECK_(empty));
2797 }
2798
2799 // After method/field resolution succeeded, it's safe to resolve MH signature as well.
2800 Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty));
2801
2802 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle
2803 JavaCallArguments args;
2804 args.push_oop(Handle(THREAD, caller->java_mirror())); // the referring class
2805 args.push_int(ref_kind);
2806 args.push_oop(Handle(THREAD, callee->java_mirror())); // the target class
2807 args.push_oop(name_str);
2808 args.push_oop(type);
2809 JavaValue result(T_OBJECT);
2810 JavaCalls::call_static(&result,
2811 SystemDictionary::MethodHandleNatives_klass(),
2812 vmSymbols::linkMethodHandleConstant_name(),
2813 vmSymbols::linkMethodHandleConstant_signature(),
2814 &args, CHECK_(empty));
2815 return Handle(THREAD, (oop) result.get_jobject());
2816 }
|
2776 THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty);
2777 }
2778 Handle name_str = java_lang_String::create_from_symbol(name, CHECK_(empty));
2779 Handle signature_str = java_lang_String::create_from_symbol(signature, CHECK_(empty));
2780
2781 // Put symbolic info from the MH constant into freshly created MemberName and resolve it.
2782 Handle mname = MemberName_klass()->allocate_instance_handle(CHECK_(empty));
2783 java_lang_invoke_MemberName::set_clazz(mname(), callee->java_mirror());
2784 java_lang_invoke_MemberName::set_name (mname(), name_str());
2785 java_lang_invoke_MemberName::set_type (mname(), signature_str());
2786 java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind));
2787
2788 if (ref_kind == JVM_REF_invokeVirtual &&
2789 callee->name() == vmSymbols::java_lang_invoke_MethodHandle() &&
2790 (name == vmSymbols::invoke_name() || name == vmSymbols::invokeExact_name())) {
2791 // Skip resolution for j.l.i.MethodHandle.invoke()/invokeExact().
2792 // They are public signature polymorphic methods, but require appendix argument
2793 // which MemberName resolution doesn't handle. There's special logic on JDK side to handle them
2794 // (see MethodHandles.linkMethodHandleConstant() and MethodHandles.findVirtualForMH()).
2795 } else {
2796 MethodHandles::resolve_MemberName(mname, caller, /*speculative_resolve*/false, CHECK_(empty));
2797 }
2798
2799 // After method/field resolution succeeded, it's safe to resolve MH signature as well.
2800 Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty));
2801
2802 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle
2803 JavaCallArguments args;
2804 args.push_oop(Handle(THREAD, caller->java_mirror())); // the referring class
2805 args.push_int(ref_kind);
2806 args.push_oop(Handle(THREAD, callee->java_mirror())); // the target class
2807 args.push_oop(name_str);
2808 args.push_oop(type);
2809 JavaValue result(T_OBJECT);
2810 JavaCalls::call_static(&result,
2811 SystemDictionary::MethodHandleNatives_klass(),
2812 vmSymbols::linkMethodHandleConstant_name(),
2813 vmSymbols::linkMethodHandleConstant_signature(),
2814 &args, CHECK_(empty));
2815 return Handle(THREAD, (oop) result.get_jobject());
2816 }
|