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

Hannes Wallnöfer hannes.wallnoefer at oracle.com
Wed Oct 30 10:31:01 UTC 2019


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.laskey at 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.laskey at 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 <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