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