8047728: (function(x){var o={x:0}; with(o){delete x} return o.x})() evaluates to 0 instead of undefined
Reviewed-by: jlaskey, hannesw, attila
This commit is contained in:
parent
7aa808a993
commit
90b667d865
25
nashorn/bin/jjsdebug.sh
Normal file
25
nashorn/bin/jjsdebug.sh
Normal file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2014, 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.
|
||||
#
|
||||
|
||||
$JAVA_HOME/bin/jjs -J-Djava.ext.dirs=`dirname $0`/../dist -J-agentlib:jdwp=transport=dt_socket,address=localhost:9009,server=y,suspend=y $*
|
@ -34,7 +34,7 @@
|
||||
<jvmarg line="-Dnashorn.optimistic"/>
|
||||
<jvmarg line="${ext.class.path}"/>
|
||||
<jvmarg line="${run.test.jvmargs}"/>
|
||||
<arg value="../make/str.js"/>
|
||||
<arg value="../samples/test.js"/>
|
||||
<jvmarg value="-Xdebug"/>
|
||||
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
||||
</java>
|
||||
|
@ -702,7 +702,7 @@ final class AssignSymbols extends NodeOperatorVisitor<LexicalContext> implements
|
||||
// If this is a declared variable or a function parameter, delete always fails (except for globals).
|
||||
final String name = ident.getName();
|
||||
final Symbol symbol = ident.getSymbol();
|
||||
final boolean failDelete = strictMode || symbol.isParam() || (symbol.isVar() && !symbol.isProgramLevel());
|
||||
final boolean failDelete = strictMode || (!symbol.isScope() && (symbol.isParam() || (symbol.isVar() && !symbol.isProgramLevel())));
|
||||
|
||||
if (failDelete && symbol.isThis()) {
|
||||
return LiteralNode.newInstance(unaryNode, true).accept(this);
|
||||
|
@ -583,7 +583,11 @@ final class LocalVariableTypesCalculator extends NodeVisitor<LexicalContext>{
|
||||
}
|
||||
}
|
||||
setCompilerConstantAsObject(functionNode, CompilerConstants.THIS);
|
||||
if(functionNode.needsParentScope()) {
|
||||
|
||||
// NOTE: coarse-grained. If we wanted to solve it completely precisely,
|
||||
// we'd also need to push/pop its type when handling WithNode (so that
|
||||
// it can go back to undefined after a 'with' block.
|
||||
if(functionNode.hasScopeBlock() || functionNode.needsParentScope()) {
|
||||
setCompilerConstantAsObject(functionNode, CompilerConstants.SCOPE);
|
||||
}
|
||||
if(functionNode.needsCallee()) {
|
||||
|
54
nashorn/test/script/basic/JDK-8047728.js
Normal file
54
nashorn/test/script/basic/JDK-8047728.js
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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-8047728: (function(x){var o={x:0}; with(o){delete x} return o.x})() evaluates to 0 instead of undefined
|
||||
*
|
||||
* @test
|
||||
* @run
|
||||
*/
|
||||
|
||||
function func(x) {
|
||||
var o = {x:0};
|
||||
with(o){
|
||||
delete x;
|
||||
}
|
||||
return o.x
|
||||
}
|
||||
|
||||
if (typeof func() != 'undefined') {
|
||||
fail("expected undefined from 'func' call");
|
||||
}
|
||||
|
||||
function func2() {
|
||||
var x;
|
||||
var o = {x:0};
|
||||
with(o){
|
||||
delete x;
|
||||
}
|
||||
return o.x
|
||||
}
|
||||
|
||||
if (typeof func2() != 'undefined') {
|
||||
fail("expected undefined from 'func2' call");
|
||||
}
|
Loading…
Reference in New Issue
Block a user