diff -r b40330c06dea -r bca375d368ed hotspot/src/share/vm/interpreter/linkResolver.cpp --- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Mar 24 09:09:52 2016 +0100 +++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Mar 24 11:21:49 2016 +0100 @@ -90,10 +90,16 @@ void CallInfo::set_handle(const methodHandle& resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) { + set_handle(SystemDictionary::MethodHandle_klass(), resolved_method, resolved_appendix, resolved_method_type, CHECK); +} + +void CallInfo::set_handle(KlassHandle resolved_klass, + const methodHandle& resolved_method, + Handle resolved_appendix, + Handle resolved_method_type, TRAPS) { if (resolved_method.is_null()) { THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null"); } - KlassHandle resolved_klass = SystemDictionary::MethodHandle_klass(); assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic || resolved_method->is_compiled_lambda_form(), "linkMethod must return one of these"); @@ -426,7 +432,8 @@ vmIntrinsics::name_at(iid), klass->external_name(), name->as_C_string(), full_signature->as_C_string()); } - if (klass() == SystemDictionary::MethodHandle_klass() && + if ((klass() == SystemDictionary::MethodHandle_klass() || + klass() == SystemDictionary::VarHandle_klass()) && iid != vmIntrinsics::_none) { if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) { // Most of these do not need an up-call to Java to resolve, so can be done anywhere. @@ -475,6 +482,7 @@ Handle appendix; Handle method_type; methodHandle result = SystemDictionary::find_method_handle_invoker( + klass, name, full_signature, link_info.current_klass(), @@ -1554,13 +1562,15 @@ const LinkInfo& link_info, TRAPS) { // JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar - assert(link_info.resolved_klass()() == SystemDictionary::MethodHandle_klass(), ""); + KlassHandle resolved_klass = link_info.resolved_klass(); + assert(resolved_klass() == SystemDictionary::MethodHandle_klass() || + resolved_klass() == SystemDictionary::VarHandle_klass(), ""); assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), ""); Handle resolved_appendix; Handle resolved_method_type; methodHandle resolved_method = lookup_polymorphic_method(link_info, &resolved_appendix, &resolved_method_type, CHECK); - result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK); + result.set_handle(resolved_klass, resolved_method, resolved_appendix, resolved_method_type, CHECK); } static void wrap_invokedynamic_exception(TRAPS) {