Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(599)

Side by Side Diff: test/mjsunit/function-call.js

Issue 6902104: Don't exchange null and undefined with the global object in function.prototype.{call, apply} for ... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28
29 var should_throw_on_null_and_undefined =
30 [Object.prototype.toLocaleString,
31 Object.prototype.valueOf,
32 Object.prototype.hasOwnProperty,
33 Object.prototype.isPrototypeOf,
34 Object.prototype.propertyIsEnumerable,
35 // Array.prototype.toString,
MarkM 2011/04/28 21:16:54 Why are these commented out?
Rico 2011/05/03 08:47:20 Done (and fixed in Array.prototype.toString/toLoca
36 // Array.prototype.toLocaleString,
37 Array.prototype.concat,
38 Array.prototype.join,
39 Array.prototype.pop,
40 Array.prototype.push,
41 Array.prototype.reverse,
42 Array.prototype.shift,
43 Array.prototype.slice,
44 Array.prototype.sort,
45 Array.prototype.splice,
46 Array.prototype.unshift,
47 Array.prototype.indexOf,
48 Array.prototype.lastIndexOf,
49 Array.prototype.every,
50 Array.prototype.some,
51 Array.prototype.forEach,
52 Array.prototype.map,
53 Array.prototype.filter,
54 Array.prototype.reduce,
55 Array.prototype.reduceRight,
56 String.prototype.charAt,
57 String.prototype.charCodeAt,
58 String.prototype.concat,
59 String.prototype.indexOf,
60 String.prototype.lastIndexOf,
61 String.prototype.localeCompare,
62 String.prototype.match,
63 String.prototype.replace,
64 String.prototype.search,
65 String.prototype.slice,
66 String.prototype.split,
67 String.prototype.substring,
68 String.prototype.toLowerCase,
69 String.prototype.toLocaleLowerCase,
70 String.prototype.toUpperCase,
71 String.prototype.toLocaleUpperCase,
72 String.prototype.trim,
73 Number.prototype.toLocaleString,
74 Error.prototype.toString];
75
76 // Non generic natives does not work on any input other than the specific
77 // type, but since this change will allow call to be invoked with undefined
78 // or null as this we still explicitly test that we throw on these here.
79 var non_generic =
80 [Function.prototype.toString,
Lasse Reichstein 2011/04/29 06:16:12 How about Function.prototype.call and Function.pro
Rico 2011/05/03 08:47:20 Done.
81 String.prototype.toString,
82 String.prototype.valueOf,
83 Boolean.prototype.toString,
84 Boolean.prototype.valueOf,
85 Number.prototype.toString,
86 Number.prototype.valueOf,
87 Number.prototype.toFixed,
88 Number.prototype.toExponential,
89 Number.prototype.toPrecision,
90 Date.prototype.toString,
91 Date.prototype.toDateString,
92 Date.prototype.toTimeString,
93 Date.prototype.toLocaleString,
94 Date.prototype.toLocaleDateString,
95 Date.prototype.toLocaleTimeString,
96 Date.prototype.valueOf,
97 Date.prototype.getTime,
98 Date.prototype.getFullYear,
99 Date.prototype.getUTCFullYear,
100 Date.prototype.getMonth,
101 Date.prototype.getUTCMonth,
102 Date.prototype.getDate,
103 Date.prototype.getUTCDate,
104 Date.prototype.getDay,
105 Date.prototype.getUTCDay,
106 Date.prototype.getHours,
107 Date.prototype.getUTCHours,
108 Date.prototype.getMinutes,
109 Date.prototype.getUTCMinutes,
110 Date.prototype.getSeconds,
111 Date.prototype.getUTCSeconds,
112 Date.prototype.getMilliseconds,
113 Date.prototype.getUTCMilliseconds,
114 Date.prototype.getTimezoneOffset,
115 Date.prototype.setTime,
116 Date.prototype.setMilliseconds,
117 Date.prototype.setUTCMilliseconds,
118 Date.prototype.setSeconds,
119 Date.prototype.setUTCSeconds,
120 Date.prototype.setMinutes,
121 Date.prototype.setUTCMinutes,
122 Date.prototype.setHours,
123 Date.prototype.setUTCHours,
124 Date.prototype.setDate,
125 Date.prototype.setUTCDate,
126 Date.prototype.setMonth,
127 Date.prototype.setUTCMonth,
128 Date.prototype.setFullYear,
129 Date.prototype.setUTCFullYear,
130 Date.prototype.toUTCString,
131 Date.prototype.toISOString,
132 Date.prototype.toJSON,
133 RegExp.prototype.exec,
134 RegExp.prototype.test,
135 RegExp.prototype.toString];
136
137
138 // Mapping functions.
139 var mapping_functions =
140 [Array.prototype.every,
141 Array.prototype.some,
142 Array.prototype.forEach,
143 Array.prototype.map,
144 Array.prototype.filter];
145
146 // Reduce functions.
147 var reducing_functions =
148 [Array.prototype.reduce,
149 Array.prototype.reduceRight];
Lasse Reichstein 2011/04/29 06:16:12 Try testing String.prototype.replace the same way.
Rico 2011/05/03 08:47:20 We do not use null as argument to call when in Str
Lasse Reichstein 2011/05/03 09:01:02 No, but I think we should use undefined for strict
Rico 2011/05/03 12:41:02 Bug filled for this and Array.prototype.sort http:
150
151 // Test that all natives using the ToObject call throws the right exception.
152 for (var i = 0; i < should_throw_on_null_and_undefined.length; i++) {
153 // Sanity check that all functions are correct
154 assertEquals(typeof(should_throw_on_null_and_undefined[i]), "function");
155
156 try {
157 should_throw_on_null_and_undefined[i].call(null);
158 assertUnreachable();
159 } catch (e) {
160 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
MarkM 2011/04/28 21:16:54 If we changed the test here to assertTrue(e i
Lasse Reichstein 2011/04/29 06:16:12 It helps if the same algorithm can throw more than
Rico 2011/05/03 08:47:20 We normally do test the output of the error messag
161 }
162
163 try {
164 should_throw_on_null_and_undefined[i].call(undefined);
MarkM 2011/04/28 21:16:54 If should_throw_on_null_and_undefined[i] happens t
Lasse Reichstein 2011/04/29 06:16:12 A comment should suffice. The general rule, which
Rico 2011/05/03 08:47:20 Comment inserted
165 assertUnreachable();
166 } catch (e) {
167 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
168 }
169
170 try {
171 should_throw_on_null_and_undefined[i].apply(null);
172 assertUnreachable();
173 } catch (e) {
174 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
175 }
176
177 try {
178 should_throw_on_null_and_undefined[i].apply(undefined);
179 assertUnreachable();
180 } catch (e) {
181 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
182 }
183 }
184
185 // Test that all natives that are non generic throws on null and undefined.
186 for (var i = 0; i < non_generic.length; i++) {
187 // Sanity check that all functions are correct
188 assertEquals(typeof(non_generic[i]), "function");
189 print(non_generic[i].toString());
190 try {
191 non_generic[i].call(null);
192 assertUnreachable();
193 } catch (e) {
194 assertTrue(e instanceof TypeError);
195 }
196
197 try {
198 non_generic[i].call(null);
199 assertUnreachable();
200 } catch (e) {
201 assertTrue(e instanceof TypeError);
202 }
203
204 try {
205 non_generic[i].apply(null);
206 assertUnreachable();
207 } catch (e) {
208 assertTrue(e instanceof TypeError);
209 }
210
211 try {
212 non_generic[i].apply(null);
213 assertUnreachable();
214 } catch (e) {
215 assertTrue(e instanceof TypeError);
216 }
217 }
218
219
220 // Test that we still throw when calling with thisArg null or undefined
221 // through an array mapping function.
222 var array = [1,2,3,4,5];
223 for (var j = 0; j < mapping_functions.length; j++) {
224 for (var i = 0; i < should_throw_on_null_and_undefined.length; i++) {
225 try {
226 mapping_functions[j].call(array,
227 should_throw_on_null_and_undefined[i],
228 null);
229 assertUnreachable();
230 } catch (e) {
231 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
232 }
233
234 try {
235 mapping_functions[j].call(array,
236 should_throw_on_null_and_undefined[i],
237 undefined);
238 assertUnreachable();
239 } catch (e) {
240 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
241 }
242 }
243 }
244
245 for (var j = 0; j < mapping_functions.length; j++) {
246 for (var i = 0; i < non_generic.length; i++) {
247 try {
248 mapping_functions[j].call(array,
249 non_generic[i],
250 null);
251 assertUnreachable();
252 } catch (e) {
253 assertTrue(e instanceof TypeError);
254 }
255
256 try {
257 mapping_functions[j].call(array,
258 non_generic[i],
259 null);
260 assertUnreachable();
261 } catch (e) {
262 assertTrue(e instanceof TypeError);
263 }
264 }
265 }
266
267
268 // Reduce functions do a call with null as this argument.
269 for (var j = 0; j < reducing_functions.length; j++) {
270 for (var i = 0; i < should_throw_on_null_and_undefined.length; i++) {
271 try {
272 reducing_functions[j].call(array,
273 should_throw_on_null_and_undefined[i]);
Lasse Reichstein 2011/04/28 10:44:38 Indentation (more cases below).
Rico 2011/05/03 08:47:20 Done.
274 assertUnreachable();
275 } catch (e) {
276 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
277 }
278
279 try {
280 reducing_functions[j].call(array,
281 should_throw_on_null_and_undefined[i]);
282 assertUnreachable();
283 } catch (e) {
284 assertTrue(/called on non-object/.test(e) || /Cannot convert/.test(e));
285 }
286 }
287 }
288
289 for (var j = 0; j < reducing_functions.length; j++) {
290 for (var i = 0; i < non_generic.length; i++) {
291 try {
292 reducing_functions[j].call(array,
293 non_generic[i]);
294 assertUnreachable();
295 } catch (e) {
296 assertTrue(e instanceof TypeError);
297 }
298
299 try {
300 reducing_functions[j].call(array,
301 non_generic[i]);
302 assertUnreachable();
303 } catch (e) {
304 assertTrue(e instanceof TypeError);
305 }
306 }
307 }
308
309 // Object.prototype.toString()
310 assertEquals(Object.prototype.toString.call(null),
311 '[object Null]')
312
313 assertEquals(Object.prototype.toString.call(undefined),
314 '[object Undefined]')
OLDNEW
« src/string.js ('K') | « src/v8natives.js ('k') | test/mjsunit/regress/regress-485.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698