8338471: Assert deleted methods not returned by CallInfo
Reviewed-by: shade, jwaters, dholmes
This commit is contained in:
parent
40fba14812
commit
5cffddc689
@ -83,6 +83,7 @@ void CompiledICData::initialize(CallInfo* call_info, Klass* receiver_klass) {
|
|||||||
_speculated_klass = (uintptr_t)receiver_klass;
|
_speculated_klass = (uintptr_t)receiver_klass;
|
||||||
}
|
}
|
||||||
if (call_info->call_kind() == CallInfo::itable_call) {
|
if (call_info->call_kind() == CallInfo::itable_call) {
|
||||||
|
assert(call_info->resolved_method() != nullptr, "virtual or interface method must be found");
|
||||||
_itable_defc_klass = call_info->resolved_method()->method_holder();
|
_itable_defc_klass = call_info->resolved_method()->method_holder();
|
||||||
_itable_refc_klass = call_info->resolved_klass();
|
_itable_refc_klass = call_info->resolved_klass();
|
||||||
}
|
}
|
||||||
@ -238,6 +239,7 @@ void CompiledIC::set_to_megamorphic(CallInfo* call_info) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
|
assert(call_info->resolved_method() != nullptr, "virtual or interface method must be found");
|
||||||
int index = call_info->resolved_method()->itable_index();
|
int index = call_info->resolved_method()->itable_index();
|
||||||
assert(index == itable_index, "CallInfo pre-computes this");
|
assert(index == itable_index, "CallInfo pre-computes this");
|
||||||
InstanceKlass* k = call_info->resolved_method()->method_holder();
|
InstanceKlass* k = call_info->resolved_method()->method_holder();
|
||||||
@ -254,6 +256,7 @@ void CompiledIC::set_to_megamorphic(CallInfo* call_info) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(call_info->selected_method() != nullptr, "virtual or interface method must be found");
|
||||||
log_trace(inlinecache)("IC@" INTPTR_FORMAT ": to megamorphic %s entry: " INTPTR_FORMAT,
|
log_trace(inlinecache)("IC@" INTPTR_FORMAT ": to megamorphic %s entry: " INTPTR_FORMAT,
|
||||||
p2i(_call->instruction_address()), call_info->selected_method()->print_value_string(), p2i(entry));
|
p2i(_call->instruction_address()), call_info->selected_method()->print_value_string(), p2i(entry));
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ void CallInfo::set_interface(Klass* resolved_klass,
|
|||||||
// we should pick the vtable index from the resolved method.
|
// we should pick the vtable index from the resolved method.
|
||||||
// In that case, the caller must call set_virtual instead of set_interface.
|
// In that case, the caller must call set_virtual instead of set_interface.
|
||||||
assert(resolved_method->method_holder()->is_interface(), "");
|
assert(resolved_method->method_holder()->is_interface(), "");
|
||||||
assert(itable_index == resolved_method()->itable_index(), "");
|
assert(itable_index == resolved_method->itable_index(), "");
|
||||||
set_common(resolved_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
|
set_common(resolved_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1541,7 +1541,7 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// resolve the method in the receiver class, unless it is private
|
// resolve the method in the receiver class, unless it is private
|
||||||
if (!is_abstract_interpretation && !resolved_method()->is_private()) {
|
if (!is_abstract_interpretation && !resolved_method->is_private()) {
|
||||||
// do lookup based on receiver klass
|
// do lookup based on receiver klass
|
||||||
// This search must match the linktime preparation search for itable initialization
|
// This search must match the linktime preparation search for itable initialization
|
||||||
// to correctly enforce loader constraints for interface method inheritance.
|
// to correctly enforce loader constraints for interface method inheritance.
|
||||||
@ -1590,17 +1590,17 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
|
|||||||
assert(is_abstract_interpretation || vtable_index == selected_method->vtable_index(), "sanity check");
|
assert(is_abstract_interpretation || vtable_index == selected_method->vtable_index(), "sanity check");
|
||||||
result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK);
|
result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK);
|
||||||
} else if (resolved_method->has_itable_index()) {
|
} else if (resolved_method->has_itable_index()) {
|
||||||
int itable_index = resolved_method()->itable_index();
|
int itable_index = resolved_method->itable_index();
|
||||||
log_develop_trace(itables)(" -- itable index: %d", itable_index);
|
log_develop_trace(itables)(" -- itable index: %d", itable_index);
|
||||||
result.set_interface(resolved_klass, resolved_method, selected_method, itable_index, CHECK);
|
result.set_interface(resolved_klass, resolved_method, selected_method, itable_index, CHECK);
|
||||||
} else {
|
} else {
|
||||||
int index = resolved_method->vtable_index();
|
int index = resolved_method->vtable_index();
|
||||||
log_develop_trace(itables)(" -- non itable/vtable index: %d", index);
|
log_develop_trace(itables)(" -- non itable/vtable index: %d", index);
|
||||||
assert(index == Method::nonvirtual_vtable_index, "Oops hit another case!");
|
assert(index == Method::nonvirtual_vtable_index, "Oops hit another case!");
|
||||||
assert(resolved_method()->is_private() ||
|
assert(resolved_method->is_private() ||
|
||||||
(resolved_method()->is_final() && resolved_method->method_holder() == vmClasses::Object_klass()),
|
(resolved_method->is_final() && resolved_method->method_holder() == vmClasses::Object_klass()),
|
||||||
"Should only have non-virtual invokeinterface for private or final-Object methods!");
|
"Should only have non-virtual invokeinterface for private or final-Object methods!");
|
||||||
assert(resolved_method()->can_be_statically_bound(), "Should only have non-virtual invokeinterface for statically bound methods!");
|
assert(resolved_method->can_be_statically_bound(), "Should only have non-virtual invokeinterface for statically bound methods!");
|
||||||
// This sets up the nonvirtual form of "virtual" call (as needed for final and private methods)
|
// This sets up the nonvirtual form of "virtual" call (as needed for final and private methods)
|
||||||
result.set_virtual(resolved_klass, resolved_method, resolved_method, index, CHECK);
|
result.set_virtual(resolved_klass, resolved_method, resolved_method, index, CHECK);
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,6 @@ class CallInfo : public StackObj {
|
|||||||
// Materialize a java.lang.invoke.ResolvedMethodName for this resolved_method
|
// Materialize a java.lang.invoke.ResolvedMethodName for this resolved_method
|
||||||
void set_resolved_method_name(TRAPS);
|
void set_resolved_method_name(TRAPS);
|
||||||
|
|
||||||
BasicType result_type() const { return selected_method()->result_type(); }
|
|
||||||
CallKind call_kind() const { return _call_kind; }
|
CallKind call_kind() const { return _call_kind; }
|
||||||
int vtable_index() const {
|
int vtable_index() const {
|
||||||
// Even for interface calls the vtable index could be non-negative.
|
// Even for interface calls the vtable index could be non-negative.
|
||||||
|
@ -604,6 +604,7 @@ void ConstantPoolCache::adjust_method_entries(bool * trace_name_printed) {
|
|||||||
if (old_method == nullptr || !old_method->is_old()) {
|
if (old_method == nullptr || !old_method->is_old()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
assert(!old_method->is_deleted(), "cannot delete these methods");
|
||||||
Method* new_method = old_method->get_new_method();
|
Method* new_method = old_method->get_new_method();
|
||||||
resolved_indy_entry_at(j)->adjust_method_entry(new_method);
|
resolved_indy_entry_at(j)->adjust_method_entry(new_method);
|
||||||
log_adjust("indy", old_method, new_method, trace_name_printed);
|
log_adjust("indy", old_method, new_method, trace_name_printed);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user