Mercurial > hg > truffle
diff src/share/vm/interpreter/linkResolver.cpp @ 1508:2ffde6cfe049
6939196: method handle signatures off the boot class path get linkage errors
Summary: Adjust MethodType lookup logic to search off the BCP, but not to cache those results
Reviewed-by: twisti
author | jrose |
---|---|
date | Sat, 01 May 2010 21:57:35 -0700 |
parents | cd5dbf694d45 |
children | c18cbe5936b8 |
line wrap: on
line diff
--- a/src/share/vm/interpreter/linkResolver.cpp Sat May 01 02:42:18 2010 -0700 +++ b/src/share/vm/interpreter/linkResolver.cpp Sat May 01 21:57:35 2010 -0700 @@ -172,14 +172,16 @@ result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature())); } -void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { +void LinkResolver::lookup_implicit_method(methodHandle& result, + KlassHandle klass, symbolHandle name, symbolHandle signature, + KlassHandle current_klass, + TRAPS) { if (EnableMethodHandles && MethodHandles::enabled() && klass() == SystemDictionary::MethodHandle_klass() && methodOopDesc::is_method_handle_invoke_name(name())) { methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, signature, - Handle(), - Handle(), + current_klass, CHECK); if (result_oop != NULL) { assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent"); @@ -290,7 +292,7 @@ if (resolved_method.is_null()) { // JSR 292: see if this is an implicitly generated method MethodHandle.invoke(*...) - lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); + lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); } if (resolved_method.is_null()) { @@ -1058,7 +1060,8 @@ // JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) // The extra MH receiver will be inserted into the stack on every call. methodHandle resolved_method; - lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); + KlassHandle current_klass(THREAD, pool->pool_holder()); + lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); if (resolved_method.is_null()) { THROW(vmSymbols::java_lang_InternalError()); }