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