Mercurial > hg > icedtea8-forest > hotspot
changeset 10577:f37db4bd396c
8225261: Better method resolutions
Reviewed-by: andrew
Contributed-by: lois.foltan@oracle.com
author | mbalao |
---|---|
date | Tue, 08 Oct 2019 10:26:17 -0400 |
parents | 174eed0020f2 |
children | 8b80409d5840 |
files | src/share/vm/oops/klassVtable.cpp |
diffstat | 1 files changed, 8 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/oops/klassVtable.cpp Mon Jan 06 06:55:50 2020 +0000 +++ b/src/share/vm/oops/klassVtable.cpp Tue Oct 08 10:26:17 2019 -0400 @@ -289,22 +289,25 @@ 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(super_method, target_loader, target_classname, THREAD)) { + + if (supermethodholder->is_override(super_method, target_loader, target_classname, THREAD)) { #ifndef PRODUCT if (PrintVtables && Verbose) { ResourceMark rm(THREAD); char* sig = target_method()->name_and_sig_as_C_string(); tty->print("transitive overriding superclass %s with %s::%s index %d, original flags: ", - supersuperklass->internal_name(), + supermethodholder->internal_name(), _klass->internal_name(), sig, vtable_index); super_method->access_flags().print_on(tty); if (super_method->is_default_method()) { @@ -656,7 +659,7 @@ // search through the super class hierarchy to see if we need // a new entry - ResourceMark rm; + ResourceMark rm(THREAD); Symbol* name = target_method()->name(); Symbol* signature = target_method()->signature(); Klass* k = super;