hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 46408 70aab0c2ea8b
parent 46329 53ccc37bda19
child 46458 3c12af929e7d
equal deleted inserted replaced
46407:32baebe49efe 46408:70aab0c2ea8b
   148   } else if (!resolved_method_holder->is_interface()) {
   148   } else if (!resolved_method_holder->is_interface()) {
   149     // Could be an Object method inherited into an interface, but still a vtable call.
   149     // Could be an Object method inherited into an interface, but still a vtable call.
   150     kind = CallInfo::vtable_call;
   150     kind = CallInfo::vtable_call;
   151   } else if (!resolved_klass->is_interface()) {
   151   } else if (!resolved_klass->is_interface()) {
   152     // A default or miranda method.  Compute the vtable index.
   152     // A default or miranda method.  Compute the vtable index.
   153     ResourceMark rm;
       
   154     klassVtable* vt = resolved_klass->vtable();
       
   155     index = LinkResolver::vtable_index_of_interface_method(resolved_klass,
   153     index = LinkResolver::vtable_index_of_interface_method(resolved_klass,
   156                            resolved_method);
   154                            resolved_method);
   157     assert(index >= 0 , "we should have valid vtable index at this point");
   155     assert(index >= 0 , "we should have valid vtable index at this point");
   158 
   156 
   159     kind = CallInfo::vtable_call;
   157     kind = CallInfo::vtable_call;
   161     // Can occur if an interface redeclares a method of Object.
   159     // Can occur if an interface redeclares a method of Object.
   162 
   160 
   163 #ifdef ASSERT
   161 #ifdef ASSERT
   164     // Ensure that this is really the case.
   162     // Ensure that this is really the case.
   165     Klass* object_klass = SystemDictionary::Object_klass();
   163     Klass* object_klass = SystemDictionary::Object_klass();
   166     Method * object_resolved_method = object_klass->vtable()->method_at(index);
   164     Method * object_resolved_method = object_klass->vtable().method_at(index);
   167     assert(object_resolved_method->name() == resolved_method->name(),
   165     assert(object_resolved_method->name() == resolved_method->name(),
   168       "Object and interface method names should match at vtable index %d, %s != %s",
   166       "Object and interface method names should match at vtable index %d, %s != %s",
   169       index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string());
   167       index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string());
   170     assert(object_resolved_method->signature() == resolved_method->signature(),
   168     assert(object_resolved_method->signature() == resolved_method->signature(),
   171       "Object and interface method signatures should match at vtable index %d, %s != %s",
   169       "Object and interface method signatures should match at vtable index %d, %s != %s",
   398       vtable_index = ik->default_vtable_indices()->at(index);
   396       vtable_index = ik->default_vtable_indices()->at(index);
   399     }
   397     }
   400   }
   398   }
   401   if (vtable_index == Method::invalid_vtable_index) {
   399   if (vtable_index == Method::invalid_vtable_index) {
   402     // get vtable_index for miranda methods
   400     // get vtable_index for miranda methods
   403     ResourceMark rm;
   401     klassVtable vt = ik->vtable();
   404     klassVtable *vt = ik->vtable();
   402     vtable_index = vt.index_of_miranda(name, signature);
   405     vtable_index = vt->index_of_miranda(name, signature);
       
   406   }
   403   }
   407   return vtable_index;
   404   return vtable_index;
   408 }
   405 }
   409 
   406 
   410 methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {
   407 methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {