< prev index next >

src/share/vm/ci/ciMethod.cpp

Print this page

        

*** 780,807 **** // Return NULL if the call has no target or the target is abstract. ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access) { check_is_loaded(); VM_ENTRY_MARK; ! KlassHandle caller_klass (THREAD, caller->get_Klass()); ! KlassHandle h_recv (THREAD, exact_receiver->get_Klass()); ! KlassHandle h_resolved (THREAD, holder()->get_Klass()); Symbol* h_name = name()->get_symbol(); Symbol* h_signature = signature()->get_symbol(); ! LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, check_access ? LinkInfo::needs_access_check : LinkInfo::skip_access_check); methodHandle m; // Only do exact lookup if receiver klass has been linked. Otherwise, // the vtable has not been setup, and the LinkResolver will fail. ! if (h_recv->is_array_klass() || ! InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) { if (holder()->is_interface()) { ! m = LinkResolver::resolve_interface_call_or_null(h_recv, link_info); } else { ! m = LinkResolver::resolve_virtual_call_or_null(h_recv, link_info); } } if (m.is_null()) { // Return NULL only if there was a problem with lookup (uninitialized class, etc.) --- 780,807 ---- // Return NULL if the call has no target or the target is abstract. ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access) { check_is_loaded(); VM_ENTRY_MARK; ! Klass* caller_klass = caller->get_Klass(); ! Klass* recv = exact_receiver->get_Klass(); ! Klass* resolved = holder()->get_Klass(); Symbol* h_name = name()->get_symbol(); Symbol* h_signature = signature()->get_symbol(); ! LinkInfo link_info(resolved, h_name, h_signature, caller_klass, check_access ? LinkInfo::needs_access_check : LinkInfo::skip_access_check); methodHandle m; // Only do exact lookup if receiver klass has been linked. Otherwise, // the vtable has not been setup, and the LinkResolver will fail. ! if (recv->is_array_klass() || ! InstanceKlass::cast(recv)->is_linked() && !exact_receiver->is_interface()) { if (holder()->is_interface()) { ! m = LinkResolver::resolve_interface_call_or_null(recv, link_info); } else { ! m = LinkResolver::resolve_virtual_call_or_null(recv, link_info); } } if (m.is_null()) { // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
*** 836,852 **** if (!receiver->is_interface() && (!receiver->is_instance_klass() || receiver->as_instance_klass()->is_linked())) { VM_ENTRY_MARK; ! KlassHandle caller_klass (THREAD, caller->get_Klass()); ! KlassHandle h_recv (THREAD, receiver->get_Klass()); Symbol* h_name = name()->get_symbol(); Symbol* h_signature = signature()->get_symbol(); ! LinkInfo link_info(h_recv, h_name, h_signature, caller_klass); ! vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, link_info); if (vtable_index == Method::nonvirtual_vtable_index) { // A statically bound method. Return "no such index". vtable_index = Method::invalid_vtable_index; } } --- 836,852 ---- if (!receiver->is_interface() && (!receiver->is_instance_klass() || receiver->as_instance_klass()->is_linked())) { VM_ENTRY_MARK; ! Klass* caller_klass = caller->get_Klass(); ! Klass* recv = receiver->get_Klass(); Symbol* h_name = name()->get_symbol(); Symbol* h_signature = signature()->get_symbol(); ! LinkInfo link_info(recv, h_name, h_signature, caller_klass); ! vtable_index = LinkResolver::resolve_virtual_vtable_index(recv, link_info); if (vtable_index == Method::nonvirtual_vtable_index) { // A statically bound method. Return "no such index". vtable_index = Method::invalid_vtable_index; } }
< prev index next >