blob: 09e01533077b6bd5b2d4860584c63149be42d07d [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001// 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
3// found in the LICENSE file.
4
5// Flags: --harmony-iterator-close
6
Ben Murdochda12d292016-06-02 14:46:10 +01007
Ben Murdoch097c5b22016-05-18 11:27:45 +01008function* g() { yield 42; return 88 };
9
10
11// Return method is "undefined".
12{
13 g.prototype.return = null;
14
Ben Murdochda12d292016-06-02 14:46:10 +010015
16 assertEquals(undefined, (() => {
17 for (var x of g()) { break; }
18 })());
19
Ben Murdoch097c5b22016-05-18 11:27:45 +010020 assertEquals(undefined, (() => {
21 for (let x of g()) { break; }
22 })());
23
24 assertEquals(undefined, (() => {
Ben Murdochda12d292016-06-02 14:46:10 +010025 for (const x of g()) { break; }
26 })());
27
28 assertEquals(undefined, (() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +010029 for (x of g()) { break; }
30 })());
31
Ben Murdochda12d292016-06-02 14:46:10 +010032
33 assertThrowsEquals(() => {
34 for (var x of g()) { throw 42; }
35 }, 42);
36
Ben Murdoch097c5b22016-05-18 11:27:45 +010037 assertThrowsEquals(() => {
38 for (let x of g()) { throw 42; }
39 }, 42);
40
41 assertThrowsEquals(() => {
Ben Murdochda12d292016-06-02 14:46:10 +010042 for (const x of g()) { throw 42; }
43 }, 42);
44
45 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +010046 for (x of g()) { throw 42; }
47 }, 42);
48
Ben Murdochda12d292016-06-02 14:46:10 +010049
50 assertEquals(42, (() => {
51 for (var x of g()) { return 42; }
52 })());
53
Ben Murdoch097c5b22016-05-18 11:27:45 +010054 assertEquals(42, (() => {
55 for (let x of g()) { return 42; }
56 })());
57
58 assertEquals(42, (() => {
Ben Murdochda12d292016-06-02 14:46:10 +010059 for (const x of g()) { return 42; }
60 })());
61
62 assertEquals(42, (() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +010063 for (x of g()) { return 42; }
64 })());
65
Ben Murdochda12d292016-06-02 14:46:10 +010066
67 assertEquals(42, eval('for (var x of g()) { x; }'));
Ben Murdoch097c5b22016-05-18 11:27:45 +010068
69 assertEquals(42, eval('for (let x of g()) { x; }'));
Ben Murdochda12d292016-06-02 14:46:10 +010070
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 })());
91
92 assertEquals(42,
93 (([x]) => x)(g())
94 );
Ben Murdoch097c5b22016-05-18 11:27:45 +010095}
96
97
98// Return method is not callable.
99{
100 g.prototype.return = 666;
101
Ben Murdochda12d292016-06-02 14:46:10 +0100102
103 assertThrows(() => {
104 for (var x of g()) { break; }
105 }, TypeError);
106
Ben Murdoch097c5b22016-05-18 11:27:45 +0100107 assertThrows(() => {
108 for (let x of g()) { break; }
109 }, TypeError);
110
111 assertThrows(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100112 for (const x of g()) { break; }
113 }, TypeError);
114
115 assertThrows(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100116 for (x of g()) { break; }
117 }, TypeError);
118
Ben Murdochda12d292016-06-02 14:46:10 +0100119
120 assertThrows(() => {
121 for (var x of g()) { throw 666; }
122 }, TypeError);
123
Ben Murdoch097c5b22016-05-18 11:27:45 +0100124 assertThrows(() => {
125 for (let x of g()) { throw 666; }
126 }, TypeError);
127
128 assertThrows(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100129 for (const x of g()) { throw 666; }
130 }, TypeError);
131
132 assertThrows(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100133 for (x of g()) { throw 666; }
134 }, TypeError);
135
Ben Murdochda12d292016-06-02 14:46:10 +0100136
137 assertThrows(() => {
138 for (var x of g()) { return 666; }
139 }, TypeError);
140
Ben Murdoch097c5b22016-05-18 11:27:45 +0100141 assertThrows(() => {
142 for (let x of g()) { return 666; }
143 }, TypeError);
144
145 assertThrows(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100146 for (const x of g()) { return 666; }
147 }, TypeError);
148
149 assertThrows(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100150 for (x of g()) { return 666; }
151 }, TypeError);
152
Ben Murdochda12d292016-06-02 14:46:10 +0100153
154 assertEquals(42, eval('for (var x of g()) { x; }'));
Ben Murdoch097c5b22016-05-18 11:27:45 +0100155
156 assertEquals(42, eval('for (let x of g()) { x; }'));
Ben Murdochda12d292016-06-02 14:46:10 +0100157
158 assertEquals(42, eval('for (const x of g()) { x; }'));
159
160 assertEquals(42, eval('for (x of g()) { x; }'));
161
162
163 assertThrows(() => {
164 var [x] = g(); return x;
165 }, TypeError);
166
167 assertThrows(() => {
168 let [x] = g(); return x;
169 }, TypeError);
170
171 assertThrows(() => {
172 const [x] = g(); return x;
173 }, TypeError);
174
175 assertThrows(() => {
176 [x] = g(); return x;
177 }, TypeError);
178
179 assertThrows(() => {
180 (([x]) => x)(g());
181 }, TypeError);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100182}
183
184
185// Return method does not return an object.
186{
187 g.prototype.return = () => 666;
188
Ben Murdochda12d292016-06-02 14:46:10 +0100189
190 assertThrows(() => {
191 for (var x of g()) { break; }
192 }, TypeError);
193
Ben Murdoch097c5b22016-05-18 11:27:45 +0100194 assertThrows(() => {
195 for (let x of g()) { break; }
196 }, TypeError);
197
198 assertThrows(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100199 for (const x of g()) { break; }
200 }, TypeError);
201
202 assertThrows(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100203 for (x of g()) { break; }
204 }, TypeError);
205
Ben Murdochda12d292016-06-02 14:46:10 +0100206
207 // Throw from the body of a for loop 'wins' vs throw
208 // originating from a bad 'return' value.
209
210 assertThrowsEquals(() => {
211 for (var x of g()) { throw 666; }
212 }, 666);
213
214 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100215 for (let x of g()) { throw 666; }
Ben Murdochda12d292016-06-02 14:46:10 +0100216 }, 666);
217
218 assertThrowsEquals(() => {
219 for (const x of g()) { throw 666; }
220 }, 666);
221
222 assertThrowsEquals(() => {
223 for (x of g()) { throw 666; }
224 }, 666);
225
Ben Murdoch097c5b22016-05-18 11:27:45 +0100226
227 assertThrows(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100228 for (var x of g()) { return 666; }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100229 }, TypeError);
230
231 assertThrows(() => {
232 for (let x of g()) { return 666; }
233 }, TypeError);
234
235 assertThrows(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100236 for (const x of g()) { return 666; }
237 }, TypeError);
238
239 assertThrows(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100240 for (x of g()) { return 666; }
241 }, TypeError);
242
Ben Murdochda12d292016-06-02 14:46:10 +0100243
244 assertEquals(42, eval('for (var x of g()) { x; }'));
245
Ben Murdoch097c5b22016-05-18 11:27:45 +0100246 assertEquals(42, eval('for (let x of g()) { x; }'));
247
Ben Murdochda12d292016-06-02 14:46:10 +0100248 assertEquals(42, eval('for (const x of g()) { x; }'));
249
Ben Murdoch097c5b22016-05-18 11:27:45 +0100250 assertEquals(42, eval('for (x of g()) { x; }'));
Ben Murdochda12d292016-06-02 14:46:10 +0100251
252
253 assertThrows(() => {
254 var [x] = g(); return x;
255 }, TypeError);
256
257 assertThrows(() => {
258 let [x] = g(); return x;
259 }, TypeError);
260
261 assertThrows(() => {
262 const [x] = g(); return x;
263 }, TypeError);
264
265 assertThrows(() => {
266 [x] = g(); return x;
267 }, TypeError);
268
269 assertThrows(() => {
270 (([x]) => x)(g());
271 }, TypeError);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100272}
273
274
275// Return method returns an object.
276{
277 let log = [];
278 g.prototype.return = (...args) => { log.push(args); return {} };
279
Ben Murdochda12d292016-06-02 14:46:10 +0100280
281 log = [];
282 for (var x of g()) { break; }
283 assertEquals([[]], log);
284
Ben Murdoch097c5b22016-05-18 11:27:45 +0100285 log = [];
286 for (let x of g()) { break; }
287 assertEquals([[]], log);
288
289 log = [];
Ben Murdochda12d292016-06-02 14:46:10 +0100290 for (const x of g()) { break; }
291 assertEquals([[]], log);
292
293 log = [];
Ben Murdoch097c5b22016-05-18 11:27:45 +0100294 for (x of g()) { break; }
295 assertEquals([[]], log);
296
Ben Murdochda12d292016-06-02 14:46:10 +0100297
298 log = [];
299 assertThrowsEquals(() => {
300 for (var x of g()) { throw 42; }
301 }, 42);
302 assertEquals([[]], log);
303
Ben Murdoch097c5b22016-05-18 11:27:45 +0100304 log = [];
305 assertThrowsEquals(() => {
306 for (let x of g()) { throw 42; }
307 }, 42);
308 assertEquals([[]], log);
309
310 log = [];
311 assertThrowsEquals(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100312 for (const x of g()) { throw 42; }
313 }, 42);
314 assertEquals([[]], log);
315
316 log = [];
317 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100318 for (x of g()) { throw 42; }
319 }, 42);
320 assertEquals([[]], log);
321
Ben Murdochda12d292016-06-02 14:46:10 +0100322
323 log = [];
324 assertEquals(42, (() => {
325 for (var x of g()) { return 42; }
326 })());
327 assertEquals([[]], log);
328
Ben Murdoch097c5b22016-05-18 11:27:45 +0100329 log = [];
330 assertEquals(42, (() => {
331 for (let x of g()) { return 42; }
332 })());
333 assertEquals([[]], log);
334
335 log = [];
336 assertEquals(42, (() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100337 for (const x of g()) { return 42; }
338 })());
339 assertEquals([[]], log);
340
341 log = [];
342 assertEquals(42, (() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100343 for (x of g()) { return 42; }
344 })());
345 assertEquals([[]], log);
346
Ben Murdochda12d292016-06-02 14:46:10 +0100347
348 log = [];
349 assertEquals(42, eval('for (var x of g()) { x; }'));
350 assertEquals([], log);
351
Ben Murdoch097c5b22016-05-18 11:27:45 +0100352 log = [];
353 assertEquals(42, eval('for (let x of g()) { x; }'));
354 assertEquals([], log);
355
356 log = [];
Ben Murdochda12d292016-06-02 14:46:10 +0100357 assertEquals(42, eval('for (const x of g()) { x; }'));
358 assertEquals([], log);
359
360 log = [];
Ben Murdoch097c5b22016-05-18 11:27:45 +0100361 assertEquals(42, eval('for (x of g()) { x; }'));
362 assertEquals([], log);
Ben Murdochda12d292016-06-02 14:46:10 +0100363
364
365 // Even if doing the assignment throws, still call return
366 log = [];
367 x = { set attr(_) { throw 1234; } };
368 assertThrowsEquals(() => {
369 for (x.attr of g()) { throw 456; }
370 }, 1234);
371 assertEquals([[]], log);
372
373
374 log = [];
375 assertEquals(42, (() => {
376 var [x] = g(); return x;
377 })());
378 assertEquals([[]], log);
379
380 log = [];
381 assertEquals(42, (() => {
382 let [x] = g(); return x;
383 })());
384 assertEquals([[]], log);
385
386 log = [];
387 assertEquals(42, (() => {
388 const [x] = g(); return x;
389 })());
390 assertEquals([[]], log);
391
392 log = [];
393 assertEquals(42, (() => {
394 [x] = g(); return x;
395 })());
396 assertEquals([[]], log);
397
398 log = []
399 assertEquals(42,
400 (([x]) => x)(g())
401 );
402 assertEquals([[]], log);
403
404
405 log = [];
406 assertEquals(42, (() => {
407 var [x,] = g(); return x;
408 })());
409 assertEquals([[]], log);
410
411 log = [];
412 assertEquals(42, (() => {
413 let [x,] = g(); return x;
414 })());
415 assertEquals([[]], log);
416
417 log = [];
418 assertEquals(42, (() => {
419 const [x,] = g(); return x;
420 })());
421 assertEquals([[]], log);
422
423 log = [];
424 assertEquals(42, (() => {
425 [x,] = g(); return x;
426 })());
427 assertEquals([[]], log);
428
429 log = []
430 assertEquals(42,
431 (([x,]) => x)(g())
432 );
433 assertEquals([[]], log);
434
435
436 log = [];
437 assertEquals(42, (() => {
438 var [x,,] = g(); return x;
439 })());
440 assertEquals([], log);
441
442 log = [];
443 assertEquals(42, (() => {
444 let [x,,] = g(); return x;
445 })());
446 assertEquals([], log);
447
448 log = [];
449 assertEquals(42, (() => {
450 const [x,,] = g(); return x;
451 })());
452 assertEquals([], log);
453
454 log = [];
455 assertEquals(42, (() => {
456 [x,,] = g(); return x;
457 })());
458 assertEquals([], log);
459
460 log = []
461 assertEquals(42,
462 (([x,,]) => x)(g())
463 );
464 assertEquals([], log);
465
466
467 log = [];
468 assertEquals([42, undefined], (() => {
469 var [x, y] = g(); return [x, y];
470 })());
471 assertEquals([], log);
472
473 log = [];
474 assertEquals([42, undefined], (() => {
475 let [x, y] = g(); return [x, y];
476 })());
477 assertEquals([], log);
478
479 log = [];
480 assertEquals([42, undefined], (() => {
481 const [x, y] = g(); return [x, y];
482 })());
483 assertEquals([], log);
484
485 log = [];
486 assertEquals([42, undefined], (() => {
487 [x, y] = g(); return [x, y];
488 })());
489 assertEquals([], log);
490
491 log = []
492 assertEquals([42, undefined],
493 (([x, y]) => [x, y])(g())
494 );
495 assertEquals([], log);
496
497
498 log = [];
499 assertEquals([42], (() => {
500 var [...x] = g(); return x;
501 })());
502 assertEquals([], log);
503
504 log = [];
505 assertEquals([42], (() => {
506 let [...x] = g(); return x;
507 })());
508 assertEquals([], log);
509
510 log = [];
511 assertEquals([42], (() => {
512 const [...x] = g(); return x;
513 })());
514 assertEquals([], log);
515
516 log = [];
517 assertEquals([42], (() => {
518 [...x] = g(); return x;
519 })());
520 assertEquals([], log);
521
522 log = []
523 assertEquals([42],
524 (([...x]) => x)(g())
525 );
526 assertEquals([], log);
527
528
529 log = [];
530 assertEquals([42, []], (() => {
531 var [x, ...y] = g(); return [x, y];
532 })());
533 assertEquals([], log);
534
535 log = [];
536 assertEquals([42, []], (() => {
537 let [x, ...y] = g(); return [x, y];
538 })());
539 assertEquals([], log);
540
541 log = [];
542 assertEquals([42, []], (() => {
543 const [x, ...y] = g(); return [x, y];
544 })());
545 assertEquals([], log);
546
547 log = [];
548 assertEquals([42, []], (() => {
549 [x, ...y] = g(); return [x, y];
550 })());
551 assertEquals([], log);
552
553 log = []
554 assertEquals([42, []],
555 (([x, ...y]) => [x, y])(g())
556 );
557 assertEquals([], log);
558
559
560 log = [];
561 assertEquals([], (() => {
562 var [] = g(); return [];
563 })());
564 assertEquals([[]], log);
565
566 log = [];
567 assertEquals([], (() => {
568 let [] = g(); return [];
569 })());
570 assertEquals([[]], log);
571
572 log = [];
573 assertEquals([], (() => {
574 const [] = g(); return [];
575 })());
576 assertEquals([[]], log);
577
578 log = [];
579 assertEquals([], (() => {
580 [] = g(); return [];
581 })());
582 assertEquals([[]], log);
583
584 log = []
585 assertEquals([],
586 (([]) => [])(g())
587 );
588 assertEquals([[]], log);
589
590
591 log = [];
592 assertEquals([], (() => {
593 var [...[]] = g(); return [];
594 })());
595 assertEquals([], log);
596
597 log = [];
598 assertEquals([], (() => {
599 let [...[]] = g(); return [];
600 })());
601 assertEquals([], log);
602
603 log = [];
604 assertEquals([], (() => {
605 const [...[]] = g(); return [];
606 })());
607 assertEquals([], log);
608
609 log = [];
610 assertEquals([], (() => {
611 [...[]] = g(); return [];
612 })());
613 assertEquals([], log);
614
615 log = []
616 assertEquals([],
617 (([...[]]) => [])(g())
618 );
619 assertEquals([], log);
620
621
622 log = [];
623 assertEquals([42], (() => {
624 var [...[x]] = g(); return [x];
625 })());
626 assertEquals([], log);
627
628 log = [];
629 assertEquals([42], (() => {
630 let [...[x]] = g(); return [x];
631 })());
632 assertEquals([], log);
633
634 log = [];
635 assertEquals([42], (() => {
636 const [...[x]] = g(); return [x];
637 })());
638 assertEquals([], log);
639
640 log = [];
641 assertEquals([42], (() => {
642 [...[x]] = g(); return [x];
643 })());
644 assertEquals([], log);
645
646 log = []
647 assertEquals([42],
648 (([...[x]]) => [x])(g())
649 );
650 assertEquals([], log);
651
652
653 log = [];
654 assertEquals([42, undefined], (() => {
655 var [...[x, y]] = g(); return [x, y];
656 })());
657 assertEquals([], log);
658
659 log = [];
660 assertEquals([42, undefined], (() => {
661 let [...[x, y]] = g(); return [x, y];
662 })());
663 assertEquals([], log);
664
665 log = [];
666 assertEquals([42, undefined], (() => {
667 const [...[x, y]] = g(); return [x, y];
668 })());
669 assertEquals([], log);
670
671 log = [];
672 assertEquals([42, undefined], (() => {
673 [...[x, y]] = g(); return [x, y];
674 })());
675 assertEquals([], log);
676
677 log = []
678 assertEquals([42, undefined],
679 (([...[x, y]]) => [x, y])(g())
680 );
681 assertEquals([], log);
682
683
684 log = []
685 assertThrowsEquals(() => {
686 let x = { set foo(_) { throw 666; } };
687 [x.foo] = g();
688 }, 666);
689 assertEquals([[]], log);
690
691
692 log = []
693 assertThrows(() => {
694 var [[]] = g();
695 }, TypeError);
696 assertEquals([[]], log);
697
698 log = []
699 assertThrows(() => {
700 let [[]] = g();
701 }, TypeError);
702 assertEquals([[]], log);
703
704 log = []
705 assertThrows(() => {
706 const [[]] = g();
707 }, TypeError);
708 assertEquals([[]], log);
709
710 log = []
711 assertThrows(() => {
712 [[]] = g();
713 }, TypeError);
714 assertEquals([[]], log);
715
716 log = []
717 assertThrows(() => {
718 (([[]]) => 0)(g());
719 }, TypeError);
720 assertEquals([[]], log);
721
722
723 log = []
724 assertThrows(() => {
725 var [...[[]]] = g();
726 }, TypeError);
727 assertEquals([], log);
728
729 log = []
730 assertThrows(() => {
731 let [...[[]]] = g();
732 }, TypeError);
733 assertEquals([], log);
734
735 log = []
736 assertThrows(() => {
737 const [...[[]]] = g();
738 }, TypeError);
739 assertEquals([], log);
740
741 log = []
742 assertThrows(() => {
743 [...[[]]] = g();
744 }, TypeError);
745 assertEquals([], log);
746
747 log = []
748 assertThrows(() => {
749 (([...[[]]]) => 0)(g());
750 }, TypeError);
751 assertEquals([], log);
752
753
754 {
755 let backup = Array.prototype[Symbol.iterator];
756 Array.prototype[Symbol.iterator] = () => g();
757
758
759 log = [];
760 assertDoesNotThrow(() => {
761 var [x, ...[y]] = [1, 2, 3]
762 });
763 assertEquals(log, [[]]);
764
765 log = [];
766 assertDoesNotThrow(() => {
767 let [x, ...[y]] = [1, 2, 3];
768 });
769 assertEquals(log, [[]]);
770
771 log = [];
772 assertDoesNotThrow(() => {
773 const [x, ...[y]] = [1, 2, 3];
774 });
775 assertEquals(log, [[]]);
776
777 log = [];
778 assertDoesNotThrow(() => {
779 (([x, ...[y]]) => {})([1, 2, 3]);
780 });
781 assertEquals(log, [[]]);
782
783
784 log = [];
785 assertThrows(() => {
786 var [x, ...[[]]] = [1, 2, 3];
787 }, TypeError);
788 assertEquals(log, [[]]);
789
790 log = [];
791 assertThrows(() => {
792 let [x, ...[[]]] = [1, 2, 3];
793 }, TypeError);
794 assertEquals(log, [[]]);
795
796 log = [];
797 assertThrows(() => {
798 const [x, ...[[]]] = [1, 2, 3];
799 }, TypeError);
800 assertEquals(log, [[]]);
801
802 log = [];
803 assertThrows(() => {
804 (([x, ...[[]]]) => {})([1, 2, 3]);
805 }, TypeError);
806 assertEquals(log, [[]]);
807
808
809 log = [];
810 assertDoesNotThrow(() => {
811 var [x, ...[...y]] = [1, 2, 3];
812 });
813 assertEquals(log, []);
814
815 log = [];
816 assertDoesNotThrow(() => {
817 let [x, ...[...y]] = [1, 2, 3];
818 });
819 assertEquals(log, []);
820
821 log = [];
822 assertDoesNotThrow(() => {
823 const [x, ...[...y]] = [1, 2, 3];
824 });
825 assertEquals(log, []);
826
827 log = [];
828 assertDoesNotThrow(() => {
829 (([x, ...[...y]]) => {})([1, 2, 3]);
830 });
831 assertEquals(log, []);
832
833
834 Array.prototype[Symbol.iterator] = backup;
835 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100836}
837
838
839// Return method throws.
840{
841 let log = [];
842 g.prototype.return = (...args) => { log.push(args); throw 23 };
843
Ben Murdochda12d292016-06-02 14:46:10 +0100844
845 log = [];
846 assertThrowsEquals(() => {
847 for (var x of g()) { break; }
848 }, 23);
849 assertEquals([[]], log);
850
Ben Murdoch097c5b22016-05-18 11:27:45 +0100851 log = [];
852 assertThrowsEquals(() => {
853 for (let x of g()) { break; }
854 }, 23);
855 assertEquals([[]], log);
856
857 log = [];
858 assertThrowsEquals(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100859 for (const x of g()) { break; }
860 }, 23);
861 assertEquals([[]], log);
862
863 log = [];
864 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100865 for (x of g()) { break; }
866 }, 23);
867 assertEquals([[]], log);
868
Ben Murdochda12d292016-06-02 14:46:10 +0100869
870 log = [];
871 assertThrowsEquals(() => {
872 for (var x of g()) { throw 42; }
873 }, 42);
874 assertEquals([[]], log);
875
Ben Murdoch097c5b22016-05-18 11:27:45 +0100876 log = [];
877 assertThrowsEquals(() => {
878 for (let x of g()) { throw 42; }
879 }, 42);
880 assertEquals([[]], log);
881
882 log = [];
883 assertThrowsEquals(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100884 for (const x of g()) { throw 42; }
885 }, 42);
886 assertEquals([[]], log);
887
888 log = [];
889 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100890 for (x of g()) { throw 42; }
891 }, 42);
892 assertEquals([[]], log);
893
Ben Murdochda12d292016-06-02 14:46:10 +0100894
895 log = [];
896 assertThrowsEquals(() => {
897 for (var x of g()) { return 42; }
898 }, 23);
899 assertEquals([[]], log);
900
Ben Murdoch097c5b22016-05-18 11:27:45 +0100901 log = [];
902 assertThrowsEquals(() => {
903 for (let x of g()) { return 42; }
904 }, 23);
905 assertEquals([[]], log);
906
907 log = [];
908 assertThrowsEquals(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100909 for (const x of g()) { return 42; }
910 }, 23);
911 assertEquals([[]], log);
912
913 log = [];
914 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100915 for (x of g()) { return 42; }
916 }, 23);
917 assertEquals([[]], log);
918
Ben Murdochda12d292016-06-02 14:46:10 +0100919
920 log = [];
921 assertEquals(42, eval('for (var x of g()) { x; }'));
922 assertEquals([], log);
923
Ben Murdoch097c5b22016-05-18 11:27:45 +0100924 log = [];
925 assertEquals(42, eval('for (let x of g()) { x; }'));
926 assertEquals([], log);
927
928 log = [];
Ben Murdochda12d292016-06-02 14:46:10 +0100929 assertEquals(42, eval('for (const x of g()) { x; }'));
930 assertEquals([], log);
931
932 log = [];
Ben Murdoch097c5b22016-05-18 11:27:45 +0100933 assertEquals(42, eval('for (x of g()) { x; }'));
934 assertEquals([], log);
Ben Murdochda12d292016-06-02 14:46:10 +0100935
936
937 log = [];
938 assertThrowsEquals(() => {
939 var [x] = g(); return x;
940 }, 23);
941 assertEquals([[]], log);
942
943 log = [];
944 assertThrowsEquals(() => {
945 let [x] = g(); return x;
946 }, 23);
947 assertEquals([[]], log);
948
949 log = [];
950 assertThrowsEquals(() => {
951 const [x] = g(); return x;
952 }, 23);
953 assertEquals([[]], log);
954
955 log = [];
956 assertThrowsEquals(() => {
957 [x] = g(); return x;
958 }, 23);
959 assertEquals([[]], log);
960
961 log = [];
962 assertThrowsEquals(() => {
963 (([x]) => x)(g())
964 }, 23);
965 assertEquals([[]], log);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100966}
967
968
969// Next method throws.
970{
971 g.prototype.next = () => { throw 666; };
972 g.prototype.return = () => { assertUnreachable() };
973
Ben Murdochda12d292016-06-02 14:46:10 +0100974
975 assertThrowsEquals(() => {
976 for (var x of g()) {}
977 }, 666);
978
Ben Murdoch097c5b22016-05-18 11:27:45 +0100979 assertThrowsEquals(() => {
980 for (let x of g()) {}
981 }, 666);
982
983 assertThrowsEquals(() => {
Ben Murdochda12d292016-06-02 14:46:10 +0100984 for (const x of g()) {}
985 }, 666);
986
987 assertThrowsEquals(() => {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100988 for (x of g()) {}
989 }, 666);
Ben Murdochda12d292016-06-02 14:46:10 +0100990
991 assertThrowsEquals(() => {
992 var [x] = g();
993 }, 666);
994
995 assertThrowsEquals(() => {
996 let [x] = g();
997 }, 666);
998
999 assertThrowsEquals(() => {
1000 const [x] = g();
1001 }, 666);
1002
1003 assertThrowsEquals(() => {
1004 [x] = g();
1005 }, 666);
1006
1007 assertThrowsEquals(() => {
1008 (([x]) => x)(g());
1009 }, 666);
1010}
1011
1012
1013// Value throws.
1014{
1015 g.prototype.next = () => ({get value() {throw 666}});
1016 g.prototype.return = () => { assertUnreachable() };
1017
1018
1019 assertThrowsEquals(() => {
1020 for (var x of g()) {}
1021 }, 666);
1022
1023 assertThrowsEquals(() => {
1024 for (let x of g()) {}
1025 }, 666);
1026
1027 assertThrowsEquals(() => {
1028 for (const x of g()) {}
1029 }, 666);
1030
1031 assertThrowsEquals(() => {
1032 for (x of g()) {}
1033 }, 666);
1034
1035 assertThrowsEquals(() => {
1036 var [x] = g();
1037 }, 666);
1038
1039 assertThrowsEquals(() => {
1040 let [x] = g();
1041 }, 666);
1042
1043 assertThrowsEquals(() => {
1044 const [x] = g();
1045 }, 666);
1046
1047 assertThrowsEquals(() => {
1048 [x] = g();
1049 }, 666);
1050
1051 assertThrowsEquals(() => {
1052 (([x]) => x)(g());
1053 }, 666);
1054}
1055
1056
1057// Done throws.
1058{
1059 g.prototype.next = () => ({get done() {throw 666}});
1060 g.prototype.return = () => { assertUnreachable() };
1061
1062
1063 assertThrowsEquals(() => {
1064 for (var x of g()) {}
1065 }, 666);
1066
1067 assertThrowsEquals(() => {
1068 for (let x of g()) {}
1069 }, 666);
1070
1071 assertThrowsEquals(() => {
1072 for (const x of g()) {}
1073 }, 666);
1074
1075 assertThrowsEquals(() => {
1076 for (x of g()) {}
1077 }, 666);
1078
1079 assertThrowsEquals(() => {
1080 var [x] = g();
1081 }, 666);
1082
1083 assertThrowsEquals(() => {
1084 let [x] = g();
1085 }, 666);
1086
1087 assertThrowsEquals(() => {
1088 const [x] = g();
1089 }, 666);
1090
1091 assertThrowsEquals(() => {
1092 [x] = g();
1093 }, 666);
1094
1095 assertThrowsEquals(() => {
1096 (([x]) => x)(g());
1097 }, 666);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001098}
1099
1100
1101// Nested loops.
1102{
1103 function* g1() { yield 1; yield 2; throw 3; }
1104 function* g2() { yield -1; yield -2; throw -3; }
1105
1106 assertDoesNotThrow(() => {
1107 for (let x of g1()) {
1108 for (let y of g2()) {
1109 if (y == -2) break;
1110 }
1111 if (x == 2) break;
1112 }
1113 }, -3);
1114
1115 assertThrowsEquals(() => {
1116 for (let x of g1()) {
1117 for (let y of g2()) {
1118 }
1119 }
1120 }, -3);
1121
1122 assertThrowsEquals(() => {
1123 for (let x of g1()) {
1124 for (let y of g2()) {
1125 if (y == -2) break;
1126 }
1127 }
1128 }, 3);
1129
1130 assertDoesNotThrow(() => {
1131 l: for (let x of g1()) {
1132 for (let y of g2()) {
1133 if (y == -2) break l;
1134 }
1135 }
1136 });
1137
1138 assertThrowsEquals(() => {
1139 for (let x of g1()) {
1140 for (let y of g2()) {
1141 throw 4;
1142 }
1143 }
1144 }, 4);
1145
1146 assertThrowsEquals(() => {
1147 for (let x of g1()) {
1148 for (let y of g2()) {
1149 if (y == -2) throw 4;
1150 }
1151 }
1152 }, 4);
1153
1154 let log = [];
1155 g1.prototype.return = () => { log.push(1); throw 5 };
1156 g2.prototype.return = () => { log.push(2); throw -5 };
1157
1158 log = [];
1159 assertThrowsEquals(() => {
1160 for (let x of g1()) {
1161 for (let y of g2()) {
1162 if (y == -2) break;
1163 }
1164 if (x == 2) break;
1165 }
1166 }, -5);
1167 assertEquals([2, 1], log);
1168
1169 log = [];
1170 assertThrowsEquals(() => {
1171 for (let x of g1()) {
1172 for (let y of g2()) {
1173 }
1174 }
1175 }, -3);
1176 assertEquals([1], log);
1177
1178 log = [];
1179 assertThrowsEquals(() => {
1180 for (let x of g1()) {
1181 for (let y of g2()) {
1182 if (y == -2) break;
1183 }
1184 }
1185 }, -5);
1186 assertEquals([2, 1], log);
1187
1188 log = [];
1189 assertThrowsEquals(() => {
1190 l: for (let x of g1()) {
1191 for (let y of g2()) {
1192 if (y == -2) break l;
1193 }
1194 }
1195 }, -5);
1196 assertEquals([2, 1], log);
1197
1198 log = [];
1199 assertThrowsEquals(() => {
1200 for (let x of g1()) {
1201 for (let y of g2()) {
1202 throw 4;
1203 }
1204 }
1205 }, 4);
1206 assertEquals([2, 1], log);
1207
1208 log = [];
1209 assertThrowsEquals(() => {
1210 for (let x of g1()) {
1211 for (let y of g2()) {
1212 if (y == -2) throw 4;
1213 }
1214 }
1215 }, 4);
1216 assertEquals([2, 1], log);
1217
1218 log = [];
1219 assertThrowsEquals(() => {
1220 for (let x of g1()) {
1221 try {
1222 for (let y of g2()) {
1223 }
1224 } catch (_) {}
1225 }
1226 }, 3);
1227 assertEquals([], log);
1228
1229 log = [];
1230 assertThrowsEquals(() => {
1231 for (let x of g1()) {
1232 try {
1233 for (let y of g2()) {
1234 }
1235 } catch (_) {}
1236 if (x == 2) break;
1237 }
1238 }, 5);
1239 assertEquals([1], log);
1240}