< prev index next >

src/hotspot/share/classfile/systemDictionary.cpp

Print this page
rev 49420 : 8200238: Reduce number of exceptions created when calling MemberName$Factory::resolveOrNull
Reviewed-by: lfoltan, acorn


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 }


< prev index next >