RFR (M) JDK-8033150 (#2): invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults

Lois Foltan lois.foltan at oracle.com
Fri Apr 11 14:07:11 UTC 2014


On 4/11/2014 9:51 AM, Keith McGuigan wrote:
> Hi Lois,
>
> Looks good, thanks for making that change!

Thank you Keith for reviewing.
Lois

>
> --
> - Keith
>
>
> On Fri, Apr 11, 2014 at 9:04 AM, Lois Foltan <lois.foltan at oracle.com 
> <mailto:lois.foltan at oracle.com>> wrote:
>
>
>     Please review the updated fix, webrev at:
>     http://cr.openjdk.java.net/~lfoltan/bug_jdk8033150.1/
>     <http://cr.openjdk.java.net/%7Elfoltan/bug_jdk8033150.1/>
>
>     This includes Keith's suggestion below.  All testing has been
>     rerun successfully.
>
>     Thank you,
>     Lois
>
>
>     On 3/31/2014 3:51 PM, Lois Foltan wrote:
>>
>>     On 3/31/2014 2:08 PM, Keith McGuigan wrote:
>>>     Hi Lois,
>>>
>>>     I think that looks good.  I like it much better than doing the
>>>     static method check in the default method processing.
>>>     My only suggestion is that it would be nice to encode new
>>>     parameter to uncached_lookup_method to be some sort of enum
>>>     instead of a boolean, so that it is obvious from the call-site
>>>     what the behavior should be (having just "false" in the
>>>     parameter list requires you to reference back to the declaration
>>>     to figure out what that "false" means).
>>>
>>>     So instead of:
>>>        uncached_lookup_method(field_name, field_sig, false);
>>>     It'd be:
>>>       uncached_lookup_method(field_name, field_sig, NORMAL); or
>>>       uncached_lookup_method(field_name, field_sig, IGNORE_OVERPASS);
>>>
>>>     (or something like that -- I'm no good at names).
>>
>>     Thank you Keith.  Good suggestion.  I will implement and repost
>>     an updated webrev for review.
>>     Lois
>>
>>>
>>>     --
>>>     - Keith
>>>
>>>
>>>     On Mon, Mar 31, 2014 at 1:25 PM, Lois Foltan
>>>     <lois.foltan at oracle.com <mailto:lois.foltan at oracle.com>> wrote:
>>>
>>>         Hi,
>>>
>>>         Please review the following fix:
>>>
>>>         Webrev:
>>>         http://cr.openjdk.java.net/~lfoltan/bug_jdk8033150/
>>>         <http://cr.openjdk.java.net/%7Elfoltan/bug_jdk8033150/>
>>>
>>>         Bug: invokestatic: IncompatibleClassChangeError trying to
>>>         invoke static method from a parent in presence of
>>>         conflicting defaults
>>>         https://bugs.openjdk.java.net/browse/JDK-8033150
>>>
>>>         Summary of fix:
>>>         During default method processing, determine_target(), is
>>>         responsible for making decisions on whether
>>>         to create and add an overpass method to the current class
>>>         for issues that have been encountered during the walk
>>>         of the default methods.  The routine
>>>         defaultMethods.cpp/has_matching_static() helped determine this
>>>         decision by looking within the current class for a static
>>>         method that should be preferred during method
>>>         resolution over an overpass method being created.  However,
>>>         has_matching_static() did not continue to
>>>         look for a static method in current class' superclasses
>>>         which JDK-8033150 exposed.
>>>
>>>         After looking at the code more closely, the has
>>>         _matching_static() concept is being moved out out of default
>>>         method processing and into method resolution processing.
>>>          The primary reason for this is to allow
>>>         default method processing to match method selection where
>>>         statics are and should be ignored.   According
>>>         to JVMS, static methods should only be preferred over an
>>>         overpass method at method and interface
>>>         method resolution time.  To enable method resolution to
>>>         potentially find a static method over an overpass
>>>         method, a new parameter "ignore_overpass" was added to
>>>         InstanceKlass::uncached_lookup_method().
>>>         It has the affect of indicating to find_method_index() to
>>>         ignore overpass methods and continue the search
>>>         in case a static method of the same name and signature is
>>>         present in the current class or its superclasses.
>>>
>>>         Tests:
>>>             - jtreg hotspot/test/*, JDK java.lang & java.util,
>>>         vm.quick.testlist, JCK lang & vm, defmeth tests
>>>         - Test will be added to the defmeth test system
>>>
>>>         Thank you,
>>>         Lois
>>>
>>>
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20140411/b8c150c0/attachment.html>


More information about the hotspot-runtime-dev mailing list