1b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Copyright 2008 the V8 project authors. All rights reserved.
2b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Redistribution and use in source and binary forms, with or without
3b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// modification, are permitted provided that the following conditions are
4b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// met:
5b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
6b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     * Redistributions of source code must retain the above copyright
7b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       notice, this list of conditions and the following disclaimer.
8b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     * Redistributions in binary form must reproduce the above
9b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       copyright notice, this list of conditions and the following
10b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       disclaimer in the documentation and/or other materials provided
11b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       with the distribution.
12b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     * Neither the name of Google Inc. nor the names of its
13b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       contributors may be used to endorse or promote products derived
14b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       from this software without specific prior written permission.
15b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
16b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
28b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// When calling user-defined functions on strings, booleans or
29b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// numbers, we should create a wrapper object.
30b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
31b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// When running the tests use loops to ensure that the call site moves through
32b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// the different IC states and that both the runtime system and the generated
33b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// IC code is tested.
34a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org
35b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgfunction RunTests() {
36b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (var i = 0; i < 10; i++) {
37b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', 'xxx'.TypeOfThis());
38b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', true.TypeOfThis(2,3));
39b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', false.TypeOfThis());
40b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', (42).TypeOfThis());
41b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', (3.14).TypeOfThis());
42b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
431805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
44b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (var i = 0; i < 10; i++) {
45b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', 'xxx'['TypeOfThis']());
46b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', true['TypeOfThis']());
47b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', false['TypeOfThis']());
48b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', (42)['TypeOfThis']());
49b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', (3.14)['TypeOfThis']());
50b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
511805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
52b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  function CallTypeOfThis(obj) {
53b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', obj.TypeOfThis());
54b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
551805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
56b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (var i = 0; i < 10; i++) {
57b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    CallTypeOfThis('xxx');
58b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    CallTypeOfThis(true);
59b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    CallTypeOfThis(false);
60b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    CallTypeOfThis(42);
61b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    CallTypeOfThis(3.14);
62b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
631805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
64b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  function TestWithWith(obj) {
65b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    with (obj) {
66b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      for (var i = 0; i < 10; i++) {
67b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org        assertEquals('object', TypeOfThis());
68b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      }
69b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    }
70b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
711805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
72b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestWithWith('xxx');
73b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestWithWith(true);
74b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestWithWith(false);
75b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestWithWith(42);
76b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestWithWith(3.14);
771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
78b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (var i = 0; i < 10; i++) {
79b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', true[7]());
80b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', false[7]());
81b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', (42)[7]());
82b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', (3.14)[7]());
83b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
84b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
85b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (var i = 0; i < 10; i++) {
86b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', typeof 'xxx'.ObjectValueOf());
87b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', typeof true.ObjectValueOf());
88b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', typeof false.ObjectValueOf());
89b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', typeof (42).ObjectValueOf());
90b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('object', typeof (3.14).ObjectValueOf());
91b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
92b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
93b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (var i = 0; i < 10; i++) {
94b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('[object String]', 'xxx'.ObjectToString());
95b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('[object Boolean]', true.ObjectToString());
96b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('[object Boolean]', false.ObjectToString());
97b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('[object Number]', (42).ObjectToString());
98b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    assertEquals('[object Number]', (3.14).ObjectToString());
99b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
100b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
101b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
102b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgfunction TypeOfThis() { return typeof this; }
103b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// Test with normal setup of prototype.
105b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgString.prototype.TypeOfThis = TypeOfThis;
106b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype.TypeOfThis = TypeOfThis;
107b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype.TypeOfThis = TypeOfThis;
108b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype[7] = TypeOfThis;
109b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype[7] = TypeOfThis;
110b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
111b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgString.prototype.ObjectValueOf = Object.prototype.valueOf;
112b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype.ObjectValueOf = Object.prototype.valueOf;
113b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype.ObjectValueOf = Object.prototype.valueOf;
114b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
115b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgString.prototype.ObjectToString = Object.prototype.toString;
116b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype.ObjectToString = Object.prototype.toString;
117b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype.ObjectToString = Object.prototype.toString;
118b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
119b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgRunTests();
120b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
121b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Run test after properties have been set to a different value.
122b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgString.prototype.TypeOfThis = 'x';
123b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype.TypeOfThis = 'x';
124b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype.TypeOfThis = 'x';
125b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype[7] = 'x';
126b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype[7] = 'x';
127b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
128b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgString.prototype.TypeOfThis = TypeOfThis;
129b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype.TypeOfThis = TypeOfThis;
130b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype.TypeOfThis = TypeOfThis;
131b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype[7] = TypeOfThis;
132b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype[7] = TypeOfThis;
133b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
134b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgRunTests();
135b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
136b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Force the prototype into slow case and run the test again.
137b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgdelete String.prototype.TypeOfThis;
138b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgdelete Boolean.prototype.TypeOfThis;
139b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgdelete Number.prototype.TypeOfThis;
140b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype[7];
141b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype[7];
142b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
143b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgString.prototype.TypeOfThis = TypeOfThis;
144b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype.TypeOfThis = TypeOfThis;
145b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype.TypeOfThis = TypeOfThis;
146b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgBoolean.prototype[7] = TypeOfThis;
147b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgNumber.prototype[7] = TypeOfThis;
148b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
149b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgRunTests();
150b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
151b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// According to ES3 15.3.4.3 the this value passed to Function.prototyle.apply
152b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// should wrapped. According to ES5 it should not.
153b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.apply('xxx', []));
154b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.apply(true, []));
155b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.apply(false, []));
156b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.apply(42, []));
157b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.apply(3.14, []));
158b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
159b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// According to ES3 15.3.4.3 the this value passed to Function.prototyle.call
160b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// should wrapped. According to ES5 it should not.
161b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.call('xxx'));
162b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.call(true));
163b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.call(false));
164b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.call(42));
165b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgassertEquals('object', TypeOfThis.call(3.14));
166