src/share/vm/interpreter/linkResolver.cpp

changeset 1161
be93aad57795
parent 1145
e5b0439ef4ae
child 1494
389049f3f393
     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  

mercurial