Fri, 20 Sep 2013 12:56:07 +0530
8025111: undefined or null 'with' expression in empty with block should throw TypeError
Reviewed-by: lagergren, hannesw
src/jdk/nashorn/internal/codegen/CodeGenerator.java | file | annotate | diff | comparison | revisions | |
test/script/basic/JDK-8025111.js | file | annotate | diff | comparison | revisions |
1.1 --- a/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Sep 19 23:48:37 2013 +0530 1.2 +++ b/src/jdk/nashorn/internal/codegen/CodeGenerator.java Fri Sep 20 12:56:07 2013 +0530 1.3 @@ -2174,8 +2174,9 @@ 1.4 method.invoke(ScriptRuntime.OPEN_WITH); 1.5 method.storeCompilerConstant(SCOPE); 1.6 } else { 1.7 - // We just loaded the expression for its side effect; discard it 1.8 - method.pop(); 1.9 + // We just loaded the expression for its side effect and to check 1.10 + // for null or undefined value. 1.11 + globalCheckObjectCoercible(); 1.12 } 1.13 1.14 1.15 @@ -3257,6 +3258,10 @@ 1.16 return method.invokestatic(GLOBAL_OBJECT, "isEval", methodDescriptor(boolean.class, Object.class)); 1.17 } 1.18 1.19 + private MethodEmitter globalCheckObjectCoercible() { 1.20 + return method.invokestatic(GLOBAL_OBJECT, "checkObjectCoercible", methodDescriptor(void.class, Object.class)); 1.21 + } 1.22 + 1.23 private MethodEmitter globalDirectEval() { 1.24 return method.invokestatic(GLOBAL_OBJECT, "directEval", 1.25 methodDescriptor(Object.class, Object.class, Object.class, Object.class, Object.class, Object.class));
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/script/basic/JDK-8025111.js Fri Sep 20 12:56:07 2013 +0530 2.3 @@ -0,0 +1,48 @@ 2.4 +/* 2.5 + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 2.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.7 + * 2.8 + * This code is free software; you can redistribute it and/or modify it 2.9 + * under the terms of the GNU General Public License version 2 only, as 2.10 + * published by the Free Software Foundation. 2.11 + * 2.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 2.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 2.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2.15 + * version 2 for more details (a copy is included in the LICENSE file that 2.16 + * accompanied this code). 2.17 + * 2.18 + * You should have received a copy of the GNU General Public License version 2.19 + * 2 along with this work; if not, write to the Free Software Foundation, 2.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2.21 + * 2.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2.23 + * or visit www.oracle.com if you need additional information or have any 2.24 + * questions. 2.25 + */ 2.26 + 2.27 +/** 2.28 + * JDK-8025111: undefined or null 'with' expression in empty with block should throw TypeError 2.29 + * 2.30 + * @test 2.31 + * @run 2.32 + */ 2.33 + 2.34 +function check(callback, arg) { 2.35 + try { 2.36 + callback(arg); 2.37 + fail("should have thrown TypeError: " + callback + " on " + arg); 2.38 + } catch (e) { 2.39 + if (! (e instanceof TypeError)) { 2.40 + fail("Expected TypeError, got " + e); 2.41 + } 2.42 + } 2.43 +} 2.44 + 2.45 +function func(obj) { 2.46 + with(obj) {} 2.47 +} 2.48 + 2.49 +check(func); 2.50 +check(func, undefined); 2.51 +check(func, null);