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 29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar should_throw_on_null_and_undefined = 30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch [Object.prototype.toLocaleString, 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object.prototype.valueOf, 32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object.prototype.hasOwnProperty, 33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object.prototype.isPrototypeOf, 34257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object.prototype.propertyIsEnumerable, 35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.concat, 36257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.join, 37257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.pop, 38257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.push, 39257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.reverse, 40257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.shift, 41257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.slice, 42257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.sort, 43257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.splice, 44257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.unshift, 45257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.indexOf, 46257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.lastIndexOf, 47257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.every, 48257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.some, 49257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.forEach, 50257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.map, 51257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.filter, 52257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.reduce, 53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.reduceRight, 54257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.charAt, 55257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.charCodeAt, 56257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.concat, 57257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.indexOf, 58257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.lastIndexOf, 59257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.localeCompare, 60257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.match, 61257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.replace, 62257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.search, 63257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.slice, 64257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.split, 65257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.substring, 66257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.toLowerCase, 67257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.toLocaleLowerCase, 68257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.toUpperCase, 69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.toLocaleUpperCase, 70257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.trim, 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Number.prototype.toLocaleString]; 72257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 73257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Non generic natives do not work on any input other than the specific 74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// type, but since this change will allow call to be invoked with undefined 75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// or null as this we still explicitly test that we throw on these here. 76257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar non_generic = 77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch [Array.prototype.toString, 78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.toLocaleString, 79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Function.prototype.toString, 80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Function.prototype.call, 81257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Function.prototype.apply, 82257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.toString, 83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch String.prototype.valueOf, 84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Boolean.prototype.toString, 85257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Boolean.prototype.valueOf, 86257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Number.prototype.toString, 87257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Number.prototype.valueOf, 88257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Number.prototype.toFixed, 89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Number.prototype.toExponential, 90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Number.prototype.toPrecision, 91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toString, 92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toDateString, 93257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toTimeString, 94257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toLocaleString, 95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toLocaleDateString, 96257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toLocaleTimeString, 97257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.valueOf, 98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getTime, 99257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getFullYear, 100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCFullYear, 101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getMonth, 102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCMonth, 103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getDate, 104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCDate, 105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getDay, 106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCDay, 107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getHours, 108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCHours, 109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getMinutes, 110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCMinutes, 111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getSeconds, 112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCSeconds, 113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getMilliseconds, 114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getUTCMilliseconds, 115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.getTimezoneOffset, 116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setTime, 117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setMilliseconds, 118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCMilliseconds, 119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setSeconds, 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCSeconds, 121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setMinutes, 122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCMinutes, 123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setHours, 124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCHours, 125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setDate, 126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCDate, 127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setMonth, 128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCMonth, 129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setFullYear, 130257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.setUTCFullYear, 131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toUTCString, 132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toISOString, 133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Date.prototype.toJSON, 134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch RegExp.prototype.exec, 135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch RegExp.prototype.test, 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RegExp.prototype.toString, 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Error.prototype.toString]; 138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 140257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Mapping functions. 141257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar mapping_functions = 142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch [Array.prototype.every, 143257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.some, 144257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.forEach, 145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.map, 146257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.filter]; 147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Reduce functions. 149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar reducing_functions = 150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch [Array.prototype.reduce, 151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Array.prototype.reduceRight]; 152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 153257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test that all natives using the ToObject call throw the right exception. 154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < should_throw_on_null_and_undefined.length; i++) { 155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Sanity check that all functions are correct 156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(typeof(should_throw_on_null_and_undefined[i]), "function"); 157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch var exception = false; 159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // We call all functions with no parameters, which means that essential 161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // parameters will have the undefined value. 162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The test for whether the "this" value is null or undefined is always 163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // performed before access to the other parameters, so even if the 164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // undefined value is an invalid argument value, it mustn't change 165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // the result of the test. 166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch should_throw_on_null_and_undefined[i].call(null); 167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch should_throw_on_null_and_undefined[i].call(undefined); 177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 1783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 183257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch should_throw_on_null_and_undefined[i].apply(null); 187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 1883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 193257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch should_throw_on_null_and_undefined[i].apply(undefined); 197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 1983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 204257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test that all natives that are non generic throw on null and undefined. 206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < non_generic.length; i++) { 207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Sanity check that all functions are correct 208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(typeof(non_generic[i]), "function"); 2093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 212257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch non_generic[i].call(null); 213257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 216257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 218257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch non_generic[i].call(null); 222257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 224257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 225257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 227257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch non_generic[i].apply(null); 231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 236257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch non_generic[i].apply(null); 240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 242257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 243257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 245257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 246257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 247257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 248257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test that we still throw when calling with thisArg null or undefined 249257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// through an array mapping function. 250257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar array = [1,2,3,4,5]; 251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var j = 0; j < mapping_functions.length; j++) { 252257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (var i = 0; i < should_throw_on_null_and_undefined.length; i++) { 2533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 255257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch mapping_functions[j].call(array, 256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch should_throw_on_null_and_undefined[i], 257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch null); 258257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 260257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 261257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 262257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 264257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 266257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch mapping_functions[j].call(array, 268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch should_throw_on_null_and_undefined[i], 269257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch undefined); 270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var j = 0; j < mapping_functions.length; j++) { 280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (var i = 0; i < non_generic.length; i++) { 2813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 282257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch mapping_functions[j].call(array, 284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch non_generic[i], 285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch null); 286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 288257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 293257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch mapping_functions[j].call(array, 295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch non_generic[i], 296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch undefined); 297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 2983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Reduce functions do a call with null as this argument. 307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var j = 0; j < reducing_functions.length; j++) { 308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (var i = 0; i < should_throw_on_null_and_undefined.length; i++) { 3093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch reducing_functions[j].call(array, should_throw_on_null_and_undefined[i]); 312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 3133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 316257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch reducing_functions[j].call(array, should_throw_on_null_and_undefined[i]); 322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 3233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue("called_on_null_or_undefined" == e.type || 325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "null_to_object" == e.type); 326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 329257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var j = 0; j < reducing_functions.length; j++) { 332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (var i = 0; i < non_generic.length; i++) { 3333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 335257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch reducing_functions[j].call(array, non_generic[i]); 336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 3373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = false; 343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch reducing_functions[j].call(array, non_generic[i]); 345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch (e) { 3463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch exception = true; 347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(e instanceof TypeError); 348257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch assertTrue(exception); 350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Object.prototype.toString() 355257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(Object.prototype.toString.call(null), 356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch '[object Null]') 357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 358257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(Object.prototype.toString.call(undefined), 359257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch '[object Undefined]') 360