RFR: JDK-8209407: VerifyError is thrown for inner class with lambda

Vicente Romero vicente.romero at oracle.com
Fri Oct 5 18:18:20 UTC 2018


Please review the fix for [1] at [2]. javac was compiling a code not 
acceptable to the verifier. This code exemplifies the issue:

import java.util.function.Supplier;

public class Test {
   public static void main(String[] args) {
     Object a = new Object();
     class Local {
       Object ref = a;
     }
     new Object() {
       void unused() {
         Supplier<Local> s = () -> new Local();
       }
     };
   }
}

here the local class Local is capturing variable `a`, the thing is that 
after LTM processes the lambda, it defines a mapping for that free 
variable. But once the compiler is at Lower, another mapping, a proxy 
variable, is defined. These two mappings collide inside the translation 
of the lambda method and the one defined in LTM should trump. This is 
what this patch is doing.

Thanks,
Vicente

[1] https://bugs.openjdk.java.net/browse/JDK-8209407
[2] http://cr.openjdk.java.net/~vromero/8209407/webrev.00/jdk.dev.patch
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20181005/a7c7726b/attachment.html>


More information about the compiler-dev mailing list