RFR: 8229862: NPE in jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0(Code.java:570)
Jia Yanwei
github.com+3896345+hltj at openjdk.java.net
Fri Nov 27 13:19:56 UTC 2020
On Mon, 16 Nov 2020 10:32:00 GMT, Jan Lahoda <jlahoda at openjdk.org> wrote:
> Based on Bernard's code from:
> http://mail.openjdk.java.net/pipermail/compiler-dev/2020-October/015225.html
>
> Capturing anonymous classes inside lambdas may fail to compile, because:
> -the captured variables are not detected correctly, because `LambdaToMethod...captureLocalClassDefs` needs to find the AST node for the given `ClassSymbol`, but it has not yet been added into the `localClassDefs`. The proposed solution is to re-order the tasks done for JCNewClass, and call the super implementation sooner. This will enter the `ClassSymbol` and corresponding AST node into `localClassDefs` before the capture variables detection.
> -inside the anonymous class definition, some references to the captured variables are replaced using a map that maps captured variables for lambdas (`lambdaTranslationMap`) - but inside the anonymous class, there the captured variables should be mapped using the anonymous class' map/proxies (to fields). The proposed solution is to clear `lambdaTranslationMap` before processing the anonymous class body.
Great! It fix the issue I have met when I trying to fix another issue (#1479).
My minimal reproducing code is:
java
class Main {
static Runnable runnable = () -> {
String s0 = "hello";
class Local {
int i = s0.length();
}
Runnable dummy = () -> new Local() {
};
};
}
-------------
PR: https://git.openjdk.java.net/jdk/pull/1221
More information about the compiler-dev
mailing list