RFR (S) JDK-8067480: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest on Linux x64
harold seigel
harold.seigel at oracle.com
Wed Jan 21 13:34:08 UTC 2015
Hi Lois,
These changes look good.
Harold
On 1/19/2015 4:11 PM, Lois Foltan wrote:
> Hello,
>
> Please review the following fix:
>
> Webrev:
> http://cr.openjdk.java.net/~lfoltan/bug_jdk8067480/
>
> Bug: Crash in klassItable::initialize_itable_for_interface when
> running vm.runtime.defmeth.StaticMethodsTest on Linux x64
> https://bugs.openjdk.java.net/browse/JDK-8067480
>
> Summary:
> 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.
>
> Tests:
> defmeth, java/lang, java/util, hotspot jtreg - completed
> vm.quick.testlist - in progress
More information about the hotspot-runtime-dev
mailing list