Thanks for the report! https://bugs.openjdk.java.net/browse/JDK-8233195
The provided patch looks reasonable so the chances to get this fixed are quite good. Hannes > Am 28.10.2019 um 16:47 schrieb Jim Laskey <james.las...@oracle.com>: > > Obviously, this wasn't intended for the list. To clarify, since Nashorn is > being deprecated, we are taking input such as this and recording it as a bug > in case someone adopts Nashorn in future. > > Cheers, > > -- Jim > > >> On Oct 28, 2019, at 12:36 PM, Jim Laskey <james.las...@oracle.com> wrote: >> >> You want to take this on? File a bug and put the e-mail (change set) in it, >> then tell the user Nashorn is deprecated. >> >>> On Oct 28, 2019, at 12:21 PM, Anton Mitrofanov <mitrofa...@krista.ru> wrote: >>> >>> 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; >>> } >>> >>> >> >