1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Redistribution and use in source and binary forms, with or without
3257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// modification, are permitted provided that the following conditions are
4257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// met:
5257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//
6257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//     * Redistributions of source code must retain the above copyright
7257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//     * Redistributions in binary form must reproduce the above
9257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//       copyright notice, this list of conditions and the following
10257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//       with the distribution.
12257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//       contributors may be used to endorse or promote products derived
14257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//       from this software without specific prior written permission.
15257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//
16257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
28257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Flags: --allow-natives-syntax
29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar y = 3;
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction get_y() { return this.y; }
33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_get_y() { "use strict"; return this.y; }
34257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to strict mode function as methods.
36257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 10; i++) assertEquals(3, strict_get_y.call(this));
37257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar o = { y: 42 };
38257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 10; i++) assertEquals(42, strict_get_y.call(o));
39257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
40257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to strict mode function with implicit receiver.
41257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction g() {
42257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var exception = false;
43257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  try { strict_get_y(); } catch(e) { exception = true; }
44257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertTrue(exception);
45257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
46257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 3; i++) g();
47257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
48257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to local strict mode function with implicit receiver.
49257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction local_function_test() {
50257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  function get_y() { return this.y; }
51257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  function strict_get_y() { "use strict"; return this.y; }
52257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(3, get_y());
53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(3, get_y(23));
54257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var exception = false;
55257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  try {
56257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    strict_get_y();
57257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } catch(e) {
58257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    exception = true;
59257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
60257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertTrue(exception);
61257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
62257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
63257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 10; i++) {
64257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  local_function_test();
65257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
66257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
67257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test call to catch variable strict-mode function. Implicit
68257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// receiver.
69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar exception = false;
70257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtry {
71257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  throw strict_get_y;
72257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} catch(f) {
73257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  try {
74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    f();
75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } catch(e) {
76257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    exception = true;
77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertTrue(exception);
79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
81257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
82257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to strict-mode function with the object from a with
83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// statement as the receiver.
84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith(this) {
85257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(3, strict_get_y());
86257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(3, strict_get_y(32));
87257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
88257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar o = { y: 27 };
90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdocho.f = strict_get_y;
91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith(o) {
92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(27, f());
93257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(27, f(23));
94257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
96257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
97257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Check calls to eval within a function with 'undefined' as receiver.
98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction implicit_receiver_eval() {
99257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  "use strict";
100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return eval("this");
101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, implicit_receiver_eval());
104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, implicit_receiver_eval(32));
105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Strict mode function to get inlined.
108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_return_receiver() {
109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  "use strict";
110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return this;
111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Inline with implicit receiver.
114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction g() {
115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return strict_return_receiver();
116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 5; i++) {
119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(void 0, g());
120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertEquals(void 0, g(42));
121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch%OptimizeFunctionOnNextCall(g);
123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, g(42));
124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, g());
125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Inline with explicit receiver.
127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction g2() {
128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var o = {};
129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  o.f = strict_return_receiver;
130257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return o.f();
131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 5; i++) {
134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertTrue(typeof g2() == "object");
135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  assertTrue(typeof g2(42) == "object");
136257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
137257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch%OptimizeFunctionOnNextCall(g2);
138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertTrue(typeof g2() == "object");
139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertTrue(typeof g2(42) == "object");
140257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
141257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls of aliased eval.
142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction outer_eval_receiver() {
143257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var eval = function() { return this; }
144257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  function inner_strict() {
145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    "use strict";
146257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    assertEquals('object', typeof eval());
147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  inner_strict();
149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_receiver();
151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction outer_eval_conversion3(eval, expected) {
153257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  function inner_strict() {
154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    "use strict";
155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    var x = eval("this");
156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    assertEquals(expected, typeof x);
157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  inner_strict();
159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_return_this() { "use strict"; return this; }
162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction return_this() { return this; }
163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_eval(s) { "use strict"; return eval(s); }
164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction non_strict_eval(s) { return eval(s); }
165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(strict_return_this, 'undefined');
167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(return_this, 'object');
168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(strict_eval, 'undefined');
169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(non_strict_eval, 'object');
170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochouter_eval_conversion3(eval, 'undefined');
172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction test_constant_function() {
174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var o = { f: function() { "use strict"; return this; } };
175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  this.__proto__ = o;
176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (var i = 0; i < 10; i++) assertEquals(void 0, f());
177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtest_constant_function();
179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction test_field() {
181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var o = { };
182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  o.f = function() {};
183257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  o.f = function() { "use strict"; return this; };
184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  this.__proto__ = o;
185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (var i = 0; i < 10; i++) assertEquals(void 0, f());
186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtest_field();
188