Bug in extractVarNodesFromDeadCode. Variable "x" has already been declared

Jim Laskey james.laskey at oracle.com
Mon Oct 28 15:36:35 UTC 2019


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



More information about the nashorn-dev mailing list