11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved. 21e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Redistribution and use in source and binary forms, with or without 31e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// modification, are permitted provided that the following conditions are 41e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// met: 51e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 61e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Redistributions of source code must retain the above copyright 71e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// notice, this list of conditions and the following disclaimer. 81e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Redistributions in binary form must reproduce the above 91e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// copyright notice, this list of conditions and the following 101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// disclaimer in the documentation and/or other materials provided 111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// with the distribution. 121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Neither the name of Google Inc. nor the names of its 131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// contributors may be used to endorse or promote products derived 141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// from this software without specific prior written permission. 151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction CheckStrictMode(code, exception) { 291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertDoesNotThrow(code); 301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows("'use strict';\n" + code, exception); 311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows('"use strict";\n' + code, exception); 321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertDoesNotThrow("\ 331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function outer() {\ 341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function inner() {\n" 351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block + code + 361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "\n}\ 371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block }"); 381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows("\ 391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function outer() {\ 401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 'use strict';\ 411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function inner() {\n" 421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block + code + 431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "\n}\ 441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block }", exception); 451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction CheckFunctionConstructorStrictMode() { 481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var args = []; 491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block for (var i = 0; i < arguments.length; i ++) { 501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block args[i] = arguments[i]; 511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Create non-strict function. No exception. 531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block args[arguments.length] = ""; 541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertDoesNotThrow(function() { 551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Function.apply(this, args); 561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block }); 571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Create strict mode function. Exception expected. 581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block args[arguments.length] = "'use strict';"; 591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows(function() { 601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Function.apply(this, args); 611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block }, SyntaxError); 621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Incorrect 'use strict' directive. 651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block(function UseStrictEscape() { 661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use\\x20strict"; 671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) {}; 681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block})(); 691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Incorrectly place 'use strict' directive. 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertThrows("function foo (x) 'use strict'; {}", SyntaxError); 723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 'use strict' in non-directive position. 741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block(function UseStrictNonDirective() { 751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void(0); 761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict"; 771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) {}; 781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block})(); 791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Multiple directives, including "use strict". 811e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows('\ 821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block"directive 1";\ 831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block"another directive";\ 841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block"use strict";\ 851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block"directive after strict";\ 861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block"and one more";\ 871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockwith({}) {}', SyntaxError); 881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 'with' disallowed in strict mode. 901e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("with({}) {}", SyntaxError); 911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function named 'eval'. 931e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function eval() {}", SyntaxError); 941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function named 'arguments'. 961e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function arguments() {}", SyntaxError); 971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function parameter named 'eval'. 991e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function foo(a, b, eval, c, d) {}", SyntaxError); 1001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function parameter named 'arguments'. 1021e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function foo(a, b, arguments, c, d) {}", SyntaxError); 1031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Property accessor parameter named 'eval'. 1051e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var o = { set foo(eval) {} }", SyntaxError); 1061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Property accessor parameter named 'arguments'. 1081e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var o = { set foo(arguments) {} }", SyntaxError); 1091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Duplicate function parameter name. 1111e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function foo(a, b, c, d, b) {}", SyntaxError); 1121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function constructor: eval parameter name. 1141e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckFunctionConstructorStrictMode("eval"); 1151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function constructor: arguments parameter name. 1171e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckFunctionConstructorStrictMode("arguments"); 1181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Function constructor: duplicate parameter name. 1201e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckFunctionConstructorStrictMode("a", "b", "c", "b"); 1211e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckFunctionConstructorStrictMode("a,b,c,b"); 1221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// catch(eval) 1241e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("try{}catch(eval){};", SyntaxError); 1251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// catch(arguments) 1271e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("try{}catch(arguments){};", SyntaxError); 1281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// var eval 1301e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var eval;", SyntaxError); 1311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// var arguments 1331e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var arguments;", SyntaxError); 1341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Strict mode applies to the function in which the directive is used.. 1361e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows('\ 1371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction foo(eval) {\ 1381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict";\ 1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}', SyntaxError); 1401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Strict mode doesn't affect the outer stop of strict code. 1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block(function NotStrict(eval) { 1431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function Strict() { 1441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict"; 1451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) {}; 1471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block})(); 1481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Octal literal 1501e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var x = 012"); 1511e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("012"); 1521e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("'Hello octal\\032'"); 1531e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function octal() { return 012; }"); 1541e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function octal() { return '\\032'; }"); 1551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block(function ValidEscape() { 1571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict"; 1581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var x = '\0'; 1591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var y = "\0"; 1601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block})(); 1611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Octal before "use strict" 1631e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows('\ 1641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function strict() {\ 1651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "octal\\032directive";\ 1661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict";\ 1671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block }', SyntaxError); 1681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Duplicate data properties. 1701e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var x = { dupe : 1, nondupe: 3, dupe : 2 };", SyntaxError); 1711e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var x = { '1234' : 1, '2345' : 2, '1234' : 3 };", SyntaxError); 1721e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var x = { '1234' : 1, '2345' : 2, 1234 : 3 };", SyntaxError); 1731e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var x = { 3.14 : 1, 2.71 : 2, 3.14 : 3 };", SyntaxError); 1741e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("var x = { 3.14 : 1, '3.14' : 2 };", SyntaxError); 175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("var x = { \ 176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 123: 1, \ 177e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 123.00000000000000000000000000000000000000000000000000000000000000000001: 2 \ 178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}", SyntaxError); 1791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Non-conflicting data properties. 1811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block(function StrictModeNonDuplicate() { 1821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict"; 1831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var x = { 123 : 1, "0123" : 2 }; 184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var x = { 185e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 123: 1, 186e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch '123.00000000000000000000000000000000000000000000000000000000000000000001': 187e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2 188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch }; 1891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block})(); 1901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Two getters (non-strict) 1921e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { get foo() { }, get foo() { } };", SyntaxError); 1931e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { get foo(){}, get 'foo'(){}};", SyntaxError); 1941e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { get 12(){}, get '12'(){}};", SyntaxError); 1951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Two setters (non-strict) 1971e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set foo(v) { }, set foo(v) { } };", SyntaxError); 1981e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set foo(v) { }, set 'foo'(v) { } };", SyntaxError); 1991e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set 13(v) { }, set '13'(v) { } };", SyntaxError); 2001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Setter and data (non-strict) 2021e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { foo: 'data', set foo(v) { } };", SyntaxError); 2031e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set foo(v) { }, foo: 'data' };", SyntaxError); 2041e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { foo: 'data', set 'foo'(v) { } };", SyntaxError); 2051e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set foo(v) { }, 'foo': 'data' };", SyntaxError); 2061e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { 'foo': 'data', set foo(v) { } };", SyntaxError); 2071e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set 'foo'(v) { }, foo: 'data' };", SyntaxError); 2081e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { 'foo': 'data', set 'foo'(v) { } };", SyntaxError); 2091e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { set 'foo'(v) { }, 'foo': 'data' };", SyntaxError); 2101e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { 12: 1, set '12'(v){}};", SyntaxError); 2111e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { 12: 1, set 12(v){}};", SyntaxError); 2121e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { '12': 1, set '12'(v){}};", SyntaxError); 2131e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { '12': 1, set 12(v){}};", SyntaxError); 2141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Getter and data (non-strict) 2161e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { foo: 'data', get foo() { } };", SyntaxError); 2171e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { get foo() { }, foo: 'data' };", SyntaxError); 2181e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { 'foo': 'data', get foo() { } };", SyntaxError); 2191e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { get 'foo'() { }, 'foo': 'data' };", SyntaxError); 2201e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { '12': 1, get '12'(){}};", SyntaxError); 2211e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("var x = { '12': 1, get 12(){}};", SyntaxError); 2221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Assignment to eval or arguments 2241e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { eval = undefined; }", SyntaxError); 2251e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { arguments = undefined; }", SyntaxError); 2261e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(eval = undefined); }", SyntaxError); 227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { print(arguments = undefined); }", 228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 2291e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = eval = undefined; }", SyntaxError); 230e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { var x = arguments = undefined; }", 231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 2321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Compound assignment to eval or arguments 2341e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { eval *= undefined; }", SyntaxError); 2351e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { arguments /= undefined; }", SyntaxError); 2361e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(eval %= undefined); }", SyntaxError); 237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { print(arguments %= undefined); }", 238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { var x = eval += undefined; }", 240e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 241e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { var x = arguments -= undefined; }", 242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 2431e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { eval <<= undefined; }", SyntaxError); 2441e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { arguments >>= undefined; }", SyntaxError); 245e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { print(eval >>>= undefined); }", 246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { print(arguments &= undefined); }", 248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { var x = eval ^= undefined; }", 250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 251e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { var x = arguments |= undefined; }", 252e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 2531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Postfix increment with eval or arguments 2551e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { eval++; }", SyntaxError); 2561e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { arguments++; }", SyntaxError); 2571e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(eval++); }", SyntaxError); 2581e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(arguments++); }", SyntaxError); 2591e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = eval++; }", SyntaxError); 2601e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = arguments++; }", SyntaxError); 2611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Postfix decrement with eval or arguments 2631e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { eval--; }", SyntaxError); 2641e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { arguments--; }", SyntaxError); 2651e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(eval--); }", SyntaxError); 2661e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(arguments--); }", SyntaxError); 2671e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = eval--; }", SyntaxError); 2681e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = arguments--; }", SyntaxError); 2691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Prefix increment with eval or arguments 2711e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { ++eval; }", SyntaxError); 2721e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { ++arguments; }", SyntaxError); 2731e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(++eval); }", SyntaxError); 2741e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(++arguments); }", SyntaxError); 2751e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = ++eval; }", SyntaxError); 2761e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = ++arguments; }", SyntaxError); 2771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Prefix decrement with eval or arguments 2791e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { --eval; }", SyntaxError); 2801e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { --arguments; }", SyntaxError); 2811e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(--eval); }", SyntaxError); 2821e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { print(--arguments); }", SyntaxError); 2831e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = --eval; }", SyntaxError); 2841e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockCheckStrictMode("function strict() { var x = --arguments; }", SyntaxError); 2851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Use of const in strict mode is disallowed in anticipation of ES Harmony. 287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("const x = 0;", SyntaxError); 288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("for (const x = 0; false;) {}", SyntaxError); 289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { const x = 0; }", SyntaxError); 290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Strict mode only allows functions in SourceElements 292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("if (true) { function invalid() {} }", SyntaxError); 293e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("for (;false;) { function invalid() {} }", SyntaxError); 294e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("{ function invalid() {} }", SyntaxError); 295e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("try { function invalid() {} } catch(e) {}", SyntaxError); 296e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("try { } catch(e) { function invalid() {} }", SyntaxError); 297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function outer() {{ function invalid() {} }}", SyntaxError); 298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Delete of an unqualified identifier 300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("delete unqualified;", SyntaxError); 301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { delete unqualified; }", SyntaxError); 302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function function_name() { delete function_name; }", 303e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict(parameter) { delete parameter; }", 305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("function strict() { var variable; delete variable; }", 307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 308e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochCheckStrictMode("var variable; delete variable;", SyntaxError); 309e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestStrictDelete() { 311e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // "delete this" is allowed in strict mode and should work. 313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function strict_delete() { delete this; } 314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch strict_delete(); 315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 316e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Prefix unary operators other than delete, ++, -- are valid in strict mode 3181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block(function StrictModeUnaryOperators() { 3191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "use strict"; 3201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval]; 3211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var y = [void arguments, typeof arguments, 3221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block +arguments, -arguments, ~arguments, !arguments]; 3231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block})(); 3241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// 7.6.1.2 Future Reserved Words in strict mode 3263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar future_strict_reserved_words = [ 3271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "implements", 3281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "interface", 3291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "let", 3301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "package", 3311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "private", 3321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "protected", 3331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "public", 3341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "static", 3351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "yield" ]; 3361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction testFutureStrictReservedWord(word) { 3381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Simple use of each reserved word 3391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("var " + word + " = 1;", SyntaxError); 3403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CheckStrictMode("typeof (" + word + ");", SyntaxError); 3411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // object literal properties 3431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { " + word + " : 42 };"); 3441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { get " + word + " () {} };"); 3451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { set " + word + " (value) {} };"); 3463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch eval("var x = { get " + word + " () { 'use strict'; } };"); 3473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch eval("var x = { set " + word + " (value) { 'use strict'; } };"); 3481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // object literal with string literal property names 3501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { '" + word + "' : 42 };"); 3511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { get '" + word + "' () { } };"); 3521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { set '" + word + "' (value) { } };"); 3531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { get '" + word + "' () { 'use strict'; } };"); 3541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block eval("var x = { set '" + word + "' (value) { 'use strict'; } };"); 3551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Function names and arguments, strict and non-strict contexts 3571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("function " + word + " () {}", SyntaxError); 3581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("function foo (" + word + ") {}", SyntaxError); 3591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("function foo (" + word + ", " + word + ") {}", SyntaxError); 3601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("function foo (a, " + word + ") {}", SyntaxError); 3611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("function foo (" + word + ", a) {}", SyntaxError); 3621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("function foo (a, " + word + ", b) {}", SyntaxError); 3631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CheckStrictMode("var foo = function (" + word + ") {}", SyntaxError); 3641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Function names and arguments when the body is strict 3661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows("function " + word + " () { 'use strict'; }", SyntaxError); 367e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows("function foo (" + word + ", " + word + ") { 'use strict'; }", 368e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 3691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows("function foo (a, " + word + ") { 'use strict'; }", SyntaxError); 3701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertThrows("function foo (" + word + ", a) { 'use strict'; }", SyntaxError); 371e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows("function foo (a, " + word + ", b) { 'use strict'; }", 372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 373e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows("var foo = function (" + word + ") { 'use strict'; }", 374e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 3751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // setter parameter when the body is strict 3773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CheckStrictMode("var x = { set foo(" + word + ") {} };", SyntaxError); 378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows("var x = { set foo(" + word + ") { 'use strict'; } };", 379e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SyntaxError); 3801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 3811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfor (var i = 0; i < future_strict_reserved_words.length; i++) { 3833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch testFutureStrictReservedWord(future_strict_reserved_words[i]); 3841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 3851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction testAssignToUndefined(test, should_throw) { 3871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block try { 3888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch test(); 3891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } catch (e) { 3901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertTrue(should_throw, "strict mode"); 3911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertInstanceof(e, ReferenceError, "strict mode"); 3921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return; 3931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 3941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block assertFalse(should_throw, "strict mode"); 3951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 3961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction repeat(n, f) { 3988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for (var i = 0; i < n; i ++) { f(); } 3998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 4008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction assignToUndefined() { 4028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch "use strict"; 4038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch possibly_undefined_variable_for_strict_mode_test = "should throw?"; 4048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 4058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4068b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, true); 4078b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, true); 4088b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, true); 4091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockpossibly_undefined_variable_for_strict_mode_test = "value"; 4111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4128b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, false); 4138b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, false); 4148b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, false); 4151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockdelete possibly_undefined_variable_for_strict_mode_test; 4171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4188b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, true); 4198b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, true); 4208b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefined, true); 4211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { testAssignToUndefined(assignToUndefined, true); }); 4231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockpossibly_undefined_variable_for_strict_mode_test = "value"; 4248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { testAssignToUndefined(assignToUndefined, false); }); 4251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockdelete possibly_undefined_variable_for_strict_mode_test; 4268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { testAssignToUndefined(assignToUndefined, true); }); 4271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockpossibly_undefined_variable_for_strict_mode_test = undefined; 4288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { testAssignToUndefined(assignToUndefined, false); }); 4298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction assignToUndefinedWithEval() { 4318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch "use strict"; 4328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch possibly_undefined_variable_for_strict_mode_test_with_eval = "should throw?"; 4338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch eval(""); 4348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 4358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4368b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, true); 4378b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, true); 4388b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, true); 4398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochpossibly_undefined_variable_for_strict_mode_test_with_eval = "value"; 4418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4428b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, false); 4438b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, false); 4448b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, false); 4458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochdelete possibly_undefined_variable_for_strict_mode_test_with_eval; 4478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4488b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, true); 4498b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, true); 4508b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochtestAssignToUndefined(assignToUndefinedWithEval, true); 4518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { 4538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch testAssignToUndefined(assignToUndefinedWithEval, true); 4548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }); 4558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochpossibly_undefined_variable_for_strict_mode_test_with_eval = "value"; 4568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { 4578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch testAssignToUndefined(assignToUndefinedWithEval, false); 4588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }); 4598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochdelete possibly_undefined_variable_for_strict_mode_test_with_eval; 4608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { 4618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch testAssignToUndefined(assignToUndefinedWithEval, true); 4628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }); 4638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochpossibly_undefined_variable_for_strict_mode_test_with_eval = undefined; 4648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochrepeat(10, function() { 4658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch testAssignToUndefined(assignToUndefinedWithEval, false); 4668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }); 4678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function testDeleteNonConfigurable() { 471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function delete_property(o) { 472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 473e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete o.property; 474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function delete_element(o, i) { 476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete o[i]; 478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var object = {}; 481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(object, "property", { value: "property_value" }); 483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(object, "1", { value: "one" }); 484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(object, 7, { value: "seven" }); 485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(object, 3.14, { value: "pi" }); 486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 487e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_property(object); }, TypeError); 488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(object.property, "property_value"); 489e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_element(object, "1"); }, TypeError); 490e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_element(object, 1); }, TypeError); 491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(object[1], "one"); 492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_element(object, "7"); }, TypeError); 493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_element(object, 7); }, TypeError); 494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(object[7], "seven"); 495e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_element(object, "3.14"); }, TypeError); 496e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { delete_element(object, 3.14); }, TypeError); 497e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(object[3.14], "pi"); 498e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 499e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Not transforming this in Function.call and Function.apply. 501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function testThisTransformCallApply() { 502e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function non_strict() { 503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return this; 504e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 505e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function strict() { 506e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 507e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return this; 508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 509e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var global_object = (function() { return this; })(); 511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var object = {}; 512e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 513e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Non-strict call. 514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(non_strict.call(null) === global_object); 515e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(non_strict.call(undefined) === global_object); 516e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof non_strict.call(7), "object"); 517e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof non_strict.call("Hello"), "object"); 518e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(non_strict.call(object) === object); 519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Non-strict apply. 521e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(non_strict.apply(null) === global_object); 522e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(non_strict.apply(undefined) === global_object); 523e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof non_strict.apply(7), "object"); 524e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof non_strict.apply("Hello"), "object"); 525e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(non_strict.apply(object) === object); 526e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 527e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Strict call. 528e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(strict.call(null) === null); 529e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(strict.call(undefined) === undefined); 530e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof strict.call(7), "number"); 531e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof strict.call("Hello"), "string"); 532e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(strict.call(object) === object); 533e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 534e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Strict apply. 535e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(strict.apply(null) === null); 536e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(strict.apply(undefined) === undefined); 537e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof strict.apply(7), "number"); 538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(typeof strict.apply("Hello"), "string"); 539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertTrue(strict.apply(object) === object); 540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 542e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function testThisTransform() { 543e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch try { 544e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function strict() { 545e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return typeof(this); 547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 548e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function nonstrict() { 549e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return typeof(this); 550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Concat to avoid symbol. 553e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var strict_name = "str" + "ict"; 554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var nonstrict_name = "non" + "str" + "ict"; 555e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var strict_number = 17; 556e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var nonstrict_number = 19; 557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var strict_name_get = "str" + "ict" + "get"; 558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var nonstrict_name_get = "non" + "str" + "ict" + "get" 559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var strict_number_get = 23; 560e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var nonstrict_number_get = 29; 561e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 562e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function install(t) { 563e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch t.prototype.strict = strict; 564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch t.prototype.nonstrict = nonstrict; 565e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch t.prototype[strict_number] = strict; 566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch t.prototype[nonstrict_number] = nonstrict; 567e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(t.prototype, strict_name_get, 568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch { get: function() { return strict; }, 569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch configurable: true }); 570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(t.prototype, nonstrict_name_get, 571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch { get: function() { return nonstrict; }, 572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch configurable: true }); 573e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(t.prototype, strict_number_get, 574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch { get: function() { return strict; }, 575e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch configurable: true }); 576e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(t.prototype, nonstrict_number_get, 577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch { get: function() { return nonstrict; }, 578e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch configurable: true }); 579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 580e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function cleanup(t) { 582e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype.strict; 583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype.nonstrict; 584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype[strict_number]; 585e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype[nonstrict_number]; 586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype[strict_name_get]; 587e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype[nonstrict_name_get]; 588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype[strict_number_get]; 589e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch delete t.prototype[nonstrict_number_get]; 590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Set up fakes 593e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch install(String); 594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch install(Number); 595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch install(Boolean) 596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callStrict(o) { 598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o.strict(); 599e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callNonStrict(o) { 601e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o.nonstrict(); 602e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 603e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callKeyedStrict(o) { 604e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[strict_name](); 605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callKeyedNonStrict(o) { 607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[nonstrict_name](); 608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callIndexedStrict(o) { 610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[strict_number](); 611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callIndexedNonStrict(o) { 613e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[nonstrict_number](); 614e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 615e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callStrictGet(o) { 616e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o.strictget(); 617e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 618e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callNonStrictGet(o) { 619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o.nonstrictget(); 620e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 621e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callKeyedStrictGet(o) { 622e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[strict_name_get](); 623e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 624e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callKeyedNonStrictGet(o) { 625e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[nonstrict_name_get](); 626e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callIndexedStrictGet(o) { 628e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[strict_number_get](); 629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 630e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function callIndexedNonStrictGet(o) { 631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return o[nonstrict_number_get](); 632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 633e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 634e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch for (var i = 0; i < 10; i ++) { 635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello").strict(), "string"); 636e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello").nonstrict(), "object"); 637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[strict_name](), "string"); 638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[nonstrict_name](), "object"); 639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[strict_number](), "string"); 640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[nonstrict_number](), "object"); 641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i).strict(), "number"); 643e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i).nonstrict(), "object"); 644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[strict_name](), "number"); 645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[nonstrict_name](), "object"); 646e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[strict_number](), "number"); 647e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[nonstrict_number](), "object"); 648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true).strict(), "boolean"); 650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true).nonstrict(), "object"); 651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[strict_name](), "boolean"); 652e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[nonstrict_name](), "object"); 653e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[strict_number](), "boolean"); 654e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[nonstrict_number](), "object"); 655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false).strict(), "boolean"); 657e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false).nonstrict(), "object"); 658e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[strict_name](), "boolean"); 659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[nonstrict_name](), "object"); 660e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[strict_number](), "boolean"); 661e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[nonstrict_number](), "object"); 662e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 663e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrict("howdy"), "string"); 664e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrict("howdy"), "object"); 665e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrict("howdy"), "string"); 666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrict("howdy"), "object"); 667e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrict("howdy"), "string"); 668e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrict("howdy"), "object"); 669e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 670e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrict(17 + i), "number"); 671e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrict(17 + i), "object"); 672e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrict(17 + i), "number"); 673e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrict(17 + i), "object"); 674e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrict(17 + i), "number"); 675e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrict(17 + i), "object"); 676e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 677e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrict(true), "boolean"); 678e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrict(true), "object"); 679e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrict(true), "boolean"); 680e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrict(true), "object"); 681e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrict(true), "boolean"); 682e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrict(true), "object"); 683e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 684e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrict(false), "boolean"); 685e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrict(false), "object"); 686e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrict(false), "boolean"); 687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrict(false), "object"); 688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrict(false), "boolean"); 689e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrict(false), "object"); 690e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 691e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // All of the above, with getters 692e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello").strictget(), "string"); 693e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello").nonstrictget(), "object"); 694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[strict_name_get](), "string"); 695e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[nonstrict_name_get](), "object"); 696e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[strict_number_get](), "string"); 697e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(("hello")[nonstrict_number_get](), "object"); 698e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i).strictget(), "number"); 700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i).nonstrictget(), "object"); 701e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[strict_name_get](), "number"); 702e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[nonstrict_name_get](), "object"); 703e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[strict_number_get](), "number"); 704e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((10 + i)[nonstrict_number_get](), "object"); 705e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 706e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true).strictget(), "boolean"); 707e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true).nonstrictget(), "object"); 708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[strict_name_get](), "boolean"); 709e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[nonstrict_name_get](), "object"); 710e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[strict_number_get](), "boolean"); 711e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((true)[nonstrict_number_get](), "object"); 712e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 713e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false).strictget(), "boolean"); 714e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false).nonstrictget(), "object"); 715e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[strict_name_get](), "boolean"); 716e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[nonstrict_name_get](), "object"); 717e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[strict_number_get](), "boolean"); 718e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals((false)[nonstrict_number_get](), "object"); 719e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrictGet("howdy"), "string"); 721e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrictGet("howdy"), "object"); 722e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrictGet("howdy"), "string"); 723e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrictGet("howdy"), "object"); 724e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrictGet("howdy"), "string"); 725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrictGet("howdy"), "object"); 726e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrictGet(17 + i), "number"); 728e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrictGet(17 + i), "object"); 729e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrictGet(17 + i), "number"); 730e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrictGet(17 + i), "object"); 731e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrictGet(17 + i), "number"); 732e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrictGet(17 + i), "object"); 733e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrictGet(true), "boolean"); 735e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrictGet(true), "object"); 736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrictGet(true), "boolean"); 737e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrictGet(true), "object"); 738e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrictGet(true), "boolean"); 739e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrictGet(true), "object"); 740e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 741e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callStrictGet(false), "boolean"); 742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callNonStrictGet(false), "object"); 743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedStrictGet(false), "boolean"); 744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callKeyedNonStrictGet(false), "object"); 745e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedStrictGet(false), "boolean"); 746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(callIndexedNonStrictGet(false), "object"); 747e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } finally { 750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Cleanup 751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch cleanup(String); 752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch cleanup(Number); 753e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch cleanup(Boolean); 754e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 755e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 756e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 757e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 758e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function ObjectEnvironment() { 759e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = {}; 760e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(o, "foo", { value: "FOO", writable: false }); 761e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows( 762e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function () { 763e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch with (o) { 764e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch (function() { 765e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch foo = "Hello"; 767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch })(); 768e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch }, 770e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch TypeError); 771e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 772e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 773e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 774e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestSetPropertyWithoutSetter() { 775e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = { get foo() { return "Yey"; } }; 776e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows( 777e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function broken() { 778e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 779e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch o.foo = (0xBADBAD00 >> 1); 780e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch }, 781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch TypeError); 782e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 783e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 784e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 785e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestSetPropertyNonConfigurable() { 786e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var frozen = Object.freeze({}); 787e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var sealed = Object.seal({}); 788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function strict(o) { 790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch o.property = "value"; 792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 793e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 794e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { strict(frozen); }, TypeError); 795e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { strict(sealed); }, TypeError); 796e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 799e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestAssignmentToReadOnlyProperty() { 800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = {}; 803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(o, "property", { value: 7 }); 804e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 805e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property = "new value"; }, TypeError); 806e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property += 10; }, TypeError); 807e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property -= 10; }, TypeError); 808e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property *= 10; }, TypeError); 809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property /= 10; }, TypeError); 810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property++; }, TypeError); 811e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o.property--; }, TypeError); 812e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { ++o.property; }, TypeError); 813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { --o.property; }, TypeError); 814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 815e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var name = "prop" + "erty"; // to avoid symbol path. 816e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name] = "new value"; }, TypeError); 817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name] += 10; }, TypeError); 818e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name] -= 10; }, TypeError); 819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name] *= 10; }, TypeError); 820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name] /= 10; }, TypeError); 821e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name]++; }, TypeError); 822e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[name]--; }, TypeError); 823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { ++o[name]; }, TypeError); 824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { --o[name]; }, TypeError); 825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o.property, 7); 827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 830e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestAssignmentToReadOnlyLoop() { 831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var name = "prop" + "erty"; // to avoid symbol path. 832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = {}; 833e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(o, "property", { value: 7 }); 834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 835e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function strict(o, name) { 836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch o[name] = "new value"; 838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch for (var i = 0; i < 10; i ++) { 8413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var exception = false; 842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch try { 843e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch strict(o, name); 844e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } catch(e) { 8453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 846e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertInstanceof(e, TypeError); 847e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 8483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 849e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 850e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 851e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Specialized KeyedStoreIC experiencing miss. 854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function testKeyedStoreICStrict() { 855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = [9,8,7,6,5,4,3,2,1]; 856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function test(o, i, v) { 858e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 859e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch o[i] = v; 860e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 862e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch for (var i = 0; i < 10; i ++) { 863e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch test(o, 5, 17); // start specialized for smi indices 864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[5], 17); 865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch test(o, "a", 19); 866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o["a"], 19); 867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch test(o, "5", 29); 868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[5], 29); 869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch test(o, 100000, 31); 870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[100000], 31); 871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 872e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 873e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 874e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 875e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestSetElementWithoutSetter() { 876e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 877e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 878e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = { }; 879e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(o, 0, { get : function() { } }); 880e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 881e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_smi = 0; 882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_number = new Number(0); 883e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_symbol = "0"; 884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_string = "-0-".substring(1,2); 885e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 886e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[zero_smi] = "new value"; }, TypeError); 887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[zero_number] = "new value"; }, TypeError); 888e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[zero_symbol] = "new value"; }, TypeError); 889e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[zero_string] = "new value"; }, TypeError); 890e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 891e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 892e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 893e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestSetElementNonConfigurable() { 894e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 895e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var frozen = Object.freeze({}); 896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var sealed = Object.seal({}); 897e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 898e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_number = 0; 899e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_symbol = "0"; 900e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var zero_string = "-0-".substring(1,2); 901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 902e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { frozen[zero_number] = "value"; }, TypeError); 903e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { sealed[zero_number] = "value"; }, TypeError); 904e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { frozen[zero_symbol] = "value"; }, TypeError); 905e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { sealed[zero_symbol] = "value"; }, TypeError); 906e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { frozen[zero_string] = "value"; }, TypeError); 907e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { sealed[zero_string] = "value"; }, TypeError); 908e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 909e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 910e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 911e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestAssignmentToReadOnlyElement() { 912e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 914e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = {}; 915e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(o, 7, { value: 17 }); 916e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 917e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_smi = 7; 918e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_number = new Number(7); 919e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_symbol = "7"; 920e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_string = "-7-".substring(1,2); 921e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 922e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Index with number. 923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi] = "value"; }, TypeError); 924e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi] += 10; }, TypeError); 925e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi] -= 10; }, TypeError); 926e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi] *= 10; }, TypeError); 927e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi] /= 10; }, TypeError); 928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi]++; }, TypeError); 929e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi]--; }, TypeError); 930e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { ++o[seven_smi]; }, TypeError); 931e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { --o[seven_smi]; }, TypeError); 932e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 933e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number] = "value"; }, TypeError); 934e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number] += 10; }, TypeError); 935e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number] -= 10; }, TypeError); 936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number] *= 10; }, TypeError); 937e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number] /= 10; }, TypeError); 938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number]++; }, TypeError); 939e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number]--; }, TypeError); 940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { ++o[seven_number]; }, TypeError); 941e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { --o[seven_number]; }, TypeError); 942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol] = "value"; }, TypeError); 944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol] += 10; }, TypeError); 945e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol] -= 10; }, TypeError); 946e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol] *= 10; }, TypeError); 947e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol] /= 10; }, TypeError); 948e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol]++; }, TypeError); 949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol]--; }, TypeError); 950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { ++o[seven_symbol]; }, TypeError); 951e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { --o[seven_symbol]; }, TypeError); 952e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 953e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string] = "value"; }, TypeError); 954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string] += 10; }, TypeError); 955e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string] -= 10; }, TypeError); 956e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string] *= 10; }, TypeError); 957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string] /= 10; }, TypeError); 958e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string]++; }, TypeError); 959e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string]--; }, TypeError); 960e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { ++o[seven_string]; }, TypeError); 961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { --o[seven_string]; }, TypeError); 962e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[seven_number], 17); 964e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[seven_symbol], 17); 965e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[seven_string], 17); 966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 967e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestAssignmentToReadOnlyLoop() { 970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 971e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 972e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var o = {}; 973e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Object.defineProperty(o, 7, { value: 17 }); 974e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 975e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_smi = 7; 976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_number = new Number(7); 977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_symbol = "7"; 978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var seven_string = "-7-".substring(1,2); 979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch for (var i = 0; i < 10; i ++) { 981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_smi] = "value" }, TypeError); 982e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_number] = "value" }, TypeError); 983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_symbol] = "value" }, TypeError); 984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { o[seven_string] = "value" }, TypeError); 985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 986e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 987e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertEquals(o[7], 17); 988e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 989e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 990e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 991e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch(function TestAssignmentToStringLength() { 992e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch "use strict"; 993e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 994e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var str_val = "string"; 995e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var str_obj = new String(str_val); 996e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var str_cat = str_val + str_val + str_obj; 997e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 998e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { str_val.length = 1; }, TypeError); 999e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { str_obj.length = 1; }, TypeError); 1000e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch assertThrows(function() { str_cat.length = 1; }, TypeError); 1001e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch})(); 100244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 100344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 100444f0eee88ff00398ff7f715fab053374d808c90dSteve Block(function TestArgumentsAliasing() { 100544f0eee88ff00398ff7f715fab053374d808c90dSteve Block function strict(a, b) { 100644f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 100744f0eee88ff00398ff7f715fab053374d808c90dSteve Block a = "c"; 100844f0eee88ff00398ff7f715fab053374d808c90dSteve Block b = "d"; 100944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return [a, b, arguments[0], arguments[1]]; 101044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 101144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 101244f0eee88ff00398ff7f715fab053374d808c90dSteve Block function nonstrict(a, b) { 101344f0eee88ff00398ff7f715fab053374d808c90dSteve Block a = "c"; 101444f0eee88ff00398ff7f715fab053374d808c90dSteve Block b = "d"; 101544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return [a, b, arguments[0], arguments[1]]; 101644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 101744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 101844f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(["c", "d", "a", "b"], strict("a", "b")); 101944f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(["c", "d", "c", "d"], nonstrict("a", "b")); 102044f0eee88ff00398ff7f715fab053374d808c90dSteve Block})(); 102144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 102244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 102344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockfunction CheckPillDescriptor(func, name) { 102444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 102544f0eee88ff00398ff7f715fab053374d808c90dSteve Block function CheckPill(pill) { 102644f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals("function", typeof pill); 102744f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertInstanceof(pill, Function); 102844f0eee88ff00398ff7f715fab053374d808c90dSteve Block pill.property = "value"; 102944f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(pill.value, undefined); 103044f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { 'use strict'; pill.property = "value"; }, 103144f0eee88ff00398ff7f715fab053374d808c90dSteve Block TypeError); 103244f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(pill, TypeError); 103344f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(pill.prototype, (function(){}).prototype); 103444f0eee88ff00398ff7f715fab053374d808c90dSteve Block var d = Object.getOwnPropertyDescriptor(pill, "prototype"); 103544f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertFalse(d.writable); 103644f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertFalse(d.configurable); 103744f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertFalse(d.enumerable); 103844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 103944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 104044f0eee88ff00398ff7f715fab053374d808c90dSteve Block var descriptor = Object.getOwnPropertyDescriptor(func, name); 104144f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPill(descriptor.get) 104244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPill(descriptor.set); 104344f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertFalse(descriptor.enumerable); 104444f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertFalse(descriptor.configurable); 104544f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 104644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 104744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 104844f0eee88ff00398ff7f715fab053374d808c90dSteve Block(function TestStrictFunctionPills() { 104944f0eee88ff00398ff7f715fab053374d808c90dSteve Block function strict() { 105044f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 105144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 105244f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { strict.caller; }, TypeError); 105344f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { strict.arguments; }, TypeError); 10543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function() { strict.caller = 42; }, TypeError); 10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function() { strict.arguments = 42; }, TypeError); 105644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 105744f0eee88ff00398ff7f715fab053374d808c90dSteve Block var another = new Function("'use strict'"); 105844f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { another.caller; }, TypeError); 105944f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { another.arguments; }, TypeError); 10603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function() { another.caller = 42; }, TypeError); 10613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function() { another.arguments = 42; }, TypeError); 106244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 106344f0eee88ff00398ff7f715fab053374d808c90dSteve Block var third = (function() { "use strict"; return function() {}; })(); 106444f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { third.caller; }, TypeError); 106544f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { third.arguments; }, TypeError); 10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function() { third.caller = 42; }, TypeError); 10673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows(function() { third.arguments = 42; }, TypeError); 106844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 106944f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(strict, "caller"); 107044f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(strict, "arguments"); 107144f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(another, "caller"); 107244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(another, "arguments"); 107344f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(third, "caller"); 107444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(third, "arguments"); 107544f0eee88ff00398ff7f715fab053374d808c90dSteve Block})(); 107644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 107744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 107844f0eee88ff00398ff7f715fab053374d808c90dSteve Block(function TestStrictFunctionWritablePrototype() { 107944f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 108044f0eee88ff00398ff7f715fab053374d808c90dSteve Block function TheClass() { 108144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 108244f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { TheClass.caller; }, TypeError); 108344f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(function() { TheClass.arguments; }, TypeError); 108444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 108544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Strict functions must have writable prototype. 108644f0eee88ff00398ff7f715fab053374d808c90dSteve Block TheClass.prototype = { 108744f0eee88ff00398ff7f715fab053374d808c90dSteve Block func: function() { return "func_value"; }, 108844f0eee88ff00398ff7f715fab053374d808c90dSteve Block get accessor() { return "accessor_value"; }, 108944f0eee88ff00398ff7f715fab053374d808c90dSteve Block property: "property_value", 109044f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 109144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 109244f0eee88ff00398ff7f715fab053374d808c90dSteve Block var o = new TheClass(); 109344f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(o.func(), "func_value"); 109444f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(o.accessor, "accessor_value"); 109544f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(o.property, "property_value"); 109644f0eee88ff00398ff7f715fab053374d808c90dSteve Block})(); 109744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 109844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 109944f0eee88ff00398ff7f715fab053374d808c90dSteve Block(function TestStrictArgumentPills() { 110044f0eee88ff00398ff7f715fab053374d808c90dSteve Block function strict() { 110144f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 110244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return arguments; 110344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 110444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 110544f0eee88ff00398ff7f715fab053374d808c90dSteve Block var args = strict(); 110644f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "caller"); 110744f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "callee"); 110844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 110944f0eee88ff00398ff7f715fab053374d808c90dSteve Block args = strict(17, "value", strict); 111044f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(17, args[0]) 111144f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals("value", args[1]) 111244f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(strict, args[2]); 111344f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "caller"); 111444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "callee"); 111544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 111644f0eee88ff00398ff7f715fab053374d808c90dSteve Block function outer() { 111744f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 111844f0eee88ff00398ff7f715fab053374d808c90dSteve Block function inner() { 111944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return arguments; 112044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 112144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return inner; 112244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 112344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block var args = outer()(); 112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "caller"); 112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "callee"); 112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 112844f0eee88ff00398ff7f715fab053374d808c90dSteve Block args = outer()(17, "value", strict); 112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(17, args[0]) 113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals("value", args[1]) 113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(strict, args[2]); 113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "caller"); 113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block CheckPillDescriptor(args, "callee"); 113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block})(); 113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block(function TestNonStrictFunctionCallerPillSimple() { 113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block function return_my_caller() { 113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return return_my_caller.caller; 114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block function strict() { 114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return_my_caller(); 114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertThrows(strict, TypeError); 114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block function non_strict() { 114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return return_my_caller(); 115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertSame(non_strict(), non_strict); 115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block})(); 115344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block(function TestNonStrictFunctionCallerPill() { 115644f0eee88ff00398ff7f715fab053374d808c90dSteve Block function strict(n) { 115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block "use strict"; 115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block non_strict(n); 115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 116044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 116144f0eee88ff00398ff7f715fab053374d808c90dSteve Block function recurse(n, then) { 116244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (n > 0) { 116344f0eee88ff00398ff7f715fab053374d808c90dSteve Block recurse(n - 1); 116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return then(); 116644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 116744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 116844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 116944f0eee88ff00398ff7f715fab053374d808c90dSteve Block function non_strict(n) { 117044f0eee88ff00398ff7f715fab053374d808c90dSteve Block recurse(n, function() { non_strict.caller; }); 117144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 117244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 117344f0eee88ff00398ff7f715fab053374d808c90dSteve Block function test(n) { 117444f0eee88ff00398ff7f715fab053374d808c90dSteve Block try { 117544f0eee88ff00398ff7f715fab053374d808c90dSteve Block recurse(n, function() { strict(n); }); 117644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } catch(e) { 117744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return e instanceof TypeError; 117844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 117944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 118044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 118144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118244f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (var i = 0; i < 10; i ++) { 118344f0eee88ff00398ff7f715fab053374d808c90dSteve Block assertEquals(test(i), true); 118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block})(); 1186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch(function TestStrictModeEval() { 1189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "use strict"; 1190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch eval("var eval_local = 10;"); 1191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertThrows(function() { return eval_local; }, ReferenceError); 1192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch})(); 1193