< prev index next >

src/hotspot/share/interpreter/linkResolver.cpp

Print this page
rev 58631 : imported patch link_selected_klass

*** 62,98 **** // Implementation of CallInfo void CallInfo::set_static(Klass* resolved_klass, const methodHandle& resolved_method, TRAPS) { int vtable_index = Method::nonvirtual_vtable_index; ! set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK); } void CallInfo::set_interface(Klass* resolved_klass, - Klass* selected_klass, const methodHandle& resolved_method, const methodHandle& selected_method, int itable_index, TRAPS) { // This is only called for interface methods. If the resolved_method // comes from java/lang/Object, it can be the subject of a virtual call, so // we should pick the vtable index from the resolved method. // In that case, the caller must call set_virtual instead of set_interface. assert(resolved_method->method_holder()->is_interface(), ""); assert(itable_index == resolved_method()->itable_index(), ""); ! set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK); } void CallInfo::set_virtual(Klass* resolved_klass, - Klass* selected_klass, const methodHandle& resolved_method, const methodHandle& selected_method, int vtable_index, TRAPS) { assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index"); assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), ""); CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call); ! set_common(resolved_klass, selected_klass, resolved_method, selected_method, kind, vtable_index, CHECK); assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call"); } void CallInfo::set_handle(const methodHandle& resolved_method, Handle resolved_appendix, TRAPS) { --- 62,96 ---- // Implementation of CallInfo void CallInfo::set_static(Klass* resolved_klass, const methodHandle& resolved_method, TRAPS) { int vtable_index = Method::nonvirtual_vtable_index; ! set_common(resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK); } void CallInfo::set_interface(Klass* resolved_klass, const methodHandle& resolved_method, const methodHandle& selected_method, int itable_index, TRAPS) { // This is only called for interface methods. If the resolved_method // comes from java/lang/Object, it can be the subject of a virtual call, so // we should pick the vtable index from the resolved method. // In that case, the caller must call set_virtual instead of set_interface. assert(resolved_method->method_holder()->is_interface(), ""); assert(itable_index == resolved_method()->itable_index(), ""); ! set_common(resolved_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK); } void CallInfo::set_virtual(Klass* resolved_klass, const methodHandle& resolved_method, const methodHandle& selected_method, int vtable_index, TRAPS) { assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index"); assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), ""); CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call); ! set_common(resolved_klass, resolved_method, selected_method, kind, vtable_index, CHECK); assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call"); } void CallInfo::set_handle(const methodHandle& resolved_method, Handle resolved_appendix, TRAPS) {
*** 106,129 **** assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic || resolved_method->is_compiled_lambda_form(), "linkMethod must return one of these"); int vtable_index = Method::nonvirtual_vtable_index; assert(!resolved_method->has_vtable_index(), ""); ! set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK); _resolved_appendix = resolved_appendix; } void CallInfo::set_common(Klass* resolved_klass, - Klass* selected_klass, const methodHandle& resolved_method, const methodHandle& selected_method, CallKind kind, int index, TRAPS) { assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); _resolved_klass = resolved_klass; - _selected_klass = selected_klass; _resolved_method = resolved_method; _selected_method = selected_method; _call_kind = kind; _call_index = index; _resolved_appendix = Handle(); --- 104,125 ---- assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic || resolved_method->is_compiled_lambda_form(), "linkMethod must return one of these"); int vtable_index = Method::nonvirtual_vtable_index; assert(!resolved_method->has_vtable_index(), ""); ! set_common(resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK); _resolved_appendix = resolved_appendix; } void CallInfo::set_common(Klass* resolved_klass, const methodHandle& resolved_method, const methodHandle& selected_method, CallKind kind, int index, TRAPS) { assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); _resolved_klass = resolved_klass; _resolved_method = resolved_method; _selected_method = selected_method; _call_kind = kind; _call_index = index; _resolved_appendix = Handle();
*** 137,147 **** Klass* resolved_method_holder = resolved_method->method_holder(); if (resolved_klass == NULL) { // 2nd argument defaults to holder of 1st resolved_klass = resolved_method_holder; } _resolved_klass = resolved_klass; - _selected_klass = resolved_klass; _resolved_method = methodHandle(THREAD, resolved_method); _selected_method = methodHandle(THREAD, resolved_method); // classify: CallKind kind = CallInfo::unknown_kind; int index = resolved_method->vtable_index(); --- 133,142 ----
*** 1395,1405 **** trace_method_resolution("invokevirtual selected method: receiver-class:", recv_klass, resolved_klass, selected_method(), false, vtable_index); } // setup result ! result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK); } void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass, const LinkInfo& link_info, bool check_null_and_abstract, TRAPS) { --- 1390,1400 ---- trace_method_resolution("invokevirtual selected method: receiver-class:", recv_klass, resolved_klass, selected_method(), false, vtable_index); } // setup result ! result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK); } void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass, const LinkInfo& link_info, bool check_null_and_abstract, TRAPS) {
*** 1491,1515 **** // setup result if (resolved_method->has_vtable_index()) { int vtable_index = resolved_method->vtable_index(); log_develop_trace(itables)(" -- vtable index: %d", vtable_index); assert(vtable_index == selected_method->vtable_index(), "sanity check"); ! result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK); } else if (resolved_method->has_itable_index()) { int itable_index = resolved_method()->itable_index(); log_develop_trace(itables)(" -- itable index: %d", itable_index); ! result.set_interface(resolved_klass, recv_klass, resolved_method, selected_method, itable_index, CHECK); } else { int index = resolved_method->vtable_index(); log_develop_trace(itables)(" -- non itable/vtable index: %d", index); assert(index == Method::nonvirtual_vtable_index, "Oops hit another case!"); assert(resolved_method()->is_private() || (resolved_method()->is_final() && resolved_method->method_holder() == SystemDictionary::Object_klass()), "Should only have non-virtual invokeinterface for private or final-Object methods!"); assert(resolved_method()->can_be_statically_bound(), "Should only have non-virtual invokeinterface for statically bound methods!"); // This sets up the nonvirtual form of "virtual" call (as needed for final and private methods) ! result.set_virtual(resolved_klass, resolved_klass, resolved_method, resolved_method, index, CHECK); } } Method* LinkResolver::linktime_resolve_interface_method_or_null( --- 1486,1510 ---- // setup result if (resolved_method->has_vtable_index()) { int vtable_index = resolved_method->vtable_index(); log_develop_trace(itables)(" -- vtable index: %d", vtable_index); assert(vtable_index == selected_method->vtable_index(), "sanity check"); ! result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK); } else if (resolved_method->has_itable_index()) { int itable_index = resolved_method()->itable_index(); log_develop_trace(itables)(" -- itable index: %d", itable_index); ! result.set_interface(resolved_klass, resolved_method, selected_method, itable_index, CHECK); } else { int index = resolved_method->vtable_index(); log_develop_trace(itables)(" -- non itable/vtable index: %d", index); assert(index == Method::nonvirtual_vtable_index, "Oops hit another case!"); assert(resolved_method()->is_private() || (resolved_method()->is_final() && resolved_method->method_holder() == SystemDictionary::Object_klass()), "Should only have non-virtual invokeinterface for private or final-Object methods!"); assert(resolved_method()->can_be_statically_bound(), "Should only have non-virtual invokeinterface for statically bound methods!"); // This sets up the nonvirtual form of "virtual" call (as needed for final and private methods) ! result.set_virtual(resolved_klass, resolved_method, resolved_method, index, CHECK); } } Method* LinkResolver::linktime_resolve_interface_method_or_null(
< prev index next >