1.1 --- a/src/share/vm/interpreter/linkResolver.cpp Mon Apr 20 14:48:03 2009 -0700 1.2 +++ b/src/share/vm/interpreter/linkResolver.cpp Tue Apr 21 23:21:04 2009 -0700 1.3 @@ -947,6 +947,7 @@ 1.4 case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break; 1.5 case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break; 1.6 case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break; 1.7 + case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break; 1.8 case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break; 1.9 } 1.10 return; 1.11 @@ -1008,6 +1009,30 @@ 1.12 resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK); 1.13 } 1.14 1.15 + 1.16 +void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int raw_index, TRAPS) { 1.17 + assert(EnableInvokeDynamic, ""); 1.18 + 1.19 + // This guy is reached from InterpreterRuntime::resolve_invokedynamic. 1.20 + 1.21 + assert(constantPoolCacheOopDesc::is_secondary_index(raw_index), "must be secondary index"); 1.22 + int nt_index = pool->map_instruction_operand_to_index(raw_index); 1.23 + 1.24 + // At this point, we only need the signature, and can ignore the name. 1.25 + symbolHandle method_signature(THREAD, pool->nt_signature_ref_at(nt_index)); 1.26 + symbolHandle method_name = vmSymbolHandles::invoke_name(); 1.27 + KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); 1.28 + 1.29 + // JSR 292: this must be an implicitly generated method MethodHandle.invoke(*...) 1.30 + // The extra MH receiver will be inserted into the stack on every call. 1.31 + methodHandle resolved_method; 1.32 + lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); 1.33 + if (resolved_method.is_null()) { 1.34 + THROW(vmSymbols::java_lang_InternalError()); 1.35 + } 1.36 + result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK); 1.37 +} 1.38 + 1.39 //------------------------------------------------------------------------------------------------------------------------ 1.40 #ifndef PRODUCT 1.41