10a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
20a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Redistribution and use in source and binary forms, with or without
30a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// modification, are permitted provided that the following conditions are
40a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// met:
50a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//
60a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//     * Redistributions of source code must retain the above copyright
70a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//       notice, this list of conditions and the following disclaimer.
80a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//     * Redistributions in binary form must reproduce the above
90a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//       copyright notice, this list of conditions and the following
100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//       disclaimer in the documentation and/or other materials provided
110a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//       with the distribution.
120a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//     * Neither the name of Google Inc. nor the names of its
130a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//       contributors may be used to endorse or promote products derived
140a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//       from this software without specific prior written permission.
150a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org//
160a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
170a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
180a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
190a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
200a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
210a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
220a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
230a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
240a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
250a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
260a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
270a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
280a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgfunction CheckStrictMode(code, exception) {
290a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  assertDoesNotThrow(code);
300a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  assertThrows("'use strict';\n" + code, exception);
310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  assertThrows('"use strict";\n' + code, exception);
320a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  assertDoesNotThrow("\
330a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    function outer() {\
340a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org      function inner() {\n"
350a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org        + code +
360a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org      "\n}\
370a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    }");
380a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  assertThrows("\
390a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    function outer() {\
400a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org      'use strict';\
410a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org      function inner() {\n"
420a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org        + code +
430a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org      "\n}\
440a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    }", exception);
450a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
460a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
47378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgfunction CheckFunctionConstructorStrictMode() {
48378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  var args = [];
49378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  for (var i = 0; i < arguments.length; i ++) {
50378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    args[i] = arguments[i];
51378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  }
52378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  // Create non-strict function. No exception.
53378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  args[arguments.length] = "";
54378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  assertDoesNotThrow(function() {
55378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    Function.apply(this, args);
56378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  });
57378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  // Create strict mode function. Exception expected.
58378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  args[arguments.length] = "'use strict';";
59378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  assertThrows(function() {
60378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    Function.apply(this, args);
61378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  }, SyntaxError);
62378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org}
63378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
640a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Incorrect 'use strict' directive.
6531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org(function UseStrictEscape() {
660a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  "use\\x20strict";
670a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  with ({}) {};
6831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org})();
690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
7004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org// Incorrectly place 'use strict' directive.
7104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgassertThrows("function foo (x) 'use strict'; {}", SyntaxError);
7204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// 'use strict' in non-directive position.
7431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org(function UseStrictNonDirective() {
750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  void(0);
760a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  "use strict";
770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  with ({}) {};
7831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org})();
790a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
800a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Multiple directives, including "use strict".
810a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgassertThrows('\
820a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org"directive 1";\
830a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org"another directive";\
840a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org"use strict";\
850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org"directive after strict";\
860a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org"and one more";\
870a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgwith({}) {}', SyntaxError);
880a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
890a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// 'with' disallowed in strict mode.
900a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgCheckStrictMode("with({}) {}", SyntaxError);
910a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
920a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Function named 'eval'.
9331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function eval() {}", SyntaxError);
940a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
950a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Function named 'arguments'.
9631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function arguments() {}", SyntaxError);
970a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
980a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Function parameter named 'eval'.
9931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function foo(a, b, eval, c, d) {}", SyntaxError);
1000a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1010a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Function parameter named 'arguments'.
10231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function foo(a, b, arguments, c, d) {}", SyntaxError);
1030a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1040a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Property accessor parameter named 'eval'.
10531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("var o = { set foo(eval) {} }", SyntaxError);
1060a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1070a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Property accessor parameter named 'arguments'.
10831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("var o = { set foo(arguments) {} }", SyntaxError);
1090a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Duplicate function parameter name.
11131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function foo(a, b, c, d, b) {}", SyntaxError);
112378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
113378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Function constructor: eval parameter name.
11431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckFunctionConstructorStrictMode("eval");
115378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
116378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Function constructor: arguments parameter name.
11731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckFunctionConstructorStrictMode("arguments");
118378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
119378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Function constructor: duplicate parameter name.
12031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckFunctionConstructorStrictMode("a", "b", "c", "b");
12131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckFunctionConstructorStrictMode("a,b,c,b");
1220a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1230a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// catch(eval)
12431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("try{}catch(eval){};", SyntaxError);
1250a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1260a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// catch(arguments)
12731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("try{}catch(arguments){};", SyntaxError);
1280a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1290a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// var eval
13031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("var eval;", SyntaxError);
1310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1320a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// var arguments
13331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("var arguments;", SyntaxError);
1340a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1350a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Strict mode applies to the function in which the directive is used..
136378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgassertThrows('\
137378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgfunction foo(eval) {\
138378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  "use strict";\
139378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org}', SyntaxError);
1400a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1410a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// Strict mode doesn't affect the outer stop of strict code.
14231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org(function NotStrict(eval) {
1430a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  function Strict() {
1440a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    "use strict";
1450a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
1460a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  with ({}) {};
14731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org})();
1480ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
1490ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// Octal literal
1500ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgCheckStrictMode("var x = 012");
1510ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgCheckStrictMode("012");
1520ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgCheckStrictMode("'Hello octal\\032'");
1530ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgCheckStrictMode("function octal() { return 012; }");
1540ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgCheckStrictMode("function octal() { return '\\032'; }");
1550ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
15631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org(function ValidEscape() {
15731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  "use strict";
15831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var x = '\0';
15931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var y = "\0";
16031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org})();
16131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
1620ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// Octal before "use strict"
1630ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgassertThrows('\
1640ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  function strict() {\
1650ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org    "octal\\032directive";\
1660ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org    "use strict";\
1670ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  }', SyntaxError);
168378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
169a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Duplicate data properties.
170a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCheckStrictMode("var x = { dupe : 1, nondupe: 3, dupe : 2 };", SyntaxError);
171a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCheckStrictMode("var x = { '1234' : 1, '2345' : 2, '1234' : 3 };", SyntaxError);
172a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCheckStrictMode("var x = { '1234' : 1, '2345' : 2, 1234 : 3 };", SyntaxError);
173a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCheckStrictMode("var x = { 3.14 : 1, 2.71 : 2, 3.14 : 3 };", SyntaxError);
174a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCheckStrictMode("var x = { 3.14 : 1, '3.14' : 2 };", SyntaxError);
175a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCheckStrictMode("var x = { \
176a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  123: 1, \
177a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  123.00000000000000000000000000000000000000000000000000000000000000000001: 2 \
178a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}", SyntaxError);
179a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
180378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Non-conflicting data properties.
18131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org(function StrictModeNonDuplicate() {
182378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  "use strict";
183378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  var x = { 123 : 1, "0123" : 2 };
18449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  var x = {
18549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    123: 1,
18649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    '123.00000000000000000000000000000000000000000000000000000000000000000001':
18749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org      2
18849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  };
18931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org})();
190378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
191a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Two getters (non-strict)
192a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { get foo() { }, get foo() { } };", SyntaxError);
193a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { get foo(){}, get 'foo'(){}};", SyntaxError);
194a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { get 12(){}, get '12'(){}};", SyntaxError);
195a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
196a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Two setters (non-strict)
197a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set foo(v) { }, set foo(v) { } };", SyntaxError);
198a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set foo(v) { }, set 'foo'(v) { } };", SyntaxError);
199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set 13(v) { }, set '13'(v) { } };", SyntaxError);
200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
201a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Setter and data (non-strict)
202a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { foo: 'data', set foo(v) { } };", SyntaxError);
203a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set foo(v) { }, foo: 'data' };", SyntaxError);
204a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { foo: 'data', set 'foo'(v) { } };", SyntaxError);
205a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set foo(v) { }, 'foo': 'data' };", SyntaxError);
206a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { 'foo': 'data', set foo(v) { } };", SyntaxError);
207a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set 'foo'(v) { }, foo: 'data' };", SyntaxError);
208a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { 'foo': 'data', set 'foo'(v) { } };", SyntaxError);
209a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { set 'foo'(v) { }, 'foo': 'data' };", SyntaxError);
210a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { 12: 1, set '12'(v){}};", SyntaxError);
211a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { 12: 1, set 12(v){}};", SyntaxError);
212a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { '12': 1, set '12'(v){}};", SyntaxError);
213a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { '12': 1, set 12(v){}};", SyntaxError);
214a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
215a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Getter and data (non-strict)
216a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { foo: 'data', get foo() { } };", SyntaxError);
217a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { get foo() { }, foo: 'data' };", SyntaxError);
218a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { 'foo': 'data', get foo() { } };", SyntaxError);
219a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { get 'foo'() { }, 'foo': 'data' };", SyntaxError);
220a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { '12': 1, get '12'(){}};", SyntaxError);
221a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgassertThrows("var x = { '12': 1, get 12(){}};", SyntaxError);
222378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
223378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Assignment to eval or arguments
22431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { eval = undefined; }", SyntaxError);
22531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { arguments = undefined; }", SyntaxError);
22631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(eval = undefined); }", SyntaxError);
22749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { print(arguments = undefined); }",
22849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
22931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = eval = undefined; }", SyntaxError);
23049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { var x = arguments = undefined; }",
23149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
232378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
233378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Compound assignment to eval or arguments
23431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { eval *= undefined; }", SyntaxError);
23531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { arguments /= undefined; }", SyntaxError);
23631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(eval %= undefined); }", SyntaxError);
23749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { print(arguments %= undefined); }",
23849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
23949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { var x = eval += undefined; }",
24049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
24149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { var x = arguments -= undefined; }",
24249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
24331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { eval <<= undefined; }", SyntaxError);
24431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { arguments >>= undefined; }", SyntaxError);
24549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { print(eval >>>= undefined); }",
24649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
24749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { print(arguments &= undefined); }",
24849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
24949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { var x = eval ^= undefined; }",
25049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
25149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { var x = arguments |= undefined; }",
25249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
253378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
254378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Postfix increment with eval or arguments
25531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { eval++; }", SyntaxError);
25631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { arguments++; }", SyntaxError);
25731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(eval++); }", SyntaxError);
25831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(arguments++); }", SyntaxError);
25931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = eval++; }", SyntaxError);
26031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = arguments++; }", SyntaxError);
261378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
262378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Postfix decrement with eval or arguments
26331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { eval--; }", SyntaxError);
26431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { arguments--; }", SyntaxError);
26531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(eval--); }", SyntaxError);
26631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(arguments--); }", SyntaxError);
26731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = eval--; }", SyntaxError);
26831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = arguments--; }", SyntaxError);
269378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
270378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Prefix increment with eval or arguments
27131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { ++eval; }", SyntaxError);
27231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { ++arguments; }", SyntaxError);
27331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(++eval); }", SyntaxError);
27431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(++arguments); }", SyntaxError);
27531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = ++eval; }", SyntaxError);
27631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = ++arguments; }", SyntaxError);
277378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
278378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Prefix decrement with eval or arguments
27931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { --eval; }", SyntaxError);
28031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { --arguments; }", SyntaxError);
28131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(--eval); }", SyntaxError);
28231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { print(--arguments); }", SyntaxError);
28331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = --eval; }", SyntaxError);
28431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgCheckStrictMode("function strict() { var x = --arguments; }", SyntaxError);
285378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
2869ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// Use of const in strict mode is disallowed in anticipation of ES Harmony.
2879ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("const x = 0;", SyntaxError);
2889ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("for (const x = 0; false;) {}", SyntaxError);
2899ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("function strict() { const x = 0; }", SyntaxError);
2909ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
2919ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// Strict mode only allows functions in SourceElements
2929ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("if (true) { function invalid() {} }", SyntaxError);
2939ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("for (;false;) { function invalid() {} }", SyntaxError);
2949ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("{ function invalid() {} }", SyntaxError);
2959ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("try { function invalid() {} } catch(e) {}", SyntaxError);
2969ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("try { } catch(e) { function invalid() {} }", SyntaxError);
2979ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.orgCheckStrictMode("function outer() {{ function invalid() {} }}", SyntaxError);
2989ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
29949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org// Delete of an unqualified identifier
30049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("delete unqualified;", SyntaxError);
30149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { delete unqualified; }", SyntaxError);
30249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function function_name() { delete function_name; }",
30349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
30449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict(parameter) { delete parameter; }",
30549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
30649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("function strict() { var variable; delete variable; }",
30749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org                SyntaxError);
30849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgCheckStrictMode("var variable; delete variable;", SyntaxError);
30949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
3103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org(function TestStrictDelete() {
3113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  "use strict";
3123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // "delete this" is allowed in strict mode and should work.
3133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  function strict_delete() { delete this; }
3143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  strict_delete();
3153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org})();
3163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
317378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// Prefix unary operators other than delete, ++, -- are valid in strict mode
31831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org(function StrictModeUnaryOperators() {
319378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  "use strict";
320378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval];
321378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  var y = [void arguments, typeof arguments,
322378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org           +arguments, -arguments, ~arguments, !arguments];
32331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org})();
32483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
32504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org// 7.6.1.2 Future Reserved Words in strict mode
32604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgvar future_strict_reserved_words = [
32783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "implements",
32883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "interface",
32983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "let",
33083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "package",
33183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "private",
33283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "protected",
33383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "public",
33483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "static",
33583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  "yield" ];
33683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
33704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgfunction testFutureStrictReservedWord(word) {
33883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  // Simple use of each reserved word
33983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("var " + word + " = 1;", SyntaxError);
34004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  CheckStrictMode("typeof (" + word + ");", SyntaxError);
34183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
34283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  // object literal properties
34383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { " + word + " : 42 };");
34483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { get " + word + " () {} };");
34583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { set " + word + " (value) {} };");
34604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  eval("var x = { get " + word + " () { 'use strict'; } };");
34704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  eval("var x = { set " + word + " (value) { 'use strict'; } };");
34883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
34983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  // object literal with string literal property names
35083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { '" + word + "' : 42 };");
35183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { get '" + word + "' () { } };");
35283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { set '" + word + "' (value) { } };");
35383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { get '" + word + "' () { 'use strict'; } };");
35483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  eval("var x = { set '" + word + "' (value) { 'use strict'; } };");
35583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
35683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  // Function names and arguments, strict and non-strict contexts
35783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("function " + word + " () {}", SyntaxError);
35883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("function foo (" + word + ") {}", SyntaxError);
35983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("function foo (" + word + ", " + word + ") {}", SyntaxError);
36083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("function foo (a, " + word + ") {}", SyntaxError);
36183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("function foo (" + word + ", a) {}", SyntaxError);
36283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("function foo (a, " + word + ", b) {}", SyntaxError);
36383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  CheckStrictMode("var foo = function (" + word + ") {}", SyntaxError);
36483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
36583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  // Function names and arguments when the body is strict
36683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertThrows("function " + word + " () { 'use strict'; }", SyntaxError);
36749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows("function foo (" + word + ", " + word + ") { 'use strict'; }",
36849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org               SyntaxError);
36983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertThrows("function foo (a, " + word + ") { 'use strict'; }", SyntaxError);
37083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertThrows("function foo (" + word + ", a) { 'use strict'; }", SyntaxError);
37149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows("function foo (a, " + word + ", b) { 'use strict'; }",
37249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org               SyntaxError);
37349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows("var foo = function (" + word + ") { 'use strict'; }",
37449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org               SyntaxError);
37583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
37604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  // setter parameter when the body is strict
37704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  CheckStrictMode("var x = { set foo(" + word + ") {} };", SyntaxError);
37849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows("var x = { set foo(" + word + ") { 'use strict'; } };",
37949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org               SyntaxError);
38083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
38183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
38204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgfor (var i = 0; i < future_strict_reserved_words.length; i++) {
38304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  testFutureStrictReservedWord(future_strict_reserved_words[i]);
38483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
38583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
38644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction testAssignToUndefined(test, should_throw) {
387496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  try {
38844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    test();
389496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  } catch (e) {
390496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    assertTrue(should_throw, "strict mode");
391496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    assertInstanceof(e, ReferenceError, "strict mode");
392496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    return;
393496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  }
394496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  assertFalse(should_throw, "strict mode");
395496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org}
396496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
39744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction repeat(n, f) {
39844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  for (var i = 0; i < n; i ++) { f(); }
39944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org}
40044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
40144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction assignToUndefined() {
40244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  "use strict";
40344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  possibly_undefined_variable_for_strict_mode_test = "should throw?";
40444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org}
40544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
40644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, true);
40744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, true);
40844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, true);
409496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
410496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgpossibly_undefined_variable_for_strict_mode_test = "value";
411496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
41244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, false);
41344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, false);
41444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, false);
415496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
416496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgdelete possibly_undefined_variable_for_strict_mode_test;
417496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
41844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, true);
41944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, true);
42044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefined, true);
421496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
42244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() { testAssignToUndefined(assignToUndefined, true); });
423496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgpossibly_undefined_variable_for_strict_mode_test = "value";
42444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() { testAssignToUndefined(assignToUndefined, false); });
425496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgdelete possibly_undefined_variable_for_strict_mode_test;
42644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() { testAssignToUndefined(assignToUndefined, true); });
427496c03a64f12710e837204e261ef155601247895sgjesse@chromium.orgpossibly_undefined_variable_for_strict_mode_test = undefined;
42844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() { testAssignToUndefined(assignToUndefined, false); });
42944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
43044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgfunction assignToUndefinedWithEval() {
43144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  "use strict";
43244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  possibly_undefined_variable_for_strict_mode_test_with_eval = "should throw?";
43344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  eval("");
43444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org}
43544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
43644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, true);
43744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, true);
43844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, true);
43944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
44044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgpossibly_undefined_variable_for_strict_mode_test_with_eval = "value";
44144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
44244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, false);
44344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, false);
44444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, false);
44544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
44644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgdelete possibly_undefined_variable_for_strict_mode_test_with_eval;
44744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
44844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, true);
44944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, true);
45044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgtestAssignToUndefined(assignToUndefinedWithEval, true);
45144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
45244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() {
45344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org             testAssignToUndefined(assignToUndefinedWithEval, true);
45444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org           });
45544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgpossibly_undefined_variable_for_strict_mode_test_with_eval = "value";
45644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() {
45744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org             testAssignToUndefined(assignToUndefinedWithEval, false);
45844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org           });
45944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgdelete possibly_undefined_variable_for_strict_mode_test_with_eval;
46044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() {
46144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org             testAssignToUndefined(assignToUndefinedWithEval, true);
46244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org           });
46344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgpossibly_undefined_variable_for_strict_mode_test_with_eval = undefined;
46444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgrepeat(10, function() {
46544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org             testAssignToUndefined(assignToUndefinedWithEval, false);
46644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org           });
46744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
46844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
46949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
47049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org(function testDeleteNonConfigurable() {
47149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  function delete_property(o) {
47249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    "use strict";
47349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    delete o.property;
47449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  }
47549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  function delete_element(o, i) {
47649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    "use strict";
47749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    delete o[i];
47849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  }
47949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
48049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  var object = {};
48149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
48249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  Object.defineProperty(object, "property", { value: "property_value" });
48349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  Object.defineProperty(object, "1", { value: "one" });
48449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  Object.defineProperty(object, 7, { value: "seven" });
48549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  Object.defineProperty(object, 3.14, { value: "pi" });
48649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
48749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_property(object); }, TypeError);
48849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(object.property, "property_value");
48949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_element(object, "1"); }, TypeError);
49049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_element(object, 1); }, TypeError);
49149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(object[1], "one");
49249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_element(object, "7"); }, TypeError);
49349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_element(object, 7); }, TypeError);
49449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(object[7], "seven");
49549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_element(object, "3.14"); }, TypeError);
49649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertThrows(function() { delete_element(object, 3.14); }, TypeError);
49749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(object[3.14], "pi");
49849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org})();
49949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
50049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org// Not transforming this in Function.call and Function.apply.
5013a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org(function testThisTransformCallApply() {
50249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  function non_strict() {
50349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    return this;
50449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  }
50549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  function strict() {
50649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    "use strict";
50749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    return this;
50849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  }
50949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
51049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  var global_object = (function() { return this; })();
51149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  var object = {};
51249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
51349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  // Non-strict call.
51449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(non_strict.call(null) === global_object);
51549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(non_strict.call(undefined) === global_object);
51649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof non_strict.call(7), "object");
51749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof non_strict.call("Hello"), "object");
51849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(non_strict.call(object) === object);
51949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
52049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  // Non-strict apply.
52149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(non_strict.apply(null) === global_object);
52249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(non_strict.apply(undefined) === global_object);
52349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof non_strict.apply(7), "object");
52449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof non_strict.apply("Hello"), "object");
52549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(non_strict.apply(object) === object);
52649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
52749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  // Strict call.
52849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(strict.call(null) === null);
52949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(strict.call(undefined) === undefined);
53049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof strict.call(7), "number");
53149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof strict.call("Hello"), "string");
53249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(strict.call(object) === object);
53349edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
53449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  // Strict apply.
53549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(strict.apply(null) === null);
53649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(strict.apply(undefined) === undefined);
53749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof strict.apply(7), "number");
53849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertEquals(typeof strict.apply("Hello"), "string");
53949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  assertTrue(strict.apply(object) === object);
54049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org})();
5413a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
5423a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org(function testThisTransform() {
5433a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  try {
5443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function strict() {
5453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      "use strict";
5463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return typeof(this);
5473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
5483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function nonstrict() {
5493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return typeof(this);
5503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
5513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
5523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    // Concat to avoid symbol.
5533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var strict_name = "str" + "ict";
5543a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var nonstrict_name = "non" + "str" + "ict";
5553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var strict_number = 17;
5563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var nonstrict_number = 19;
5573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var strict_name_get = "str" + "ict" + "get";
5583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var nonstrict_name_get = "non" + "str" + "ict" + "get"
5593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var strict_number_get = 23;
5603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    var nonstrict_number_get = 29;
5613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
5623a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function install(t) {
5633a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      t.prototype.strict = strict;
5643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      t.prototype.nonstrict = nonstrict;
5653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      t.prototype[strict_number] = strict;
5663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      t.prototype[nonstrict_number] = nonstrict;
5673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      Object.defineProperty(t.prototype, strict_name_get,
5683a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                            { get: function() { return strict; },
5693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                              configurable: true });
5703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      Object.defineProperty(t.prototype, nonstrict_name_get,
5713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                            { get: function() { return nonstrict; },
5723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                              configurable: true });
5733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      Object.defineProperty(t.prototype, strict_number_get,
5743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                            { get: function() { return strict; },
5753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                              configurable: true });
5763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      Object.defineProperty(t.prototype, nonstrict_number_get,
5773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                            { get: function() { return nonstrict; },
5783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                              configurable: true });
5793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
5803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
5813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function cleanup(t) {
5823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype.strict;
5833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype.nonstrict;
5843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype[strict_number];
5853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype[nonstrict_number];
5863a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype[strict_name_get];
5873a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype[nonstrict_name_get];
5883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype[strict_number_get];
5893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      delete t.prototype[nonstrict_number_get];
5903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
5913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
5923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    // Set up fakes
5933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    install(String);
5943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    install(Number);
5953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    install(Boolean)
5963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
5973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callStrict(o) {
5983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o.strict();
5993a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6003a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callNonStrict(o) {
6013a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o.nonstrict();
6023a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6033a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callKeyedStrict(o) {
6043a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[strict_name]();
6053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6063a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callKeyedNonStrict(o) {
6073a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[nonstrict_name]();
6083a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6093a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callIndexedStrict(o) {
6103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[strict_number]();
6113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callIndexedNonStrict(o) {
6133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[nonstrict_number]();
6143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callStrictGet(o) {
6163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o.strictget();
6173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callNonStrictGet(o) {
6193a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o.nonstrictget();
6203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6213a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callKeyedStrictGet(o) {
6223a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[strict_name_get]();
6233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callKeyedNonStrictGet(o) {
6253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[nonstrict_name_get]();
6263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callIndexedStrictGet(o) {
6283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[strict_number_get]();
6293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    function callIndexedNonStrictGet(o) {
6313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      return o[nonstrict_number_get]();
6323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
6333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    for (var i = 0; i < 10; i ++) {
6353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello").strict(), "string");
6363a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello").nonstrict(), "object");
6373a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[strict_name](), "string");
6383a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[nonstrict_name](), "object");
6393a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[strict_number](), "string");
6403a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[nonstrict_number](), "object");
6413a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6423a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i).strict(), "number");
6433a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i).nonstrict(), "object");
6443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[strict_name](), "number");
6453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[nonstrict_name](), "object");
6463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[strict_number](), "number");
6473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[nonstrict_number](), "object");
6483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true).strict(), "boolean");
6503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true).nonstrict(), "object");
6513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[strict_name](), "boolean");
6523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[nonstrict_name](), "object");
6533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[strict_number](), "boolean");
6543a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[nonstrict_number](), "object");
6553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false).strict(), "boolean");
6573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false).nonstrict(), "object");
6583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[strict_name](), "boolean");
6593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[nonstrict_name](), "object");
6603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[strict_number](), "boolean");
6613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[nonstrict_number](), "object");
6623a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6633a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrict("howdy"), "string");
6643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrict("howdy"), "object");
6653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrict("howdy"), "string");
6663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrict("howdy"), "object");
6673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrict("howdy"), "string");
6683a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrict("howdy"), "object");
6693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrict(17 + i), "number");
6713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrict(17 + i), "object");
6723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrict(17 + i), "number");
6733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrict(17 + i), "object");
6743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrict(17 + i), "number");
6753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrict(17 + i), "object");
6763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrict(true), "boolean");
6783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrict(true), "object");
6793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrict(true), "boolean");
6803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrict(true), "object");
6813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrict(true), "boolean");
6823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrict(true), "object");
6833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrict(false), "boolean");
6853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrict(false), "object");
6863a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrict(false), "boolean");
6873a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrict(false), "object");
6883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrict(false), "boolean");
6893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrict(false), "object");
6903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      // All of the above, with getters
6923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello").strictget(), "string");
6933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello").nonstrictget(), "object");
6943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[strict_name_get](), "string");
6953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[nonstrict_name_get](), "object");
6963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[strict_number_get](), "string");
6973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(("hello")[nonstrict_number_get](), "object");
6983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
6993a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i).strictget(), "number");
7003a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i).nonstrictget(), "object");
7013a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[strict_name_get](), "number");
7023a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[nonstrict_name_get](), "object");
7033a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[strict_number_get](), "number");
7043a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((10 + i)[nonstrict_number_get](), "object");
7053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7063a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true).strictget(), "boolean");
7073a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true).nonstrictget(), "object");
7083a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[strict_name_get](), "boolean");
7093a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[nonstrict_name_get](), "object");
7103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[strict_number_get](), "boolean");
7113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((true)[nonstrict_number_get](), "object");
7123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false).strictget(), "boolean");
7143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false).nonstrictget(), "object");
7153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[strict_name_get](), "boolean");
7163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[nonstrict_name_get](), "object");
7173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[strict_number_get](), "boolean");
7183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals((false)[nonstrict_number_get](), "object");
7193a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrictGet("howdy"), "string");
7213a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrictGet("howdy"), "object");
7223a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrictGet("howdy"), "string");
7233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrictGet("howdy"), "object");
7243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrictGet("howdy"), "string");
7253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrictGet("howdy"), "object");
7263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrictGet(17 + i), "number");
7283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrictGet(17 + i), "object");
7293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrictGet(17 + i), "number");
7303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrictGet(17 + i), "object");
7313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrictGet(17 + i), "number");
7323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrictGet(17 + i), "object");
7333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrictGet(true), "boolean");
7353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrictGet(true), "object");
7363a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrictGet(true), "boolean");
7373a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrictGet(true), "object");
7383a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrictGet(true), "boolean");
7393a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrictGet(true), "object");
7403a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7413a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callStrictGet(false), "boolean");
7423a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callNonStrictGet(false), "object");
7433a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedStrictGet(false), "boolean");
7443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callKeyedNonStrictGet(false), "object");
7453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedStrictGet(false), "boolean");
7463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      assertEquals(callIndexedNonStrictGet(false), "object");
7473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
7483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
7493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  } finally {
7503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    // Cleanup
7513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    cleanup(String);
7523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    cleanup(Number);
7533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    cleanup(Boolean);
7543a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
7553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org})();
7569ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7579ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7589ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org(function ObjectEnvironment() {
7599ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var o = {};
7609ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  Object.defineProperty(o, "foo", { value: "FOO", writable: false });
7619ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(
7629ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    function () {
7639ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      with (o) {
7649ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        (function() {
7659ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org          "use strict";
7669ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org          foo = "Hello";
7679ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        })();
7689ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      }
7699ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    },
7709ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    TypeError);
7719ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org})();
7729ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7739ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7749ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org(function TestSetPropertyWithoutSetter() {
7759ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var o = { get foo() { return "Yey"; } };
7769ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(
7779ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    function broken() {
7789ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      "use strict";
7799ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      o.foo = (0xBADBAD00 >> 1);
7809ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    },
7819ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    TypeError);
7829ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org})();
7839ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7849ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7859ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org(function TestSetPropertyNonConfigurable() {
7869ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var frozen = Object.freeze({});
7879ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var sealed = Object.seal({});
7889ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7899ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  function strict(o) {
7909ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    "use strict";
7919ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    o.property = "value";
7929ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  }
7939ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7949ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { strict(frozen); }, TypeError);
7959ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { strict(sealed); }, TypeError);
7969ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org})();
7979ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7989ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
7999ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org(function TestAssignmentToReadOnlyProperty() {
8009ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  "use strict";
8019ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8029ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var o = {};
8039ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  Object.defineProperty(o, "property", { value: 7 });
8049ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8059ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property = "new value"; }, TypeError);
8069ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property += 10; }, TypeError);
8079ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property -= 10; }, TypeError);
8089ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property *= 10; }, TypeError);
8099ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property /= 10; }, TypeError);
8109ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property++; }, TypeError);
8119ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o.property--; }, TypeError);
8129ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { ++o.property; }, TypeError);
8139ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { --o.property; }, TypeError);
8149ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8159ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var name = "prop" + "erty"; // to avoid symbol path.
8169ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name] = "new value"; }, TypeError);
8179ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name] += 10; }, TypeError);
8189ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name] -= 10; }, TypeError);
8199ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name] *= 10; }, TypeError);
8209ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name] /= 10; }, TypeError);
8219ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name]++; }, TypeError);
8229ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { o[name]--; }, TypeError);
8239ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { ++o[name]; }, TypeError);
8249ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertThrows(function() { --o[name]; }, TypeError);
8259ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8269ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  assertEquals(o.property, 7);
8279ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org})();
8289ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8299ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8309ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org(function TestAssignmentToReadOnlyLoop() {
8319ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var name = "prop" + "erty"; // to avoid symbol path.
8329ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var o = {};
8339ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  Object.defineProperty(o, "property", { value: 7 });
8349ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8359ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  function strict(o, name) {
8369ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    "use strict";
8379ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    o[name] = "new value";
8389ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  }
8399ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8409ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  for (var i = 0; i < 10; i ++) {
841d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org    var exception = false;
8429ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    try {
8439ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      strict(o, name);
8449ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    } catch(e) {
845d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org      exception = true;
8469ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      assertInstanceof(e, TypeError);
8479ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    }
848d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org    assertTrue(exception);
8499ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  }
8509ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org})();
8519ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8529ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8539ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org// Specialized KeyedStoreIC experiencing miss.
8549ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org(function testKeyedStoreICStrict() {
8559ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  var o = [9,8,7,6,5,4,3,2,1];
8569ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8579ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  function test(o, i, v) {
8589ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    "use strict";
8599ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    o[i] = v;
8609ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  }
8619ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
8629ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  for (var i = 0; i < 10; i ++) {
8639ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    test(o, 5, 17);        // start specialized for smi indices
8649ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    assertEquals(o[5], 17);
8659ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    test(o, "a", 19);
8669ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    assertEquals(o["a"], 19);
8679ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    test(o, "5", 29);
8689ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    assertEquals(o[5], 29);
8699ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    test(o, 100000, 31);
8709ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    assertEquals(o[100000], 31);
8719ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  }
8729ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org})();
8738f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8748f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8758f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org(function TestSetElementWithoutSetter() {
8768f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  "use strict";
8778f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8788f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var o = { };
8798f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  Object.defineProperty(o, 0, { get : function() { } });
8808f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8818f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_smi = 0;
8828f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_number = new Number(0);
8838f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_symbol = "0";
8848f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_string = "-0-".substring(1,2);
8858f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8868f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[zero_smi] = "new value"; }, TypeError);
8878f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[zero_number] = "new value"; }, TypeError);
8888f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[zero_symbol] = "new value"; }, TypeError);
8898f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[zero_string] = "new value"; }, TypeError);
8908f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org})();
8918f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8928f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8938f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org(function TestSetElementNonConfigurable() {
8948f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  "use strict";
8958f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var frozen = Object.freeze({});
8968f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var sealed = Object.seal({});
8978f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
8988f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_number = 0;
8998f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_symbol = "0";
9008f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var zero_string = "-0-".substring(1,2);
9018f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9028f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { frozen[zero_number] = "value"; }, TypeError);
9038f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { sealed[zero_number] = "value"; }, TypeError);
9048f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { frozen[zero_symbol] = "value"; }, TypeError);
9058f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { sealed[zero_symbol] = "value"; }, TypeError);
9068f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { frozen[zero_string] = "value"; }, TypeError);
9078f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { sealed[zero_string] = "value"; }, TypeError);
9088f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org})();
9098f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9108f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9118f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org(function TestAssignmentToReadOnlyElement() {
9128f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  "use strict";
9138f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9148f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var o = {};
9158f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  Object.defineProperty(o, 7, { value: 17 });
9168f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9178f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_smi = 7;
9188f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_number = new Number(7);
9198f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_symbol = "7";
9208f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_string = "-7-".substring(1,2);
9218f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9228f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  // Index with number.
9238f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi] = "value"; }, TypeError);
9248f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi] += 10; }, TypeError);
9258f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi] -= 10; }, TypeError);
9268f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi] *= 10; }, TypeError);
9278f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi] /= 10; }, TypeError);
9288f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi]++; }, TypeError);
9298f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_smi]--; }, TypeError);
9308f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { ++o[seven_smi]; }, TypeError);
9318f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { --o[seven_smi]; }, TypeError);
9328f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9338f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number] = "value"; }, TypeError);
9348f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number] += 10; }, TypeError);
9358f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number] -= 10; }, TypeError);
9368f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number] *= 10; }, TypeError);
9378f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number] /= 10; }, TypeError);
9388f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number]++; }, TypeError);
9398f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_number]--; }, TypeError);
9408f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { ++o[seven_number]; }, TypeError);
9418f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { --o[seven_number]; }, TypeError);
9428f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9438f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol] = "value"; }, TypeError);
9448f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol] += 10; }, TypeError);
9458f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol] -= 10; }, TypeError);
9468f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol] *= 10; }, TypeError);
9478f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol] /= 10; }, TypeError);
9488f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol]++; }, TypeError);
9498f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_symbol]--; }, TypeError);
9508f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { ++o[seven_symbol]; }, TypeError);
9518f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { --o[seven_symbol]; }, TypeError);
9528f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9538f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string] = "value"; }, TypeError);
9548f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string] += 10; }, TypeError);
9558f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string] -= 10; }, TypeError);
9568f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string] *= 10; }, TypeError);
9578f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string] /= 10; }, TypeError);
9588f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string]++; }, TypeError);
9598f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { o[seven_string]--; }, TypeError);
9608f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { ++o[seven_string]; }, TypeError);
9618f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { --o[seven_string]; }, TypeError);
9628f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9638f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertEquals(o[seven_number], 17);
9648f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertEquals(o[seven_symbol], 17);
9658f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertEquals(o[seven_string], 17);
9668f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org})();
9678f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9688f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9698f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org(function TestAssignmentToReadOnlyLoop() {
9708f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  "use strict";
9718f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9728f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var o = {};
9738f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  Object.defineProperty(o, 7, { value: 17 });
9748f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9758f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_smi = 7;
9768f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_number = new Number(7);
9778f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_symbol = "7";
9788f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var seven_string = "-7-".substring(1,2);
9798f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9808f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  for (var i = 0; i < 10; i ++) {
9818f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    assertThrows(function() { o[seven_smi] = "value" }, TypeError);
9828f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    assertThrows(function() { o[seven_number] = "value" }, TypeError);
9838f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    assertThrows(function() { o[seven_symbol] = "value" }, TypeError);
9848f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    assertThrows(function() { o[seven_string] = "value" }, TypeError);
9858f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  }
9868f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9878f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertEquals(o[7], 17);
9888f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org})();
9898f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9908f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9918f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org(function TestAssignmentToStringLength() {
9928f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  "use strict";
9938f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9948f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var str_val = "string";
9958f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var str_obj = new String(str_val);
9968f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  var str_cat = str_val + str_val + str_obj;
9978f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
9988f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { str_val.length = 1; }, TypeError);
9998f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { str_obj.length = 1; }, TypeError);
10008f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  assertThrows(function() { str_cat.length = 1; }, TypeError);
10018f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org})();
10024d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
10034d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
10044d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org(function TestArgumentsAliasing() {
10054d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  function strict(a, b) {
10064d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    "use strict";
10074d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    a = "c";
10084d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    b = "d";
10094d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    return [a, b, arguments[0], arguments[1]];
10104d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  }
10114d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
10124d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  function nonstrict(a, b) {
10134d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    a = "c";
10144d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    b = "d";
10154d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    return [a, b, arguments[0], arguments[1]];
10164d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  }
10174d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
10184d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  assertEquals(["c", "d", "a", "b"], strict("a", "b"));
10194d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  assertEquals(["c", "d", "c", "d"], nonstrict("a", "b"));
10204d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org})();
1021ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1022ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1023ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgfunction CheckPillDescriptor(func, name) {
1024ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1025ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function CheckPill(pill) {
1026ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertEquals("function", typeof pill);
1027ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertInstanceof(pill, Function);
10287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    pill.property = "value";
10297979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    assertEquals(pill.value, undefined);
10307979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    assertThrows(function() { 'use strict'; pill.property = "value"; },
10317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org                 TypeError);
1032ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertThrows(pill, TypeError);
1033ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertEquals(pill.prototype, (function(){}).prototype);
1034ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var d = Object.getOwnPropertyDescriptor(pill, "prototype");
1035ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertFalse(d.writable);
1036ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertFalse(d.configurable);
1037ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    assertFalse(d.enumerable);
1038ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1039ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1040ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var descriptor = Object.getOwnPropertyDescriptor(func, name);
1041ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPill(descriptor.get)
1042ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPill(descriptor.set);
1043ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertFalse(descriptor.enumerable);
1044ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertFalse(descriptor.configurable);
1045ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1046ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1047ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1048ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org(function TestStrictFunctionPills() {
1049ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function strict() {
1050ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    "use strict";
1051ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1052ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { strict.caller; }, TypeError);
1053ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { strict.arguments; }, TypeError);
1054394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertThrows(function() { strict.caller = 42; }, TypeError);
1055394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertThrows(function() { strict.arguments = 42; }, TypeError);
1056ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1057ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var another = new Function("'use strict'");
1058ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { another.caller; }, TypeError);
1059ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { another.arguments; }, TypeError);
1060394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertThrows(function() { another.caller = 42; }, TypeError);
1061394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertThrows(function() { another.arguments = 42; }, TypeError);
1062ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1063ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var third = (function() { "use strict"; return function() {}; })();
1064ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { third.caller; }, TypeError);
1065ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { third.arguments; }, TypeError);
1066394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertThrows(function() { third.caller = 42; }, TypeError);
1067394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  assertThrows(function() { third.arguments = 42; }, TypeError);
1068ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1069ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(strict, "caller");
1070ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(strict, "arguments");
1071ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(another, "caller");
1072ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(another, "arguments");
1073ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(third, "caller");
1074ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(third, "arguments");
1075ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org})();
1076ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1077ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1078ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org(function TestStrictFunctionWritablePrototype() {
1079ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  "use strict";
1080ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function TheClass() {
1081ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1082ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { TheClass.caller; }, TypeError);
1083ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertThrows(function() { TheClass.arguments; }, TypeError);
1084ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1085ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Strict functions must have writable prototype.
1086ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  TheClass.prototype = {
1087ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    func: function() { return "func_value"; },
1088ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    get accessor() { return "accessor_value"; },
1089ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    property: "property_value",
1090ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  };
1091ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1092ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var o = new TheClass();
1093ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(o.func(), "func_value");
1094ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(o.accessor, "accessor_value");
1095ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(o.property, "property_value");
1096ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org})();
1097ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1098ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1099ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org(function TestStrictArgumentPills() {
1100ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function strict() {
1101ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    "use strict";
1102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return arguments;
1103ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1104ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1105ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var args = strict();
1106ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "caller");
1107ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "callee");
1108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1109ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  args = strict(17, "value", strict);
1110ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(17, args[0])
1111ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals("value", args[1])
1112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(strict, args[2]);
1113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "caller");
1114ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "callee");
1115ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1116ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function outer() {
1117ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    "use strict";
1118ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    function inner() {
1119ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return arguments;
1120ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
1121ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return inner;
1122ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1124ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var args = outer()();
1125ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "caller");
1126ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "callee");
1127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1128ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  args = outer()(17, "value", strict);
1129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(17, args[0])
1130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals("value", args[1])
1131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertEquals(strict, args[2]);
1132ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "caller");
1133ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckPillDescriptor(args, "callee");
1134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org})();
1135ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1136ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1137ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org(function TestNonStrictFunctionCallerPillSimple() {
1138ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function return_my_caller() {
1139ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return return_my_caller.caller;
1140ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1142ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function strict() {
1143ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    "use strict";
11441f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return return_my_caller();
1145ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
11461f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertSame(null, strict());
1147ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1148ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function non_strict() {
1149ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return return_my_caller();
1150ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1151ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  assertSame(non_strict(), non_strict);
1152ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org})();
1153ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1154ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1155ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org(function TestNonStrictFunctionCallerPill() {
1156ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function strict(n) {
1157ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    "use strict";
11581f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return non_strict(n);
1159ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1160ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1161ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function recurse(n, then) {
1162ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (n > 0) {
11631f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org      return recurse(n - 1, then);
1164ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    } else {
1165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return then();
1166ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
1167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1168ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1169ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function non_strict(n) {
11701f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return recurse(n, function() { return non_strict.caller; });
1171ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1172ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1173ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  function test(n) {
11741f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return recurse(n, function() { return strict(n); });
11751f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  }
11761f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
11771f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  for (var i = 0; i < 10; i ++) {
11781f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    assertSame(null, test(i));
11791f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  }
11801f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org})();
11811f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
11821f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
11831f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org(function TestNonStrictFunctionCallerDescriptorPill() {
11841f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  function strict(n) {
11851f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    "use strict";
11861f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return non_strict(n);
11871f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  }
11881f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
11891f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  function recurse(n, then) {
11901f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    if (n > 0) {
11911f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org      return recurse(n - 1, then);
11921f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    } else {
11931f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org      return then();
1194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
11951f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  }
11961f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
11971f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  function non_strict(n) {
11981f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return recurse(n, function() {
11991f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org      return Object.getOwnPropertyDescriptor(non_strict, "caller").value;
12001f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    });
12011f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  }
12021f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
12031f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  function test(n) {
12041f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    return recurse(n, function() { return strict(n); });
1205ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1206ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1207ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  for (var i = 0; i < 10; i ++) {
12081f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    assertSame(null, test(i));
1209ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1210ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org})();
12118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org(function TestStrictModeEval() {
12148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  "use strict";
12158e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  eval("var eval_local = 10;");
12168e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  assertThrows(function() { return eval_local; }, ReferenceError);
12178e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org})();
1218