OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --strong-mode --harmony-arrow-functions --harmony-reflect --harmony-sp readcalls --allow-natives-syntax | |
rossberg
2015/05/11 15:39:28
Nit: line length
arv (Not doing code reviews)
2015/05/11 16:54:02
Done.
I fixed this but I guess I undid too much a
| |
6 | |
7 'use strict'; | |
8 | |
9 | |
10 function generateArguments(n, prefix) { | |
11 let a = []; | |
12 if (prefix) { | |
13 a.push(prefix); | |
14 } | |
15 for (let i = 0; i < n; i++) { | |
16 a.push(String(i)); | |
17 } | |
18 | |
19 return a.join(', '); | |
20 } | |
21 | |
22 | |
23 function generateParams(n) { | |
24 let a = []; | |
25 for (let i = 0; i < n; i++) { | |
26 a[i] = `p${i}`; | |
27 } | |
28 return a.join(', '); | |
29 } | |
30 | |
31 | |
32 function generateSpread(n) { | |
33 return `...[${generateArguments(n)}]`; | |
34 } | |
35 | |
36 | |
37 (function FunctionCall() { | |
38 for (let parameter_count = 0; parameter_count < 3; parameter_count++) { | |
39 let defs = [ | |
40 `'use strong'; function f(${generateParams(parameter_count)}) {}`, | |
41 `'use strong'; function* f(${generateParams(parameter_count)}) {}`, | |
42 `'use strong'; let f = (${generateParams(parameter_count)}) => {}`, | |
43 `function f(${generateParams(parameter_count)}) { 'use strong'; }`, | |
44 `function* f(${generateParams(parameter_count)}) { 'use strong'; }`, | |
45 `let f = (${generateParams(parameter_count)}) => { 'use strong'; }`, | |
46 ]; | |
47 for (let def of defs) { | |
48 for (let argument_count = 0; argument_count < 3; argument_count++) { | |
49 let calls = [ | |
50 `f(${generateArguments(argument_count)})`, | |
51 `f(${generateSpread(argument_count)})`, | |
52 `f.call(${generateArguments(argument_count, 'undefined')})`, | |
53 `f.call(undefined, ${generateSpread(argument_count)})`, | |
54 `f.apply(undefined, [${generateArguments(argument_count)}])`, | |
55 `f.bind(undefined)(${generateArguments(argument_count)})`, | |
56 `%_CallFunction(${generateArguments(argument_count, 'undefined')}, | |
57 f)`, | |
58 `%Call(${generateArguments(argument_count, 'undefined')}, f)`, | |
59 `%Apply(f, undefined, [${generateArguments(argument_count)}], 0, | |
60 ${argument_count})`, | |
61 ]; | |
62 | |
63 for (let call of calls) { | |
64 let code = `'use strict'; ${def}; ${call};`; | |
65 if (argument_count < parameter_count) { | |
66 assertThrows(code, TypeError); | |
67 } else { | |
68 assertDoesNotThrow(code); | |
69 } | |
70 } | |
71 } | |
72 | |
73 let calls = [ | |
74 `f.call()`, | |
75 `f.apply()`, | |
76 `f.apply(undefined)`, | |
77 ]; | |
78 for (let call of calls) { | |
79 let code = `'use strict'; ${def}; ${call};`; | |
80 if (parameter_count > 0) { | |
81 assertThrows(code, TypeError); | |
82 } else { | |
83 assertDoesNotThrow(code); | |
84 } | |
85 } | |
86 } | |
87 } | |
88 })(); | |
89 | |
90 | |
91 (function MethodCall() { | |
92 for (let parameter_count = 0; parameter_count < 3; parameter_count++) { | |
93 let defs = [ | |
94 `let o = new class { | |
95 m(${generateParams(parameter_count)}) { 'use strong'; } | |
96 }`, | |
97 `let o = new class { | |
98 *m(${generateParams(parameter_count)}) { 'use strong'; } | |
99 }`, | |
100 `let o = { m(${generateParams(parameter_count)}) { 'use strong'; } }`, | |
101 `let o = { *m(${generateParams(parameter_count)}) { 'use strong'; } }`, | |
102 `'use strong'; | |
103 let o = new class { m(${generateParams(parameter_count)}) {} }`, | |
104 `'use strong'; | |
105 let o = new class { *m(${generateParams(parameter_count)}) {} }`, | |
106 `'use strong'; let o = { m(${generateParams(parameter_count)}) {} }`, | |
107 `'use strong'; let o = { *m(${generateParams(parameter_count)}) {} }`, | |
108 ]; | |
109 for (let def of defs) { | |
110 for (let argument_count = 0; argument_count < 3; argument_count++) { | |
111 let calls = [ | |
112 `o.m(${generateArguments(argument_count)})`, | |
113 `o.m(${generateSpread(argument_count)})`, | |
114 `o.m.call(${generateArguments(argument_count, 'o')})`, | |
115 `o.m.call(o, ${generateSpread(argument_count)})`, | |
116 `o.m.apply(o, [${generateArguments(argument_count)}])`, | |
117 `o.m.bind(o)(${generateArguments(argument_count)})`, | |
118 `%_CallFunction(${generateArguments(argument_count, 'o')}, o.m)`, | |
119 `%Call(${generateArguments(argument_count, 'o')}, o.m)`, | |
120 `%Apply(o.m, o, [${generateArguments(argument_count)}], 0, | |
121 ${argument_count})`, | |
122 ]; | |
123 | |
124 for (let call of calls) { | |
125 let code = `'use strict'; ${def}; ${call};`; | |
126 if (argument_count < parameter_count) { | |
127 assertThrows(code, TypeError); | |
128 } else { | |
129 assertDoesNotThrow(code); | |
130 } | |
131 } | |
132 } | |
133 | |
134 let calls = [ | |
135 `o.m.call()`, | |
136 `o.m.apply()`, | |
137 `o.m.apply(o)`, | |
138 ]; | |
139 for (let call of calls) { | |
140 let code = `'use strict'; ${def}; ${call};`; | |
141 if (parameter_count > 0) { | |
142 assertThrows(code, TypeError); | |
143 } else { | |
144 assertDoesNotThrow(code); | |
145 } | |
146 } | |
147 } | |
148 } | |
149 })(); | |
150 | |
151 | |
152 (function Constructor() { | |
153 for (let argument_count = 0; argument_count < 3; argument_count++) { | |
154 for (let parameter_count = 0; parameter_count < 3; parameter_count++) { | |
155 let defs = [ | |
156 `'use strong'; | |
157 class C { constructor(${generateParams(parameter_count)}) {} }`, | |
158 `'use strict'; | |
159 class C { | |
160 constructor(${generateParams(parameter_count)}) { 'use strong'; } | |
161 }`, | |
162 ]; | |
163 for (let def of defs) { | |
164 let calls = [ | |
165 `new C(${generateArguments(argument_count)})`, | |
166 `new C(${generateSpread(argument_count)})`, | |
167 `Reflect.construct(C, [${generateArguments(argument_count)}])`, | |
168 ]; | |
169 for (let call of calls) { | |
170 let code = `${def}; ${call};`; | |
171 if (argument_count < parameter_count) { | |
172 assertThrows(code, TypeError); | |
173 } else { | |
174 assertDoesNotThrow(code); | |
175 } | |
176 } | |
177 } | |
178 } | |
179 } | |
180 })(); | |
181 | |
182 | |
183 (function DerivedConstructor() { | |
184 for (let genArgs of [generateArguments, generateSpread]) { | |
185 for (let argument_count = 0; argument_count < 3; argument_count++) { | |
186 for (let parameter_count = 0; parameter_count < 3; parameter_count++) { | |
187 let defs = [ | |
188 `'use strong'; | |
189 class B { | |
190 constructor(${generateParams(parameter_count)}) {} | |
191 } | |
192 class C extends B { | |
193 constructor() { | |
194 super(${genArgs(argument_count)}); | |
195 } | |
196 }`, | |
197 `'use strict'; | |
198 class B { | |
199 constructor(${generateParams(parameter_count)}) { 'use strong'; } | |
200 } | |
201 class C extends B { | |
202 constructor() { | |
203 super(${genArgs(argument_count)}); | |
204 } | |
205 }`, | |
206 ]; | |
207 for (let def of defs) { | |
208 let code = `${def}; new C();`; | |
209 if (argument_count < parameter_count) { | |
210 assertThrows(code, TypeError); | |
211 } else { | |
212 assertDoesNotThrow(code); | |
213 } | |
214 } | |
215 } | |
216 } | |
217 } | |
218 })(); | |
219 | |
220 | |
221 (function DerivedConstructorDefaultConstructorInDerivedClass() { | |
222 for (let genArgs of [generateArguments, generateSpread]) { | |
223 for (let argument_count = 0; argument_count < 3; argument_count++) { | |
224 for (let parameter_count = 0; parameter_count < 3; parameter_count++) { | |
225 let defs = [ | |
226 `'use strong'; | |
227 class B { | |
228 constructor(${generateParams(parameter_count)}) {} | |
229 } | |
230 class C extends B {}`, | |
231 `'use strict'; | |
232 class B { | |
233 constructor(${generateParams(parameter_count)}) { 'use strong'; } | |
234 } | |
235 class C extends B {}`, | |
236 ]; | |
237 for (let def of defs) { | |
238 let code = `${def}; new C(${genArgs(argument_count)})`; | |
239 if (argument_count < parameter_count) { | |
240 assertThrows(code, TypeError); | |
241 } else { | |
242 assertDoesNotThrow(code); | |
243 } | |
244 } | |
245 } | |
246 } | |
247 } | |
248 })(); | |
249 | |
250 | |
251 (function TestOptimized() { | |
252 function f(x, y) { 'use strong'; } | |
253 | |
254 assertThrows(f, TypeError); | |
255 %OptimizeFunctionOnNextCall(f); | |
256 assertThrows(f, TypeError); | |
257 | |
258 function g() { | |
259 f(1); | |
260 } | |
261 assertThrows(g, TypeError); | |
262 %OptimizeFunctionOnNextCall(g); | |
263 assertThrows(g, TypeError); | |
264 })(); | |
265 | |
266 | |
267 (function TestOptimized2() { | |
268 'use strong'; | |
269 function f(x, y) {} | |
rossberg
2015/05/11 15:39:28
It's also worth testing the case where the callee
arv (Not doing code reviews)
2015/05/11 16:54:02
Done.
rossberg
2015/05/12 06:02:16
Sorry for the misunderstanding, I meant the case w
| |
270 | |
271 assertThrows(f, TypeError); | |
272 %OptimizeFunctionOnNextCall(f); | |
273 assertThrows(f, TypeError); | |
274 | |
275 function g() { | |
276 f(1); | |
277 } | |
278 assertThrows(g, TypeError); | |
279 %OptimizeFunctionOnNextCall(g); | |
280 assertThrows(g, TypeError); | |
281 })(); | |
282 | |
283 | |
284 // https://code.google.com/p/v8/issues/detail?id=4077 | |
285 // (function NoParametersSuper() { | |
286 // 'use strong'; | |
287 // | |
288 // class B { | |
289 // m() {} | |
290 // } | |
291 // class D extends B { | |
292 // m0() { super.m(); } | |
293 // m1() { super.m(1); } | |
294 // s0() { super.m(); } | |
295 // s1() { super.m(1); } | |
296 // } | |
297 // | |
298 // new D().m0(); | |
299 // new D().m1(); | |
300 // | |
301 // new D().s0(); | |
302 // new D().s1(); | |
303 // })(); | |
304 | |
305 | |
306 // https://code.google.com/p/v8/issues/detail?id=4077 | |
307 // (function OneParamentSuper() { | |
308 // 'use strong'; | |
309 // | |
310 // class B { | |
311 // m(x) {} | |
312 // } | |
313 // class D extends B { | |
314 // m0() { super.m(); } | |
315 // m1() { super.m(1); } | |
316 // m2() { super.m(1, 2); } | |
317 // s0() { super.m(...[]); } | |
318 // s1() { super.m(...[1]); } | |
319 // s2() { super.m(...[1, 2]); } | |
320 // } | |
321 // | |
322 // assertThrows(function() { new D().m0(); }, TypeError); | |
323 // new D().m1(); | |
324 // new D().m2(); | |
325 // | |
326 // assertThrows(function() { new D().s0(); }, TypeError); | |
327 // new D().s1(); | |
328 // new D().s2(); | |
329 // })(); | |
330 | |
331 | |
332 // https://code.google.com/p/v8/issues/detail?id=4077 | |
333 // (function TwoParametersSuper() { | |
334 // 'use strong'; | |
335 // | |
336 // class B { | |
337 // m(x, y) {} | |
338 // } | |
339 // class D extends B { | |
340 // m0() { super.m(); } | |
341 // m1() { super.m(1); } | |
342 // m2() { super.m(1, 2); } | |
343 // m3() { super.m(1, 2, 3); } | |
344 // s0() { super.m(...[]); } | |
345 // s1() { super.m(...[1]); } | |
346 // s2() { super.m(...[1, 2]); } | |
347 // s3() { super.m(...[1, 2, 3]); } | |
348 // } | |
349 // | |
350 // assertThrows(function() { new D().m0(); }, TypeError); | |
351 // assertThrows(function() { new D().m1(); }, TypeError); | |
352 // new D().m2(); | |
353 // new D().m3(); | |
354 // | |
355 // assertThrows(function() { new D().s0(); }, TypeError); | |
356 // assertThrows(function() { new D().s1(); }, TypeError); | |
357 // new D().s2(); | |
358 // new D().s3(); | |
359 // })(); | |
OLD | NEW |