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

Anton Mitrofanov mitrofanov at krista.ru
Mon Oct 28 15:21:10 UTC 2019


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