Mercurial > hg > truffle
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; |