hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
changeset 35900 d64cf9290fc4
parent 35899 0dbc821628fc
child 35913 928548a43408
equal deleted inserted replaced
35899:0dbc821628fc 35900:d64cf9290fc4
   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     }