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) { |