equal
deleted
inserted
replaced
653 |
653 |
654 if (resolved_method->method_holder()->is_interface()) { // miranda method |
654 if (resolved_method->method_holder()->is_interface()) { // miranda method |
655 vtable_index = LinkResolver::vtable_index_of_interface_method(holder_klass, resolved_method); |
655 vtable_index = LinkResolver::vtable_index_of_interface_method(holder_klass, resolved_method); |
656 assert(vtable_index >= 0 , "we should have valid vtable index at this point"); |
656 assert(vtable_index >= 0 , "we should have valid vtable index at this point"); |
657 |
657 |
658 InstanceKlass* inst = InstanceKlass::cast(recv_klass); |
658 selected_method = recv_klass->method_at_vtable(vtable_index); |
659 selected_method = inst->method_at_vtable(vtable_index); |
|
660 } else { |
659 } else { |
661 // at this point we are sure that resolved_method is virtual and not |
660 // at this point we are sure that resolved_method is virtual and not |
662 // a miranda method; therefore, it must have a valid vtable index. |
661 // a miranda method; therefore, it must have a valid vtable index. |
663 assert(!resolved_method->has_itable_index(), ""); |
662 assert(!resolved_method->has_itable_index(), ""); |
664 vtable_index = resolved_method->vtable_index(); |
663 vtable_index = resolved_method->vtable_index(); |
669 // method, and it can never be changed by an override. |
668 // method, and it can never be changed by an override. |
670 if (vtable_index == Method::nonvirtual_vtable_index) { |
669 if (vtable_index == Method::nonvirtual_vtable_index) { |
671 assert(resolved_method->can_be_statically_bound(), "cannot override this method"); |
670 assert(resolved_method->can_be_statically_bound(), "cannot override this method"); |
672 selected_method = resolved_method(); |
671 selected_method = resolved_method(); |
673 } else { |
672 } else { |
674 // recv_klass might be an arrayKlassOop but all vtables start at |
673 selected_method = recv_klass->method_at_vtable(vtable_index); |
675 // the same place. The cast is to avoid virtual call and assertion. |
|
676 InstanceKlass* inst = (InstanceKlass*)recv_klass; |
|
677 selected_method = inst->method_at_vtable(vtable_index); |
|
678 } |
674 } |
679 } |
675 } |
680 oop result = CompilerToVM::get_jvmci_method(selected_method, CHECK_NULL); |
676 oop result = CompilerToVM::get_jvmci_method(selected_method, CHECK_NULL); |
681 return JNIHandles::make_local(THREAD, result); |
677 return JNIHandles::make_local(THREAD, result); |
682 } |
678 } |