Hi.
We have encountered another bug in Nashorn. It can be reproduced by evaluation
of this script with "jjs --language=es6":
if (true) { throw "test"; } { let x = "1"; } { let x = 2; }
It results in compilation error:
ECMAScript Exception: SyntaxError: <shell>:1:34 Variable "x" has already been
declared
if (true) { throw "test"; } { let x = "1"; } { let x = 2; }
^
While expected out was to get runtime exception "test".
Looks like the problem is in dead code elimination logic of
FoldConstants.extractVarNodesFromDeadCode function.
And here is the patch to fix it:
diff -r 6e287efa5fa3
src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/FoldConstants.java
---
a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/FoldConstants.java
Wed Oct 23 09:53:07 2019 +0200
+++
b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/FoldConstants.java
Wed Oct 23 14:23:48 2019 +0300
@@ -195,7 +195,9 @@
deadCodeRoot.accept(new SimpleNodeVisitor() {
@Override
public boolean enterVarNode(final VarNode varNode) {
- statements.add(varNode.setInit(null));
+ if (!varNode.isBlockScoped()) {
+ statements.add(varNode.setInit(null));
+ }
return false;
}