RFR: 8165827: Support private interface methods in JNI, JDWP, JDI and JDB

Daniel D. Daugherty daniel.daugherty at oracle.com
Tue Oct 11 21:27:52 UTC 2016


On 10/11/16 3:11 PM, David Holmes wrote:
> Hi Dan,
>
> Thanks for looking at this.
>
> On 12/10/2016 3:30 AM, Daniel D. Daugherty wrote:
>> On 10/10/16 7:55 PM, David Holmes wrote:
>>> Turns out the only place changes were needed were in JDI.
>>>
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8165827
>>>
>>> webrev: http://cr.openjdk.java.net/~dholmes/8165827/webrev/
>>
>> src/jdk.jdi/share/classes/com/sun/jdi/ObjectReference.java
>>     No comments. (Thanks for also fixing the typo.)
>>
>> src/jdk.jdi/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java
>>     L352:         if (isNonVirtual(options)) {
>>     L353:             if (method.isAbstract()) {
>>     L354:                 throw new IllegalArgumentException("Abstract
>> method");
>>     L355:             }
>>         Any particular reason for breaking the logic into two
>>         distinct if-statements?
>>
>>         Perhaps:
>>
>>                   if (isNonVirtual(options) && method.isAbstract()) {
>>                       throw new IllegalArgumentException("Abstract
>> method");
>>                   }
>>
>>         Also, perhaps "unexpected Abstract method" is more clear?
>
> :) I tried to forestall this comment by saying "use the same format as 
> already present in the class version of the check method. " The code I 
> have now is a copy of what is prior:
>
>  312         /*
>  313          * For nonvirtual invokes, method must have a body
>  314          */
>  315         if (isNonVirtual(options)) {
>  316             if (method.isAbstract()) {
>  317                 throw new IllegalArgumentException("Abstract 
> method");
>  318             }
>  319         }
>
> While I personally prefer the conjunctive form I went for consistency 
> whilst minimizing changes.

I'm okay with your choice.

Dan

>
>> test/com/sun/jdi/InterfaceMethodsTest.java
>>     L526:             if (t.getClass() != expectedException) {
>>     L527:                 System.err.println("--- FAILED");
>>     L528:                 failure("FAILED: " + t);
>>     L529:                 return null;
>>     L530:             }
>>         You should also report the expectedException value here to
>>         aid in failure analysis.
>
> Good point - will update.
>
>> Thumbs up! I don't need to see another webrev if you decide to
>> make the above small tweaks.
>
> Great - thanks again.
>
> David
>
>> Dan
>>
>>
>>>
>>> The spec change in ObjectReference is very simple and there is a CCC
>>> request in progress to ratify that change.
>>>
>>> The implementation change in ObjectReferenceImpl mirrors the updated
>>> spec and use the same format as already present in the class version
>>> of the check method.
>>>
>>> The test is a little more complex. This is obviously an extension to
>>> what is already tested in InterfaceMethodsTest. However IMT has a
>>> number of problem with the way it is currently written [1] -
>>> specifically it doesn't properly separate method lookup from method
>>> invocation. So I've added the capability to separate lookup and
>>> invocation for use with the private interface methods - I have not
>>> tried to address shortcomings of the existing tests. Though I did fix
>>> the return value checking logic! And did some clarifying comments and
>>> renaming in a couple of place.
>>>
>>> Still on the test I can't add the negative tests I would like to add
>>> because they actually pass due to a different long standing bug in JDI
>>> - [2]. So the actual private interface method testing is very simple:
>>> can I get the Method from the InterfaceType for the interface
>>> declaring the method? Can I then invoke that method on an instance of
>>> a class that implements the interface.
>>>
>>> Thanks,
>>> David
>>>
>>> [1] https://bugs.openjdk.java.net/browse/JDK-8166453
>>> [2] https://bugs.openjdk.java.net/browse/JDK-8167416
>>



More information about the hotspot-runtime-dev mailing list