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="-Dnashorn.optimistic"/>
|
||||||
<jvmarg line="${ext.class.path}"/>
|
<jvmarg line="${ext.class.path}"/>
|
||||||
<jvmarg line="${run.test.jvmargs}"/>
|
<jvmarg line="${run.test.jvmargs}"/>
|
||||||
<arg value="../make/str.js"/>
|
<arg value="../samples/test.js"/>
|
||||||
<jvmarg value="-Xdebug"/>
|
<jvmarg value="-Xdebug"/>
|
||||||
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
||||||
</java>
|
</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).
|
// If this is a declared variable or a function parameter, delete always fails (except for globals).
|
||||||
final String name = ident.getName();
|
final String name = ident.getName();
|
||||||
final Symbol symbol = ident.getSymbol();
|
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()) {
|
if (failDelete && symbol.isThis()) {
|
||||||
return LiteralNode.newInstance(unaryNode, true).accept(this);
|
return LiteralNode.newInstance(unaryNode, true).accept(this);
|
||||||
|
@ -583,7 +583,11 @@ final class LocalVariableTypesCalculator extends NodeVisitor<LexicalContext>{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
setCompilerConstantAsObject(functionNode, CompilerConstants.THIS);
|
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);
|
setCompilerConstantAsObject(functionNode, CompilerConstants.SCOPE);
|
||||||
}
|
}
|
||||||
if(functionNode.needsCallee()) {
|
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…
x
Reference in New Issue
Block a user