NASHORN-207_2.js revision 877:cf4d2252d444
1/* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/** 25 * NASHORN-207 : Implement strict mode. 26 * 27 * @test 28 * @run 29 */ 30 31// make sure that 'use strict' as first directive inside eval 32// also works the same way (as eval called from strict mode caller). 33 34try { 35 eval("'use strict'; foo = 4;"); 36 fail("#1 should have thrown ReferenceError"); 37} catch (e) { 38 if (! (e instanceof ReferenceError)) { 39 fail("#2 expected ReferenceError but got " + e); 40 } 41} 42 43if (typeof foo !== 'undefined') { 44 fail("#3 strict mode eval defined var in global scope!"); 45} 46 47try { 48 eval("'use strict'; var let = 23;"); 49 fail("#4 should have thrown SyntaxError"); 50} catch (e) { 51 if (! (e instanceof SyntaxError)) { 52 fail("#5 SyntaxError expected but got " + e); 53 } 54} 55 56// non-strict mode, some of the future reserved words can be used 57// as identifiers. These include "let", "implements", "yield" etc. 58var let = 30; 59var implements = "hello"; 60function yield() {} 61function public() {} 62var private = false; 63var protected = "hello"; 64var interface = "interface"; 65function f(package) {} 66function static() {} 67 68// in strict mode, arguments does not alias named access 69function func(x, y) { 70 'use strict'; 71 72 if (x !== arguments[0]) { 73 fail("#6 arguments[0] !== x"); 74 } 75 76 if (y !== arguments[1]) { 77 fail("#7 arguments[1] !== y"); 78 } 79 80 arguments[0] = 1; 81 arguments[1] = 2; 82 83 if (x === arguments[0]) { 84 fail("#8 arguments[0] === x after assignment to it"); 85 } 86 87 if (y === arguments[1]) { 88 fail("#9 arguments[1] === y after assignment to it "); 89 } 90} 91 92func(); 93 94// functions can not be declared everywhere!! 95try { 96 eval("'use strict'; if (true) { function func() {} }"); 97 fail("#10 should have thrown SyntaxError"); 98} catch (e) { 99 if (! (e instanceof SyntaxError)) { 100 fail("#11 SyntaxError expected got " + e); 101 } 102} 103 104// arguments.caller and arguments.callee can't read or written in strict mode 105function func2() { 106 'use strict'; 107 108 try { 109 print(arguments.callee); 110 fail("#12 arguments.callee should have thrown TypeError"); 111 } catch (e) { 112 if (! (e instanceof TypeError)) { 113 fail("#13 TypeError expected, got " + e); 114 } 115 } 116 117 try { 118 print(arguments.caller); 119 fail("#14 arguments.caller should have thrown TypeError"); 120 } catch (e) { 121 if (! (e instanceof TypeError)) { 122 fail("#15 TypeError expected, got " + e); 123 } 124 } 125 126 try { 127 arguments.caller = 10; 128 fail("#16 arguments.caller assign should have thrown TypeError"); 129 } catch (e) { 130 if (! (e instanceof TypeError)) { 131 fail("#17 TypeError expected, got " + e); 132 } 133 } 134 135 try { 136 arguments.callee = true; 137 fail("#18 arguments.callee assign should have thrown TypeError"); 138 } catch (e) { 139 if (! (e instanceof TypeError)) { 140 fail("#19 TypeError expected, got " + e); 141 } 142 } 143} 144 145func2(); 146 147// func.caller and func.arguments can't read or written in strict mode 148function func3() { 149 'use strict'; 150 151 try { 152 print(func3.arguments); 153 fail("#20 func.arguments should have thrown TypeError"); 154 } catch (e) { 155 if (! (e instanceof TypeError)) { 156 fail("#21 TypeError expected, got " + e); 157 } 158 } 159 160 try { 161 print(func3.caller); 162 fail("#22 func3.caller should have thrown TypeError"); 163 } catch (e) { 164 if (! (e instanceof TypeError)) { 165 fail("#23 TypeError expected, got " + e); 166 } 167 } 168 169 try { 170 func3.arguments = 10; 171 fail("#24 func3.arguments assign should have thrown TypeError"); 172 } catch (e) { 173 if (! (e instanceof TypeError)) { 174 fail("#25 TypeError expected, got " + e); 175 } 176 } 177 178 try { 179 func3.caller = true; 180 fail("#26 func3.caller assign should have thrown TypeError"); 181 } catch (e) { 182 if (! (e instanceof TypeError)) { 183 fail("#27 TypeError expected, got " + e); 184 } 185 } 186} 187 188func3(); 189 190try { 191 eval("function eval() { 'use strict'; }"); 192 fail("#28 should have thrown SyntaxError"); 193} catch (e) { 194 if (! (e instanceof SyntaxError)) { 195 fail("#29 SyntaxError expected, got " + e); 196 } 197} 198 199function func4() { 200 'use \ 201strict'; 202 203 // The use strict directive can't contain line continuation. 204 // So this is not a strict mode function!! 205 with({}) {} 206} 207 208func4(); 209 210function func5() { 211 'use\u2028strict'; 212 213 // The use strict directive can't contain unicode whitespace escapes 214 // So this is not a strict mode function!! 215 with({}) {} 216} 217 218func5(); 219 220function func6() { 221 'use\u2029strict'; 222 223 // The use strict directive can't contain unicode whitespace escapes 224 // So this is not a strict mode function!! 225 with({}) {} 226} 227 228func6(); 229 230try { 231 eval("'bogus directive'; 'use strict'; eval = 10"); 232 fail("#30 SyntaxError expected from eval"); 233} catch (e) { 234 if (! (e instanceof SyntaxError)) { 235 fail("#31 SyntaxError expected but got " + e); 236 } 237} 238