hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 2570 ecc7862946d4
parent 2534 08dac9ce0cd7
child 4429 d7eb4e2099aa
equal deleted inserted replaced
2569:9e8daec25638 2570:ecc7862946d4
   945 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
   945 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
   946   switch (byte) {
   946   switch (byte) {
   947     case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
   947     case Bytecodes::_invokestatic   : resolve_invokestatic   (result,       pool, index, CHECK); break;
   948     case Bytecodes::_invokespecial  : resolve_invokespecial  (result,       pool, index, CHECK); break;
   948     case Bytecodes::_invokespecial  : resolve_invokespecial  (result,       pool, index, CHECK); break;
   949     case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
   949     case Bytecodes::_invokevirtual  : resolve_invokevirtual  (result, recv, pool, index, CHECK); break;
       
   950     case Bytecodes::_invokedynamic  : resolve_invokedynamic  (result,       pool, index, CHECK); break;
   950     case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
   951     case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
   951   }
   952   }
   952   return;
   953   return;
   953 }
   954 }
   954 
   955 
  1006   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
  1007   resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
  1007   KlassHandle recvrKlass (THREAD, recv.is_null() ? (klassOop)NULL : recv->klass());
  1008   KlassHandle recvrKlass (THREAD, recv.is_null() ? (klassOop)NULL : recv->klass());
  1008   resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
  1009   resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
  1009 }
  1010 }
  1010 
  1011 
       
  1012 
       
  1013 void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int raw_index, TRAPS) {
       
  1014   assert(EnableInvokeDynamic, "");
       
  1015 
       
  1016   // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
       
  1017 
       
  1018   assert(constantPoolCacheOopDesc::is_secondary_index(raw_index), "must be secondary index");
       
  1019   int nt_index = pool->map_instruction_operand_to_index(raw_index);
       
  1020 
       
  1021   // At this point, we only need the signature, and can ignore the name.
       
  1022   symbolHandle method_signature(THREAD, pool->nt_signature_ref_at(nt_index));
       
  1023   symbolHandle method_name = vmSymbolHandles::invoke_name();
       
  1024   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
       
  1025 
       
  1026   // JSR 292:  this must be an implicitly generated method MethodHandle.invoke(*...)
       
  1027   // The extra MH receiver will be inserted into the stack on every call.
       
  1028   methodHandle resolved_method;
       
  1029   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
       
  1030   if (resolved_method.is_null()) {
       
  1031     THROW(vmSymbols::java_lang_InternalError());
       
  1032   }
       
  1033   result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
       
  1034 }
       
  1035 
  1011 //------------------------------------------------------------------------------------------------------------------------
  1036 //------------------------------------------------------------------------------------------------------------------------
  1012 #ifndef PRODUCT
  1037 #ifndef PRODUCT
  1013 
  1038 
  1014 void FieldAccessInfo::print() {
  1039 void FieldAccessInfo::print() {
  1015   ResourceMark rm;
  1040   ResourceMark rm;