OpenJDK / amber / amber
changeset 59651:924e6226a24e
8225261: Better method resolutions
Summary: Correct the class used to perform the overriding check in klassVtable::find_transitive_override
Reviewed-by: ahgross, dholmes, hseigel, jwilhelm, rhalade
author | lfoltan |
---|---|
date | Thu, 12 Sep 2019 11:46:05 -0400 |
parents | e331a67f4059 |
children | 7250627144a6 |
files | src/hotspot/share/oops/klassVtable.cpp |
diffstat | 1 files changed, 7 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/oops/klassVtable.cpp Tue Sep 10 17:13:48 2019 -0700 +++ b/src/hotspot/share/oops/klassVtable.cpp Thu Sep 12 11:46:05 2019 -0400 @@ -291,23 +291,26 @@ int vtable_index, Handle target_loader, Symbol* target_classname, Thread * THREAD) { InstanceKlass* superk = initialsuper; while (superk != NULL && superk->super() != NULL) { - InstanceKlass* supersuperklass = InstanceKlass::cast(superk->super()); - klassVtable ssVtable = supersuperklass->vtable(); + klassVtable ssVtable = (superk->super())->vtable(); if (vtable_index < ssVtable.length()) { Method* super_method = ssVtable.method_at(vtable_index); + // get the class holding the matching method + // make sure you use that class for is_override + InstanceKlass* supermethodholder = super_method->method_holder(); #ifndef PRODUCT Symbol* name= target_method()->name(); Symbol* signature = target_method()->signature(); assert(super_method->name() == name && super_method->signature() == signature, "vtable entry name/sig mismatch"); #endif - if (supersuperklass->is_override(methodHandle(THREAD, super_method), target_loader, target_classname, THREAD)) { + + if (supermethodholder->is_override(methodHandle(THREAD, super_method), target_loader, target_classname, THREAD)) { if (log_develop_is_enabled(Trace, vtables)) { ResourceMark rm(THREAD); LogTarget(Trace, vtables) lt; LogStream ls(lt); char* sig = target_method()->name_and_sig_as_C_string(); ls.print("transitive overriding superclass %s with %s index %d, original flags: ", - supersuperklass->internal_name(), + supermethodholder->internal_name(), sig, vtable_index); super_method->print_linkage_flags(&ls); ls.print("overriders flags: ");