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