--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Fri Apr 30 08:37:24 2010 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Sat May 01 02:42:18 2010 -0700
@@ -138,6 +138,15 @@
void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
methodOop result_oop = klass->uncached_lookup_method(name(), signature());
+ if (EnableMethodHandles && result_oop != NULL) {
+ switch (result_oop->intrinsic_id()) {
+ case vmIntrinsics::_invokeExact:
+ case vmIntrinsics::_invokeGeneric:
+ case vmIntrinsics::_invokeDynamic:
+ // Do not link directly to these. The VM must produce a synthetic one using lookup_implicit_method.
+ return;
+ }
+ }
result = methodHandle(THREAD, result_oop);
}
@@ -165,8 +174,10 @@
void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
if (EnableMethodHandles && MethodHandles::enabled() &&
- name == vmSymbolHandles::invoke_name() && klass() == SystemDictionary::MethodHandle_klass()) {
- methodOop result_oop = SystemDictionary::find_method_handle_invoke(signature,
+ klass() == SystemDictionary::MethodHandle_klass() &&
+ methodOopDesc::is_method_handle_invoke_name(name())) {
+ methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
+ signature,
Handle(),
Handle(),
CHECK);
@@ -239,7 +250,7 @@
// The class is java.dyn.MethodHandle
resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
- symbolHandle method_name = vmSymbolHandles::invoke_name();
+ symbolHandle method_name = vmSymbolHandles::invokeExact_name();
symbolHandle method_signature(THREAD, pool->signature_ref_at(index));
KlassHandle current_klass (THREAD, pool->pool_holder());
@@ -1041,10 +1052,10 @@
// At this point, we only need the signature, and can ignore the name.
symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index)); // raw_index works directly
- symbolHandle method_name = vmSymbolHandles::invoke_name();
+ symbolHandle method_name = vmSymbolHandles::invokeExact_name();
KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
- // JSR 292: this must be an implicitly generated method MethodHandle.invoke(*...)
+ // 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);