提交 c6da38a9 编写于 作者: A attila

8134490: Dead var statement evacuation incorrectly descends into nested functions

Reviewed-by: hannesw, mhaupt
上级 065eed9f
...@@ -277,15 +277,11 @@ final class FindScopeDepths extends NodeVisitor<LexicalContext> implements Logga ...@@ -277,15 +277,11 @@ final class FindScopeDepths extends NodeVisitor<LexicalContext> implements Logga
final Set<Symbol> symbols = new HashSet<>(); final Set<Symbol> symbols = new HashSet<>();
block.accept(new NodeVisitor<LexicalContext>(new LexicalContext()) { block.accept(new NodeVisitor<LexicalContext>(new LexicalContext()) {
@Override @Override
public final boolean enterDefault(final Node node) { public boolean enterIdentNode(final IdentNode identNode) {
if (!compiler.isOnDemandCompilation()) { final Symbol symbol = identNode.getSymbol();
if (node instanceof IdentNode) { if (symbol != null && symbol.isScope()) {
final Symbol symbol = ((IdentNode)node).getSymbol(); //if this is an internal symbol, skip it.
if (symbol != null && symbol.isScope()) { symbols.add(symbol);
//if this is an internal symbol, skip it.
symbols.add(symbol);
}
}
} }
return true; return true;
} }
......
...@@ -123,9 +123,18 @@ final class Lower extends NodeOperatorVisitor<BlockLexicalContext> implements Lo ...@@ -123,9 +123,18 @@ final class Lower extends NodeOperatorVisitor<BlockLexicalContext> implements Lo
statement.accept(new NodeVisitor<LexicalContext>(new LexicalContext()) { statement.accept(new NodeVisitor<LexicalContext>(new LexicalContext()) {
@Override @Override
public boolean enterVarNode(final VarNode varNode) { public boolean enterVarNode(final VarNode varNode) {
// We can't entirely eliminate dead statements, as var declarations are scoped
// to the whole function so we need to preserve them although without
// initializers.
newStatements.add(varNode.setInit(null)); newStatements.add(varNode.setInit(null));
return false; return false;
} }
@Override
public boolean enterFunctionNode(final FunctionNode functionNode) {
// Don't descend into nested functions when searching for VarNodes, though.
return false;
}
}); });
} }
} }
......
/*
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* JDK-8134490: Dead var statement evacuation incorrectly descends into nested functions
*
* @test
* @run
*/
var v1;
function f1()
{
v1 = 1;
return true;
(function () { var v1; })();
}
f1();
// If it executes without throwing an exception in code generator, it's working.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册