RFR (S) JDK-8067480: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest on Linux x64
karen.kinnear at oracle.com
Wed Jan 21 16:36:39 UTC 2015
Looks good. Many thanks.
On Jan 19, 2015, at 4:11 PM, Lois Foltan wrote:
> Please review the following fix:
> Bug: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest on Linux x64
> The previous fix for JDK-8033150: (invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults), made the change to include overpass methods in a class' local method array even when a static method is present. An overpass method is added to the current class' local method array for issues that have been encountered during the walk of the default methods. This fix allowed default method processing to match method selection where statics are and should be ignored. To have the static methods then later be preferred over an overpass method at method and interface method resolution time, the fix for JDK-8033150 introduced the concept of "skipping_overpass" during method lookup.
> The current bug, JDK-8067480, exposes a problem with allowing both a static method and an overpass method that share the same method name and signature to co-exist in a class' local method array. A class' local method array is ordered based on the method name's Symbol* address. So depending on this ordering, which happened to start differing between a fastdebug and product build, instanceKlass::find_instance_method() was returning NULL because the static method was found first and searching did not continue to find the overpass method of the same name and signature. This led to consequences downstream when decisions were being made as to whither or not a miranda method should be added during the class' vtable initialization. During a fastdebug build, find_instance_method() found the overpass method and vtable initialization ended correctly. During a product build, due to a differing sorted order of the class' method array, the static method was found which caused the vtable initialization to determine a miranda method was needed, overrunning the vtable and actually overwriting the first slot in the itable. instanceKlass::find_instance_method() must have the concept added of "skipping_statics", must like the "skipping_overpass" concept. It should skip a static method of the same name and signature and instead of stopping, keep searching in case an overpass method of the same name and signature exists as well.
> defmeth, java/lang, java/util, hotspot jtreg - completed
> vm.quick.testlist - in progress
More information about the hotspot-runtime-dev