OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --harmony-iterator-close | 5 // Flags: --harmony-iterator-close |
adamk
2016/03/07 20:28:05
There are a ton of new tests in here, but I don't
neis
2016/03/08 13:40:10
Yes, definitely. I added more.
| |
6 | 6 |
7 | |
7 function* g() { yield 42; return 88 }; | 8 function* g() { yield 42; return 88 }; |
8 | 9 |
9 | 10 |
10 // Return method is "undefined". | 11 // Return method is "undefined". |
11 { | 12 { |
12 g.prototype.return = null; | 13 g.prototype.return = null; |
13 | 14 |
15 | |
16 assertEquals(undefined, (() => { | |
17 for (var x of g()) { break; } | |
18 })()); | |
19 | |
14 assertEquals(undefined, (() => { | 20 assertEquals(undefined, (() => { |
15 for (let x of g()) { break; } | 21 for (let x of g()) { break; } |
16 })()); | 22 })()); |
17 | 23 |
18 assertEquals(undefined, (() => { | 24 assertEquals(undefined, (() => { |
25 for (const x of g()) { break; } | |
26 })()); | |
27 | |
28 assertEquals(undefined, (() => { | |
19 for (x of g()) { break; } | 29 for (x of g()) { break; } |
20 })()); | 30 })()); |
21 | 31 |
32 | |
33 assertThrowsEquals(() => { | |
34 for (var x of g()) { throw 42; } | |
35 }, 42); | |
36 | |
22 assertThrowsEquals(() => { | 37 assertThrowsEquals(() => { |
23 for (let x of g()) { throw 42; } | 38 for (let x of g()) { throw 42; } |
24 }, 42); | 39 }, 42); |
25 | 40 |
26 assertThrowsEquals(() => { | 41 assertThrowsEquals(() => { |
42 for (const x of g()) { throw 42; } | |
43 }, 42); | |
44 | |
45 assertThrowsEquals(() => { | |
27 for (x of g()) { throw 42; } | 46 for (x of g()) { throw 42; } |
28 }, 42); | 47 }, 42); |
29 | 48 |
49 | |
50 assertEquals(42, (() => { | |
51 for (var x of g()) { return 42; } | |
52 })()); | |
53 | |
30 assertEquals(42, (() => { | 54 assertEquals(42, (() => { |
31 for (let x of g()) { return 42; } | 55 for (let x of g()) { return 42; } |
32 })()); | 56 })()); |
33 | 57 |
34 assertEquals(42, (() => { | 58 assertEquals(42, (() => { |
59 for (const x of g()) { return 42; } | |
60 })()); | |
61 | |
62 assertEquals(42, (() => { | |
35 for (x of g()) { return 42; } | 63 for (x of g()) { return 42; } |
36 })()); | 64 })()); |
37 | 65 |
66 | |
67 assertEquals(42, eval('for (var x of g()) { x; }')); | |
68 | |
38 assertEquals(42, eval('for (let x of g()) { x; }')); | 69 assertEquals(42, eval('for (let x of g()) { x; }')); |
39 | 70 |
40 assertEquals(42, eval('for (let x of g()) { x; }')); | 71 assertEquals(42, eval('for (const x of g()) { x; }')); |
72 | |
73 assertEquals(42, eval('for (x of g()) { x; }')); | |
74 | |
75 | |
76 assertEquals(42, (() => { | |
77 var [x] = g(); return x; | |
78 })()); | |
79 | |
80 assertEquals(42, (() => { | |
81 let [x] = g(); return x; | |
82 })()); | |
83 | |
84 assertEquals(42, (() => { | |
85 const [x] = g(); return x; | |
86 })()); | |
87 | |
88 assertEquals(42, (() => { | |
89 [x] = g(); return x; | |
90 })()); | |
41 } | 91 } |
42 | 92 |
43 | 93 |
44 // Return method is not callable. | 94 // Return method is not callable. |
45 { | 95 { |
46 g.prototype.return = 666; | 96 g.prototype.return = 666; |
47 | 97 |
98 | |
99 assertThrows(() => { | |
100 for (var x of g()) { break; } | |
101 }, TypeError); | |
102 | |
48 assertThrows(() => { | 103 assertThrows(() => { |
49 for (let x of g()) { break; } | 104 for (let x of g()) { break; } |
50 }, TypeError); | 105 }, TypeError); |
51 | 106 |
52 assertThrows(() => { | 107 assertThrows(() => { |
108 for (const x of g()) { break; } | |
109 }, TypeError); | |
110 | |
111 assertThrows(() => { | |
53 for (x of g()) { break; } | 112 for (x of g()) { break; } |
54 }, TypeError); | 113 }, TypeError); |
55 | 114 |
115 | |
116 assertThrows(() => { | |
117 for (var x of g()) { throw 666; } | |
118 }, TypeError); | |
119 | |
56 assertThrows(() => { | 120 assertThrows(() => { |
57 for (let x of g()) { throw 666; } | 121 for (let x of g()) { throw 666; } |
58 }, TypeError); | 122 }, TypeError); |
59 | 123 |
60 assertThrows(() => { | 124 assertThrows(() => { |
125 for (const x of g()) { throw 666; } | |
126 }, TypeError); | |
127 | |
128 assertThrows(() => { | |
61 for (x of g()) { throw 666; } | 129 for (x of g()) { throw 666; } |
62 }, TypeError); | 130 }, TypeError); |
63 | 131 |
132 | |
133 assertThrows(() => { | |
134 for (var x of g()) { return 666; } | |
135 }, TypeError); | |
136 | |
64 assertThrows(() => { | 137 assertThrows(() => { |
65 for (let x of g()) { return 666; } | 138 for (let x of g()) { return 666; } |
66 }, TypeError); | 139 }, TypeError); |
67 | 140 |
68 assertThrows(() => { | 141 assertThrows(() => { |
142 for (const x of g()) { return 666; } | |
143 }, TypeError); | |
144 | |
145 assertThrows(() => { | |
69 for (x of g()) { return 666; } | 146 for (x of g()) { return 666; } |
70 }, TypeError); | 147 }, TypeError); |
71 | 148 |
149 | |
150 assertEquals(42, eval('for (var x of g()) { x; }')); | |
151 | |
72 assertEquals(42, eval('for (let x of g()) { x; }')); | 152 assertEquals(42, eval('for (let x of g()) { x; }')); |
73 | 153 |
74 assertEquals(42, eval('for (let x of g()) { x; }')); | 154 assertEquals(42, eval('for (const x of g()) { x; }')); |
155 | |
156 assertEquals(42, eval('for (x of g()) { x; }')); | |
157 | |
158 | |
159 assertThrows(() => { | |
160 var [x] = g(); return x; | |
161 }, TypeError); | |
162 | |
163 assertThrows(() => { | |
164 let [x] = g(); return x; | |
165 }, TypeError); | |
166 | |
167 assertThrows(() => { | |
168 const [x] = g(); return x; | |
169 }, TypeError); | |
170 | |
171 assertThrows(() => { | |
172 [x] = g(); return x; | |
173 }, TypeError); | |
75 } | 174 } |
76 | 175 |
77 | 176 |
78 // Return method does not return an object. | 177 // Return method does not return an object. |
79 { | 178 { |
80 g.prototype.return = () => 666; | 179 g.prototype.return = () => 666; |
81 | 180 |
181 | |
182 assertThrows(() => { | |
183 for (var x of g()) { break; } | |
184 }, TypeError); | |
185 | |
82 assertThrows(() => { | 186 assertThrows(() => { |
83 for (let x of g()) { break; } | 187 for (let x of g()) { break; } |
84 }, TypeError); | 188 }, TypeError); |
85 | 189 |
86 assertThrows(() => { | 190 assertThrows(() => { |
191 for (const x of g()) { break; } | |
192 }, TypeError); | |
193 | |
194 assertThrows(() => { | |
87 for (x of g()) { break; } | 195 for (x of g()) { break; } |
88 }, TypeError); | 196 }, TypeError); |
89 | 197 |
198 | |
90 // Throw from the body of a for loop 'wins' vs throw | 199 // Throw from the body of a for loop 'wins' vs throw |
91 // originating from a bad 'return' value. | 200 // originating from a bad 'return' value. |
201 | |
202 assertThrowsEquals(() => { | |
203 for (var x of g()) { throw 666; } | |
204 }, 666); | |
205 | |
92 assertThrowsEquals(() => { | 206 assertThrowsEquals(() => { |
93 for (let x of g()) { throw 666; } | 207 for (let x of g()) { throw 666; } |
94 }, 666); | 208 }, 666); |
95 | 209 |
96 assertThrowsEquals(() => { | 210 assertThrowsEquals(() => { |
211 for (const x of g()) { throw 666; } | |
212 }, 666); | |
213 | |
214 assertThrowsEquals(() => { | |
97 for (x of g()) { throw 666; } | 215 for (x of g()) { throw 666; } |
98 }, 666); | 216 }, 666); |
99 | 217 |
218 | |
219 assertThrows(() => { | |
220 for (var x of g()) { return 666; } | |
221 }, TypeError); | |
222 | |
100 assertThrows(() => { | 223 assertThrows(() => { |
101 for (let x of g()) { return 666; } | 224 for (let x of g()) { return 666; } |
102 }, TypeError); | 225 }, TypeError); |
103 | 226 |
104 assertThrows(() => { | 227 assertThrows(() => { |
228 for (const x of g()) { return 666; } | |
229 }, TypeError); | |
230 | |
231 assertThrows(() => { | |
105 for (x of g()) { return 666; } | 232 for (x of g()) { return 666; } |
106 }, TypeError); | 233 }, TypeError); |
107 | 234 |
235 | |
236 assertEquals(42, eval('for (var x of g()) { x; }')); | |
237 | |
108 assertEquals(42, eval('for (let x of g()) { x; }')); | 238 assertEquals(42, eval('for (let x of g()) { x; }')); |
109 | 239 |
240 assertEquals(42, eval('for (const x of g()) { x; }')); | |
241 | |
110 assertEquals(42, eval('for (x of g()) { x; }')); | 242 assertEquals(42, eval('for (x of g()) { x; }')); |
243 | |
244 | |
245 assertThrows(() => { | |
246 var [x] = g(); return x; | |
247 }, TypeError); | |
248 | |
249 assertThrows(() => { | |
250 let [x] = g(); return x; | |
251 }, TypeError); | |
252 | |
253 assertThrows(() => { | |
254 const [x] = g(); return x; | |
255 }, TypeError); | |
256 | |
257 assertThrows(() => { | |
258 [x] = g(); return x; | |
259 }, TypeError); | |
111 } | 260 } |
112 | 261 |
113 | 262 |
114 // Return method returns an object. | 263 // Return method returns an object. |
115 { | 264 { |
116 let log = []; | 265 let log = []; |
117 g.prototype.return = (...args) => { log.push(args); return {} }; | 266 g.prototype.return = (...args) => { log.push(args); return {} }; |
118 | 267 |
268 | |
269 log = []; | |
270 for (var x of g()) { break; } | |
271 assertEquals([[]], log); | |
272 | |
119 log = []; | 273 log = []; |
120 for (let x of g()) { break; } | 274 for (let x of g()) { break; } |
121 assertEquals([[]], log); | 275 assertEquals([[]], log); |
122 | 276 |
123 log = []; | 277 log = []; |
278 for (const x of g()) { break; } | |
279 assertEquals([[]], log); | |
280 | |
281 log = []; | |
124 for (x of g()) { break; } | 282 for (x of g()) { break; } |
125 assertEquals([[]], log); | 283 assertEquals([[]], log); |
126 | 284 |
285 | |
286 log = []; | |
287 assertThrowsEquals(() => { | |
288 for (var x of g()) { throw 42; } | |
289 }, 42); | |
290 assertEquals([[]], log); | |
291 | |
127 log = []; | 292 log = []; |
128 assertThrowsEquals(() => { | 293 assertThrowsEquals(() => { |
129 for (let x of g()) { throw 42; } | 294 for (let x of g()) { throw 42; } |
130 }, 42); | 295 }, 42); |
131 assertEquals([[]], log); | 296 assertEquals([[]], log); |
132 | 297 |
133 log = []; | 298 log = []; |
134 assertThrowsEquals(() => { | 299 assertThrowsEquals(() => { |
300 for (const x of g()) { throw 42; } | |
301 }, 42); | |
302 assertEquals([[]], log); | |
303 | |
304 log = []; | |
305 assertThrowsEquals(() => { | |
135 for (x of g()) { throw 42; } | 306 for (x of g()) { throw 42; } |
136 }, 42); | 307 }, 42); |
137 assertEquals([[]], log); | 308 assertEquals([[]], log); |
138 | 309 |
310 | |
311 log = []; | |
312 assertEquals(42, (() => { | |
313 for (var x of g()) { return 42; } | |
314 })()); | |
315 assertEquals([[]], log); | |
316 | |
139 log = []; | 317 log = []; |
140 assertEquals(42, (() => { | 318 assertEquals(42, (() => { |
141 for (let x of g()) { return 42; } | 319 for (let x of g()) { return 42; } |
142 })()); | 320 })()); |
143 assertEquals([[]], log); | 321 assertEquals([[]], log); |
144 | 322 |
145 log = []; | 323 log = []; |
146 assertEquals(42, (() => { | 324 assertEquals(42, (() => { |
325 for (const x of g()) { return 42; } | |
326 })()); | |
327 assertEquals([[]], log); | |
328 | |
329 log = []; | |
330 assertEquals(42, (() => { | |
147 for (x of g()) { return 42; } | 331 for (x of g()) { return 42; } |
148 })()); | 332 })()); |
149 assertEquals([[]], log); | 333 assertEquals([[]], log); |
150 | 334 |
335 | |
336 log = []; | |
337 assertEquals(42, eval('for (var x of g()) { x; }')); | |
338 assertEquals([], log); | |
339 | |
151 log = []; | 340 log = []; |
152 assertEquals(42, eval('for (let x of g()) { x; }')); | 341 assertEquals(42, eval('for (let x of g()) { x; }')); |
153 assertEquals([], log); | 342 assertEquals([], log); |
154 | 343 |
155 log = []; | 344 log = []; |
345 assertEquals(42, eval('for (const x of g()) { x; }')); | |
346 assertEquals([], log); | |
347 | |
348 log = []; | |
156 assertEquals(42, eval('for (x of g()) { x; }')); | 349 assertEquals(42, eval('for (x of g()) { x; }')); |
157 assertEquals([], log); | 350 assertEquals([], log); |
158 | 351 |
352 | |
159 // Even if doing the assignment throws, still call return | 353 // Even if doing the assignment throws, still call return |
354 log = []; | |
160 x = { set attr(_) { throw 1234; } }; | 355 x = { set attr(_) { throw 1234; } }; |
161 assertThrowsEquals(() => { | 356 assertThrowsEquals(() => { |
162 for (x.attr of g()) { throw 456; } | 357 for (x.attr of g()) { throw 456; } |
163 }, 1234); | 358 }, 1234); |
164 assertEquals([[]], log); | 359 assertEquals([[]], log); |
360 | |
361 | |
362 log = []; | |
363 assertEquals(42, (() => { | |
364 var [x] = g(); return x; | |
365 })()); | |
366 assertEquals([[]], log); | |
367 | |
368 log = []; | |
369 assertEquals(42, (() => { | |
370 let [x] = g(); return x; | |
371 })()); | |
372 assertEquals([[]], log); | |
373 | |
374 log = []; | |
375 assertEquals(42, (() => { | |
376 const [x] = g(); return x; | |
377 })()); | |
378 assertEquals([[]], log); | |
379 | |
380 log = []; | |
381 assertEquals(42, (() => { | |
382 [x] = g(); return x; | |
383 })()); | |
384 assertEquals([[]], log); | |
385 | |
386 | |
387 log = []; | |
388 assertEquals(42, (() => { | |
389 var [x,] = g(); return x; | |
390 })()); | |
391 assertEquals([[]], log); | |
392 | |
393 log = []; | |
394 assertEquals(42, (() => { | |
395 let [x,] = g(); return x; | |
396 })()); | |
397 assertEquals([[]], log); | |
398 | |
399 log = []; | |
400 assertEquals(42, (() => { | |
401 const [x,] = g(); return x; | |
402 })()); | |
403 assertEquals([[]], log); | |
404 | |
405 log = []; | |
406 assertEquals(42, (() => { | |
407 [x,] = g(); return x; | |
408 })()); | |
409 assertEquals([[]], log); | |
410 | |
411 | |
412 log = []; | |
413 assertEquals(42, (() => { | |
414 var [x,,] = g(); return x; | |
415 })()); | |
416 assertEquals([], log); | |
417 | |
418 log = []; | |
419 assertEquals(42, (() => { | |
420 let [x,,] = g(); return x; | |
421 })()); | |
422 assertEquals([], log); | |
423 | |
424 log = []; | |
425 assertEquals(42, (() => { | |
426 const [x,,] = g(); return x; | |
427 })()); | |
428 assertEquals([], log); | |
429 | |
430 log = []; | |
431 assertEquals(42, (() => { | |
432 [x,,] = g(); return x; | |
433 })()); | |
434 assertEquals([], log); | |
435 | |
436 | |
437 log = []; | |
438 assertEquals([42, undefined], (() => { | |
439 var [x, y] = g(); return [x, y]; | |
440 })()); | |
441 assertEquals([], log); | |
442 | |
443 log = []; | |
444 assertEquals([42, undefined], (() => { | |
445 let [x, y] = g(); return [x, y]; | |
446 })()); | |
447 assertEquals([], log); | |
448 | |
449 log = []; | |
450 assertEquals([42, undefined], (() => { | |
451 const [x, y] = g(); return [x, y]; | |
452 })()); | |
453 assertEquals([], log); | |
454 | |
455 log = []; | |
456 assertEquals([42, undefined], (() => { | |
457 [x, y] = g(); return [x, y]; | |
458 })()); | |
459 assertEquals([], log); | |
460 | |
461 | |
462 log = []; | |
463 assertEquals([42], (() => { | |
464 var [...x] = g(); return x; | |
465 })()); | |
466 assertEquals([], log); | |
467 | |
468 log = []; | |
469 assertEquals([42], (() => { | |
470 let [...x] = g(); return x; | |
471 })()); | |
472 assertEquals([], log); | |
473 | |
474 log = []; | |
475 assertEquals([42], (() => { | |
476 const [...x] = g(); return x; | |
477 })()); | |
478 assertEquals([], log); | |
479 | |
480 log = []; | |
481 assertEquals([42], (() => { | |
482 [...x] = g(); return x; | |
483 })()); | |
484 assertEquals([], log); | |
485 | |
486 | |
487 log = []; | |
488 assertEquals([42, []], (() => { | |
489 var [x, ...y] = g(); return [x, y]; | |
490 })()); | |
491 assertEquals([], log); | |
492 | |
493 log = []; | |
494 assertEquals([42, []], (() => { | |
495 let [x, ...y] = g(); return [x, y]; | |
496 })()); | |
497 assertEquals([], log); | |
498 | |
499 log = []; | |
500 assertEquals([42, []], (() => { | |
501 const [x, ...y] = g(); return [x, y]; | |
502 })()); | |
503 assertEquals([], log); | |
504 | |
505 log = []; | |
506 assertEquals([42, []], (() => { | |
507 [x, ...y] = g(); return [x, y]; | |
508 })()); | |
509 assertEquals([], log); | |
510 | |
511 | |
512 log = []; | |
513 assertEquals([], (() => { | |
514 var [] = g(); return []; | |
515 })()); | |
516 assertEquals([[]], log); | |
517 | |
518 log = []; | |
519 assertEquals([], (() => { | |
520 let [] = g(); return []; | |
521 })()); | |
522 assertEquals([[]], log); | |
523 | |
524 log = []; | |
525 assertEquals([], (() => { | |
526 const [] = g(); return []; | |
527 })()); | |
528 assertEquals([[]], log); | |
529 | |
530 log = []; | |
531 assertEquals([], (() => { | |
532 [] = g(); return []; | |
533 })()); | |
534 assertEquals([[]], log); | |
535 | |
536 | |
537 log = []; | |
538 assertEquals([], (() => { | |
539 var [...[]] = g(); return []; | |
540 })()); | |
541 assertEquals([], log); | |
542 | |
543 log = []; | |
544 assertEquals([], (() => { | |
545 let [...[]] = g(); return []; | |
546 })()); | |
547 assertEquals([], log); | |
548 | |
549 log = []; | |
550 assertEquals([], (() => { | |
551 const [...[]] = g(); return []; | |
552 })()); | |
553 assertEquals([], log); | |
554 | |
555 log = []; | |
556 assertEquals([], (() => { | |
557 [...[]] = g(); return []; | |
558 })()); | |
559 assertEquals([], log); | |
560 | |
561 | |
562 log = []; | |
563 assertEquals([42], (() => { | |
564 var [...[x]] = g(); return [x]; | |
565 })()); | |
566 assertEquals([], log); | |
567 | |
568 log = []; | |
569 assertEquals([42], (() => { | |
570 let [...[x]] = g(); return [x]; | |
571 })()); | |
572 assertEquals([], log); | |
573 | |
574 log = []; | |
575 assertEquals([42], (() => { | |
576 const [...[x]] = g(); return [x]; | |
577 })()); | |
578 assertEquals([], log); | |
579 | |
580 log = []; | |
581 assertEquals([42], (() => { | |
582 [...[x]] = g(); return [x]; | |
583 })()); | |
584 assertEquals([], log); | |
585 | |
586 | |
587 log = []; | |
588 assertEquals([42, undefined], (() => { | |
589 var [...[x, y]] = g(); return [x, y]; | |
590 })()); | |
591 assertEquals([], log); | |
592 | |
593 log = []; | |
594 assertEquals([42, undefined], (() => { | |
595 let [...[x, y]] = g(); return [x, y]; | |
596 })()); | |
597 assertEquals([], log); | |
598 | |
599 log = []; | |
600 assertEquals([42, undefined], (() => { | |
601 const [...[x, y]] = g(); return [x, y]; | |
602 })()); | |
603 assertEquals([], log); | |
604 | |
605 log = []; | |
606 assertEquals([42, undefined], (() => { | |
607 [...[x, y]] = g(); return [x, y]; | |
608 })()); | |
609 assertEquals([], log); | |
165 } | 610 } |
166 | 611 |
167 | 612 |
168 // Return method throws. | 613 // Return method throws. |
169 { | 614 { |
170 let log = []; | 615 let log = []; |
171 g.prototype.return = (...args) => { log.push(args); throw 23 }; | 616 g.prototype.return = (...args) => { log.push(args); throw 23 }; |
172 | 617 |
618 | |
619 log = []; | |
620 assertThrowsEquals(() => { | |
621 for (var x of g()) { break; } | |
622 }, 23); | |
623 assertEquals([[]], log); | |
624 | |
173 log = []; | 625 log = []; |
174 assertThrowsEquals(() => { | 626 assertThrowsEquals(() => { |
175 for (let x of g()) { break; } | 627 for (let x of g()) { break; } |
176 }, 23); | 628 }, 23); |
177 assertEquals([[]], log); | 629 assertEquals([[]], log); |
178 | 630 |
179 log = []; | 631 log = []; |
180 assertThrowsEquals(() => { | 632 assertThrowsEquals(() => { |
633 for (const x of g()) { break; } | |
634 }, 23); | |
635 assertEquals([[]], log); | |
636 | |
637 log = []; | |
638 assertThrowsEquals(() => { | |
181 for (x of g()) { break; } | 639 for (x of g()) { break; } |
182 }, 23); | 640 }, 23); |
183 assertEquals([[]], log); | 641 assertEquals([[]], log); |
184 | 642 |
643 | |
644 log = []; | |
645 assertThrowsEquals(() => { | |
646 for (var x of g()) { throw 42; } | |
647 }, 42); | |
648 assertEquals([[]], log); | |
649 | |
185 log = []; | 650 log = []; |
186 assertThrowsEquals(() => { | 651 assertThrowsEquals(() => { |
187 for (let x of g()) { throw 42; } | 652 for (let x of g()) { throw 42; } |
188 }, 42); | 653 }, 42); |
189 assertEquals([[]], log); | 654 assertEquals([[]], log); |
190 | 655 |
191 log = []; | 656 log = []; |
192 assertThrowsEquals(() => { | 657 assertThrowsEquals(() => { |
658 for (const x of g()) { throw 42; } | |
659 }, 42); | |
660 assertEquals([[]], log); | |
661 | |
662 log = []; | |
663 assertThrowsEquals(() => { | |
193 for (x of g()) { throw 42; } | 664 for (x of g()) { throw 42; } |
194 }, 42); | 665 }, 42); |
195 assertEquals([[]], log); | 666 assertEquals([[]], log); |
196 | 667 |
668 | |
669 log = []; | |
670 assertThrowsEquals(() => { | |
671 for (var x of g()) { return 42; } | |
672 }, 23); | |
673 assertEquals([[]], log); | |
674 | |
197 log = []; | 675 log = []; |
198 assertThrowsEquals(() => { | 676 assertThrowsEquals(() => { |
199 for (let x of g()) { return 42; } | 677 for (let x of g()) { return 42; } |
200 }, 23); | 678 }, 23); |
201 assertEquals([[]], log); | 679 assertEquals([[]], log); |
202 | 680 |
203 log = []; | 681 log = []; |
204 assertThrowsEquals(() => { | 682 assertThrowsEquals(() => { |
683 for (const x of g()) { return 42; } | |
684 }, 23); | |
685 assertEquals([[]], log); | |
686 | |
687 log = []; | |
688 assertThrowsEquals(() => { | |
205 for (x of g()) { return 42; } | 689 for (x of g()) { return 42; } |
206 }, 23); | 690 }, 23); |
207 assertEquals([[]], log); | 691 assertEquals([[]], log); |
208 | 692 |
693 | |
694 log = []; | |
695 assertEquals(42, eval('for (var x of g()) { x; }')); | |
696 assertEquals([], log); | |
697 | |
209 log = []; | 698 log = []; |
210 assertEquals(42, eval('for (let x of g()) { x; }')); | 699 assertEquals(42, eval('for (let x of g()) { x; }')); |
211 assertEquals([], log); | 700 assertEquals([], log); |
212 | 701 |
213 log = []; | 702 log = []; |
703 assertEquals(42, eval('for (const x of g()) { x; }')); | |
704 assertEquals([], log); | |
705 | |
706 log = []; | |
214 assertEquals(42, eval('for (x of g()) { x; }')); | 707 assertEquals(42, eval('for (x of g()) { x; }')); |
215 assertEquals([], log); | 708 assertEquals([], log); |
709 | |
710 log = []; | |
711 assertThrowsEquals(() => { | |
712 var [x] = g(); return x; | |
713 }, 23); | |
714 assertEquals([[]], log); | |
715 | |
716 log = []; | |
717 assertThrowsEquals(() => { | |
718 let [x] = g(); return x; | |
719 }, 23); | |
720 assertEquals([[]], log); | |
721 | |
722 log = []; | |
723 assertThrowsEquals(() => { | |
724 const [x] = g(); return x; | |
725 }, 23); | |
726 assertEquals([[]], log); | |
727 | |
728 log = []; | |
729 assertThrowsEquals(x => { | |
730 [x] = g(); return x; | |
731 }, 23); | |
732 assertEquals([[]], log); | |
216 } | 733 } |
217 | 734 |
218 | 735 |
219 // Next method throws. | 736 // Next method throws. |
220 { | 737 { |
221 g.prototype.next = () => { throw 666; }; | 738 g.prototype.next = () => { throw 666; }; |
222 g.prototype.return = () => { assertUnreachable() }; | 739 g.prototype.return = () => { assertUnreachable() }; |
223 | 740 |
741 | |
742 assertThrowsEquals(() => { | |
743 for (var x of g()) {} | |
744 }, 666); | |
745 | |
224 assertThrowsEquals(() => { | 746 assertThrowsEquals(() => { |
225 for (let x of g()) {} | 747 for (let x of g()) {} |
226 }, 666); | 748 }, 666); |
227 | 749 |
228 assertThrowsEquals(() => { | 750 assertThrowsEquals(() => { |
751 for (const x of g()) {} | |
752 }, 666); | |
753 | |
754 assertThrowsEquals(() => { | |
229 for (x of g()) {} | 755 for (x of g()) {} |
230 }, 666); | 756 }, 666); |
231 } | 757 } |
232 | 758 |
233 | 759 |
234 // Nested loops. | 760 // Nested loops. |
235 { | 761 { |
236 function* g1() { yield 1; yield 2; throw 3; } | 762 function* g1() { yield 1; yield 2; throw 3; } |
237 function* g2() { yield -1; yield -2; throw -3; } | 763 function* g2() { yield -1; yield -2; throw -3; } |
238 | 764 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
364 for (let x of g1()) { | 890 for (let x of g1()) { |
365 try { | 891 try { |
366 for (let y of g2()) { | 892 for (let y of g2()) { |
367 } | 893 } |
368 } catch (_) {} | 894 } catch (_) {} |
369 if (x == 2) break; | 895 if (x == 2) break; |
370 } | 896 } |
371 }, 5); | 897 }, 5); |
372 assertEquals([1], log); | 898 assertEquals([1], log); |
373 } | 899 } |
OLD | NEW |