--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Mon Apr 20 14:48:03 2009 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Tue Apr 21 23:21:04 2009 -0700
@@ -947,6 +947,7 @@
case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break;
+ case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
}
return;
@@ -1008,6 +1009,30 @@
resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
}
+
+void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int raw_index, TRAPS) {
+ assert(EnableInvokeDynamic, "");
+
+ // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
+
+ assert(constantPoolCacheOopDesc::is_secondary_index(raw_index), "must be secondary index");
+ int nt_index = pool->map_instruction_operand_to_index(raw_index);
+
+ // At this point, we only need the signature, and can ignore the name.
+ symbolHandle method_signature(THREAD, pool->nt_signature_ref_at(nt_index));
+ symbolHandle method_name = vmSymbolHandles::invoke_name();
+ KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
+
+ // JSR 292: this must be an implicitly generated method MethodHandle.invoke(*...)
+ // 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);
+ if (resolved_method.is_null()) {
+ THROW(vmSymbols::java_lang_InternalError());
+ }
+ result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
+}
+
//------------------------------------------------------------------------------------------------------------------------
#ifndef PRODUCT