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; }