8264732: Clean up LinkResolver::vtable_index_of_interface_method()
Reviewed-by: lfoltan, coleenp, dholmes
This commit is contained in:
parent
b3782ead36
commit
33fa855d5a
@ -149,8 +149,7 @@ CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass, TRAPS) {
|
|||||||
kind = CallInfo::vtable_call;
|
kind = CallInfo::vtable_call;
|
||||||
} else if (!resolved_klass->is_interface()) {
|
} else if (!resolved_klass->is_interface()) {
|
||||||
// A default or miranda method. Compute the vtable index.
|
// A default or miranda method. Compute the vtable index.
|
||||||
index = LinkResolver::vtable_index_of_interface_method(resolved_klass,
|
index = LinkResolver::vtable_index_of_interface_method(resolved_klass, _resolved_method);
|
||||||
_resolved_method);
|
|
||||||
assert(index >= 0 , "we should have valid vtable index at this point");
|
assert(index >= 0 , "we should have valid vtable index at this point");
|
||||||
|
|
||||||
kind = CallInfo::vtable_call;
|
kind = CallInfo::vtable_call;
|
||||||
@ -405,31 +404,9 @@ Method* LinkResolver::lookup_instance_method_in_klasses(Klass* klass,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LinkResolver::vtable_index_of_interface_method(Klass* klass,
|
int LinkResolver::vtable_index_of_interface_method(Klass* klass, const methodHandle& resolved_method) {
|
||||||
const methodHandle& resolved_method) {
|
|
||||||
|
|
||||||
int vtable_index = Method::invalid_vtable_index;
|
|
||||||
Symbol* name = resolved_method->name();
|
|
||||||
Symbol* signature = resolved_method->signature();
|
|
||||||
InstanceKlass* ik = InstanceKlass::cast(klass);
|
InstanceKlass* ik = InstanceKlass::cast(klass);
|
||||||
|
return ik->vtable_index_of_interface_method(resolved_method());
|
||||||
// First check in default method array
|
|
||||||
if (!resolved_method->is_abstract() && ik->default_methods() != NULL) {
|
|
||||||
int index = InstanceKlass::find_method_index(ik->default_methods(),
|
|
||||||
name, signature,
|
|
||||||
Klass::OverpassLookupMode::find,
|
|
||||||
Klass::StaticLookupMode::find,
|
|
||||||
Klass::PrivateLookupMode::find);
|
|
||||||
if (index >= 0 ) {
|
|
||||||
vtable_index = ik->default_vtable_indices()->at(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (vtable_index == Method::invalid_vtable_index) {
|
|
||||||
// get vtable_index for miranda methods
|
|
||||||
klassVtable vt = ik->vtable();
|
|
||||||
vtable_index = vt.index_of_miranda(name, signature);
|
|
||||||
}
|
|
||||||
return vtable_index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Method* LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info) {
|
Method* LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info) {
|
||||||
|
@ -3192,6 +3192,34 @@ Method* InstanceKlass::method_at_itable_or_null(InstanceKlass* holder, int index
|
|||||||
return NULL; // offset entry not found
|
return NULL; // offset entry not found
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InstanceKlass::vtable_index_of_interface_method(Method* intf_method) {
|
||||||
|
assert(is_linked(), "required");
|
||||||
|
assert(intf_method->method_holder()->is_interface(), "not an interface method");
|
||||||
|
assert(is_subtype_of(intf_method->method_holder()), "interface not implemented");
|
||||||
|
|
||||||
|
int vtable_index = Method::invalid_vtable_index;
|
||||||
|
Symbol* name = intf_method->name();
|
||||||
|
Symbol* signature = intf_method->signature();
|
||||||
|
|
||||||
|
// First check in default method array
|
||||||
|
if (!intf_method->is_abstract() && default_methods() != NULL) {
|
||||||
|
int index = find_method_index(default_methods(),
|
||||||
|
name, signature,
|
||||||
|
Klass::OverpassLookupMode::find,
|
||||||
|
Klass::StaticLookupMode::find,
|
||||||
|
Klass::PrivateLookupMode::find);
|
||||||
|
if (index >= 0) {
|
||||||
|
vtable_index = default_vtable_indices()->at(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vtable_index == Method::invalid_vtable_index) {
|
||||||
|
// get vtable_index for miranda methods
|
||||||
|
klassVtable vt = vtable();
|
||||||
|
vtable_index = vt.index_of_miranda(name, signature);
|
||||||
|
}
|
||||||
|
return vtable_index;
|
||||||
|
}
|
||||||
|
|
||||||
#if INCLUDE_JVMTI
|
#if INCLUDE_JVMTI
|
||||||
// update default_methods for redefineclasses for methods that are
|
// update default_methods for redefineclasses for methods that are
|
||||||
// not yet in the vtable due to concurrent subclass define and superinterface
|
// not yet in the vtable due to concurrent subclass define and superinterface
|
||||||
|
@ -1110,6 +1110,7 @@ public:
|
|||||||
klassItable itable() const; // return klassItable wrapper
|
klassItable itable() const; // return klassItable wrapper
|
||||||
Method* method_at_itable(InstanceKlass* holder, int index, TRAPS);
|
Method* method_at_itable(InstanceKlass* holder, int index, TRAPS);
|
||||||
Method* method_at_itable_or_null(InstanceKlass* holder, int index, bool& itable_entry_found);
|
Method* method_at_itable_or_null(InstanceKlass* holder, int index, bool& itable_entry_found);
|
||||||
|
int vtable_index_of_interface_method(Method* method);
|
||||||
|
|
||||||
#if INCLUDE_JVMTI
|
#if INCLUDE_JVMTI
|
||||||
void adjust_default_methods(bool* trace_name_printed);
|
void adjust_default_methods(bool* trace_name_printed);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user