--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Fri Dec 04 16:38:04 2015 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Fri Dec 04 23:46:19 2015 +0300
@@ -1456,6 +1456,33 @@
return;
}
+void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
+ const methodHandle& attached_method,
+ Bytecodes::Code byte, TRAPS) {
+ KlassHandle defc = attached_method->method_holder();
+ Symbol* name = attached_method->name();
+ Symbol* type = attached_method->signature();
+ LinkInfo link_info(defc, name, type, KlassHandle(), /*check_access=*/false);
+ switch(byte) {
+ case Bytecodes::_invokevirtual:
+ resolve_virtual_call(result, recv, recv->klass(), link_info,
+ /*check_null_and_abstract=*/true, CHECK);
+ break;
+ case Bytecodes::_invokeinterface:
+ resolve_interface_call(result, recv, recv->klass(), link_info,
+ /*check_null_and_abstract=*/true, CHECK);
+ break;
+ case Bytecodes::_invokestatic:
+ resolve_static_call(result, link_info, /*initialize_class=*/false, CHECK);
+ break;
+ case Bytecodes::_invokespecial:
+ resolve_special_call(result, link_info, CHECK);
+ break;
+ default:
+ fatal("bad call: %s", Bytecodes::name(byte));
+ }
+}
+
void LinkResolver::resolve_invokestatic(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) {
LinkInfo link_info(pool, index, CHECK);
resolve_static_call(result, link_info, /*initialize_class*/true, CHECK);