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; |