RFR: 8087342: crash in klassItable_initialize_itable_for_interface

Lois Foltan lois.foltan at oracle.com
Tue Aug 4 17:38:24 UTC 2015


On 7/31/2015 2:01 PM, Karen Kinnear wrote:
> Lois,
>
> Here is an updated webrev. The hotspot code has not changed (except 
> for the fixed comments). I added a test to investigate if
> I could have static and instance fields in the same class (obviously 
> with -Xverify:none). I did manage
> to have 1 public static, 1 private instance and 1 overpass for an AME 
> from an abstract interface.
> Obviously none of this matches the jls, or jvms or passes the verifier 
> - but I did want to make sure
> the code did the right thing.
>
> The test passes in product and fastdebug. I would appreciate a review 
> for the test itself.
> Thanks to Harold for jasm example :-)
>
> updated webrev: http://cr.openjdk.java.net/~acorn/8087342.3/webrev/ 
> <http://cr.openjdk.java.net/%7Eacorn/8087342.3/webrev/>

Hi Karen,
Test looks good.  I applied your patch to a Windows build to see if I 
could trigger a failure due to a local method array that had a different 
layout, but it looks good, the test passed with both fastdebug and 
product builds.  Minor comments:

TestStaticandInstance.java:
   line #99 - I think "n" should be "m"
   line #100 - I think the "public" should be "private"
   line #105 - "C.n()" should be "C.m()"

At least that is the way it seems to be implemented in ASM.

Thanks,
Lois

>>> bug: https://bugs.openjdk.java.net/browse/JDK-8087342
>
> thanks,
> Karen
>
> On Jul 16, 2015, at 6:03 PM, Karen Kinnear wrote:
>
>> Lois,
>>
>> Thank you for the detailed review. I really appreciate it.
>> On Jul 15, 2015, at 8:12 PM, Lois Foltan wrote:
>>
>>>
>>> On 7/15/2015 12:40 PM, Karen Kinnear wrote:
>>>> Please review for JDK9:
>>>>
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8087342
>>>> webrev: http://cr.openjdk.java.net/~acorn/8087342.2/webrev/ 
>>>> <http://cr.openjdk.java.net/%7Eacorn/8087342.2/webrev/>
>>>>
>>>> Crash occurs in product when we should through 
>>>> IncompatibleClassChangeError.
>>>
>>> Hi Karen,
>>> I think this looks good and I really like how straight forward 
>>> klassVtable::is_miranda now is.  Some minor clarification comments:
>>>
>>> - src/share/vm/instanceKlass.cpp
>>> comments for the find_local_method* were changed to state:
>>> +// note that the local methods array can have up to one overpass, 
>>> one static
>>> +// and one instance (private or not) with the same name/signature
>>> I think there are two combinations that the code depends on not 
>>> occurring, they are:
>>>      1. all 3 are in existence in the local methods array (one 
>>> overpass, one static and one instance)
>>>      2. the combination of one static and one instance (private or not)
>>> In other words there has to be an overpass to cause more than one 
>>> method with the same name/signature within the local methods array. 
>>>  And it is either an overpass and a static or an overpass and an 
>>> instance, but not all 3.  Correct me if I am wrong.
>> I need to write an additional test to check that. I agree that both 
>> the spec and the ClassFileParser if _need_verify is set will
>> prevent instance and static overlap. I need to see what happens if 
>> you skip verification. I will get back to you with that and update the
>> comments to clarify if needed.
>>>
>>> - src/share/vm/oops/klassVtable.cpp
>> Let me see if I can make this clearer - let me know if I can make the 
>> comments clearer. I truly appreciate your trying to see
>> if this all makes sense and is consistent. It is still too complex.
>>> Thank you for adding the improved comments ahead of is_miranda.  My 
>>> read is that overpass methods are not considered miranda methods and 
>>> I agree with that statement.
>> Yes, they are not considered miranda methods because you don't need 
>> to add them to the vtable as abstract methods because
>> they already are in the vtable from being in the class' LOCAL methods 
>> array.
>> So pass 1: overpasses do not exist
>> pass 2: overpasses are already in the vtable when we calculate mirandas
>> pass 3: overpasses in a class have the class as their method_holder, 
>> not an interface, so we aren't looking them up here
>>
>> So - pass 2 is the one that cares about the 
>> find_local_method(Klass:find_overpass vs. Klass::skip_overpass).
>>
>>
>>> Yet, Klass::find_overpass is specified in the code.  I think the 
>>> code is correct, but based on the comment I would have thought 
>>> Klass::skip_overpass should have been specified?
>> I also think the code is correct.
>> So what pass 2 is doing is walking through the superinterfaces to see 
>> if any of the superinterface methods (which all used to be abstract)
>> need to be added to the vtable.
>>
>> So the question is - what superinterface methods belong in the vtable?
>> So the searches in is_miranda are designed to find out if there is a 
>> method in the vtable already such that we don't
>> need to add the superinterface method - e.g. this was abstract and we 
>> have an implementation for it.
>>
>> With the addition of default methods, we have three new challenges - 
>> overpasses, static interface methods and private
>> interface methods.
>>
>> Static and private interface methods do not get added to the vtable 
>> and are not seen by the method resolution process.
>> So we skip those.
>>
>> Overpass methods are already in the vtable, so vtable lookup will 
>> find them there and we don't need to add a miranda method
>> to the end of the vtable. So we look for those explicitly. Note that 
>> we inherit our superclasses vtable, so the superclass' search
>> also needs to use find_overpass.
>>
>> Does this make sense?
>>
>> Is there a way I could make this clearer via comments?
>>
>>> Much like skip_static and skip_private.  So based on your later 
>>> statement that "Abstract methods may already have been handled via 
>>> overpasses" it implies that overpass methods, although not miranda 
>>> methods, can satisfy or stand in for an miranda during pass 2.  So 
>>> they must be found, did I understand that correctly?
>>
>>>
>>> Again, looks good.  I don't need to see another review.  My comments 
>>> were merely clarification based.
>> many thanks,
>> Karen
>>
>>>
>>> Thanks,
>>> Lois
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>>
>>>> testing:
>>>> internal tests: Defmeth (updated), SelectionResolution - product 
>>>> and fastdebug
>>>> jprt
>>>> jck
>>>> jtreg/hotspot_all
>>>> jtreg/jdk_streams
>>>> test,noncolo.testlist, -atk quick
>>>>
>>>> (jck and macosx testing in progress)
>>>>
>>>> thanks,
>>>> Karen
>>>>
>>>
>>
>



More information about the hotspot-runtime-dev mailing list