Mercurial > hg > openjdk > jdk9 > nashorn
changeset 905:3edd4da9386f
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
author | sundar |
---|---|
date | Mon, 23 Jun 2014 21:23:53 +0530 |
parents | 6afee63aa1cc |
children | 72493c5057dd |
files | bin/jjsdebug.sh make/nbproject/ide-targets.xml src/jdk/nashorn/internal/codegen/AssignSymbols.java src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java test/script/basic/JDK-8047728.js |
diffstat | 5 files changed, 86 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/jjsdebug.sh Mon Jun 23 21:23:53 2014 +0530 @@ -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 $*
--- a/make/nbproject/ide-targets.xml Mon Jun 23 10:59:33 2014 +0200 +++ b/make/nbproject/ide-targets.xml Mon Jun 23 21:23:53 2014 +0530 @@ -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>
--- a/src/jdk/nashorn/internal/codegen/AssignSymbols.java Mon Jun 23 10:59:33 2014 +0200 +++ b/src/jdk/nashorn/internal/codegen/AssignSymbols.java Mon Jun 23 21:23:53 2014 +0530 @@ -702,7 +702,7 @@ // 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);
--- a/src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java Mon Jun 23 10:59:33 2014 +0200 +++ b/src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java Mon Jun 23 21:23:53 2014 +0530 @@ -583,7 +583,11 @@ } } 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()) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8047728.js Mon Jun 23 21:23:53 2014 +0530 @@ -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"); +}