| // Test that yield* can appear in a loop, and inside yield. |
| |
| function* countdown(n) { |
| while (n > 0) { |
| yield (yield* countdown(--n)); |
| } |
| return 34; |
| } |
| |
| function collect_results(iter) { |
| var ret = []; |
| var result; |
| do { |
| result = iter.next(); |
| ret.push(result); |
| } while (!result.done); |
| return ret; |
| } |
| |
| var expected = [ |
| // Only 34 yielded from the "yield" and the last return make it out. |
| // Three yields in countdown(3), two in countdown(2), and one in |
| // countdown(1) (called twice). |
| {value: 34, done: false}, |
| {value: 34, done: false}, |
| {value: 34, done: false}, |
| {value: 34, done: false}, |
| {value: 34, done: false}, |
| {value: 34, done: false}, |
| {value: 34, done: false}, |
| {value: 34, done: true}, // final |
| ]; |
| |
| assertDeepEq(collect_results(countdown(3)), expected); |
| |
| if (typeof reportCompare == "function") |
| reportCompare(true, true); |