RFR: 8144185: javac produces incorrect RuntimeInvisibleTypeAnnotations length attribute

Srikanth srikanth.adayapalam at oracle.com
Thu May 11 14:50:45 UTC 2017


I made the assertions about the differences in the patches simply by 
looking at the patches without ascertaining the behavior on tip due to 
other fixes.

I will look into this in detail to see what is the minimal set of 
changes that would suffice.

Srikanth

On Thursday 11 May 2017 07:47 PM, Liam Miller-Cushon wrote:
> Thanks for reviewing,
>
> On Thu, May 11, 2017 at 2:46 AM, Srikanth 
> <srikanth.adayapalam at oracle.com 
> <mailto:srikanth.adayapalam at oracle.com>> wrote:
>
>
>     I am looking into this one - turns out I had a patch for this that
>     was put through internal review process and some open issues that
>     needed addressing caused it to be deferred.
>
>
> If it'd be less work to continue with your patch that sounds good to 
> me, thanks. As I said I ran into an ASM crash related to this, and 
> thought it might be a simple fix.
>
>     (1) Your proposed patch simply switches on the kind to determine
>     whether annotations need to be carried over. This looks
>     incorrect/insufficient. Type annotations and declarations
>     annotations have different rules to be carried over.
>
>     From
>     http://mail.openjdk.java.net/pipermail/compiler-dev/2015-December/009865.html
>     <http://mail.openjdk.java.net/pipermail/compiler-dev/2015-December/009865.html>:
>
>         - Declaration annotations on a lambda formal should not make
>     it to the
>            class file at all.
>
>
> I think that is handled in ClassWriter: 
> http://hg.openjdk.java.net/jdk9/dev/langtools/file/ee84b7d44339/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java#l1183 
>
>
>          - Type annotations on the type of a lambda formal should be
>     carried
>     over to the type
>            of the formal parameter of the synthetic method that
>     implements
>     the lambda[*]
>
>     I don't think this is handled by your patch ???
>
>
> As far as I can tell this is handled correctly before and after the patch:
>
> class T {
>   @Retention(RUNTIME) @Target(TYPE_USE) @interface A {}
>   Function<String, String> r = (@A String x) -> x;
> }
> ...
>     RuntimeVisibleTypeAnnotations:
>       0: #20(): METHOD_FORMAL_PARAMETER, param_index=0
>
>     (2) From https://bugs.openjdk.java.net/browse/JDK-8144185
>     <https://bugs.openjdk.java.net/browse/JDK-8144185>:
>
>     Not only is the range incorrect, but also LVT index appears incorrect:
>
>     I don't think this is handled by your patch ???
>
>
> I thought it was handled by the patch and exercised by the included 
> test case. What am I missing? The incorrect LVT index comes from 
> associating the annotation with the capture parameter in the synthetic 
> lambda method instead of with the original local variable. In the 
> test, the LVT index of the variable in f() is 1, and the LVT index of 
> the capture parameter in the synthetic lambda method is 0.
>
> Before the patch, I see:
>
>       RuntimeVisibleTypeAnnotations:
>         0: #23(): LOCAL_VARIABLE, {start_pc=0, length=31, index=0}
>
> With the patch applied:
>
>       RuntimeVisibleTypeAnnotations:
>         0: #23(): LOCAL_VARIABLE, {start_pc=3, length=8, index=1}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20170511/19dec869/attachment-0001.html>


More information about the compiler-dev mailing list