RFR: JDK-8220041: NullPointerException at jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0

Jan Lahoda jan.lahoda at oracle.com
Tue Jul 9 14:54:25 UTC 2019


Hi,

Consider code like:
---
     I<String> lambdaCapture1(int i) {
         I<String> r = switch (i) {
             default -> {
                 String k = "D";
                 yield () -> k; //need to capture k here
             }
         };

         return r;
     }

     interface I<T> {
         public T t();
     }
---

"k" needs to be captured, but LambdaToMethod fails to recognize that, as 
the enclosing Frame is for a variable declaration, which does not check 
the definitions under the variable decl (since before switch 
expressions, this could not happen). This then eventually leads either 
to a compiler crash, or a failure at runtime. The proposed solution is 
to check local variables in the variables frame, to see if they should 
be captured or not.

JBS: https://bugs.openjdk.java.net/browse/JDK-8220041
Webrev: http://cr.openjdk.java.net/~jlahoda/8220041/webrev.00/

How does this look?

Thanks,
     Jan


More information about the compiler-dev mailing list