RFR: Lambda 8026213: Reflection support for private methods in interfaces

David Holmes david.holmes at oracle.com
Fri Oct 11 04:57:20 UTC 2013


On 11/10/2013 2:02 AM, Karen Kinnear wrote:
> Updated webrev:
>>>> webrev: http://cr.openjdk.java.net/~acorn/8026213.2/webrev/
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8026213

Still looks okay to me.

David

>
> Testing:
> Specific test for private methods (attached to bug)
> jtreg jdk java.lang, sun.reflect
>
> thanks,
> Karen
>
> p.s. this should look very much like Paul's suggestion - thank you again
>
> On Oct 10, 2013, at 9:47 AM, Karen Kinnear wrote:
>
>> Paul,
>>
>> Thank you so much for the review and suggestion. I will rewrite this this way and resend.
>>
>> thanks!
>> Karen
>>
>> On Oct 10, 2013, at 5:13 AM, Paul Sandoz wrote:
>>
>>>
>>> On Oct 10, 2013, at 12:13 AM, Karen Kinnear <karen.kinnear at oracle.com> wrote:
>>>
>>>>
>>>> Please review:
>>>>
>>>> webrev: http://cr.openjdk.java.net/~acorn/8026213/webrev/
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8026213
>>>>
>>>> Summary:
>>>> Reflection generates code dynamically to speed up reflection processing after startup. The first
>>>> 15 runs of a reflection call  use the vm code path, after that we use the generated code path, which
>>>> needs to use invokespecial on private methods in interfaces.
>>>>
>>>
>>> You don't need to pass modifiers as a parameter to emitInvoke since it is set as a field on AccessorGenerator and used, e.g. see isStatic().
>>>
>>> So perhaps add the following method to AccessorGenerator:
>>>
>>>    protected boolean isPrivate() {
>>>        return Modifier.isPrivate(modifiers);
>>>    }
>>>
>>> and do:
>>>
>>> 642                 if (isInterface()) {
>>>
>>> 643                     if (isPrivate()) {
>>> 644                       cb.opc_invokespecial(targetMethodRef, count, 0);
>>> 645                     } else {
>>>
>>> 646                       cb.opc_invokeinterface(targetMethodRef,
>>> 647                                              count,
>>> 648                                              count,
>>> 649                                              typeSizeInStackSlots(returnType));
>>>
>>> 650                     }
>>>
>>> 651                 } else {
>>> 652                     cb.opc_invokevirtual(targetMethodRef,
>>> 653                                          count,
>>> 654                                          typeSizeInStackSlots(returnType));
>>> 655                 }
>>> 656             }
>>> 657         }
>>>
>>> ?
>>>
>>> Paul.
>>>
>>>> Tested:
>>>> Test attached to the bug
>>>>
>>>> Also - all the 8011311 private method testing was run with this in the build:
>>>> Robert Field's TypeTest
>>>> 8025475 test
>>>> defmeth privatemethodstest with reflection
>>>> John Rose's intfbug
>>>> jtreg: java.util, java.lang
>>>> jck vm, lang
>>>>
>>>> thanks,
>>>> Karen
>>>>
>>>>
>>>
>>
>



More information about the core-libs-dev mailing list