comparison src/share/vm/interpreter/linkResolver.cpp @ 726:be93aad57795

6655646: dynamic languages need dynamically linked call sites Summary: invokedynamic instruction (JSR 292 RI) Reviewed-by: twisti, never
author jrose
date Tue, 21 Apr 2009 23:21:04 -0700
parents e5b0439ef4ae
children 389049f3f393
comparison
equal deleted inserted replaced
725:928912ce8438 726:be93aad57795
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;