| // Test that each yield* loop just checks "done", and "value" is only |
| // fetched once at the end. |
| |
| var log = ""; |
| |
| function collect_results(iter) { |
| var ret = []; |
| var result; |
| do { |
| result = iter.next(); |
| ret.push(result); |
| } while (!result.done); |
| return ret; |
| } |
| |
| function Iter(val, count) { |
| function next() { |
| log += 'n'; |
| return { |
| get done() { log += "d"; return count-- == 0; }, |
| get value() { log += "v"; return val; } |
| } |
| } |
| |
| function iterator() { |
| log += 'i'; |
| return this; |
| } |
| |
| this.next = next; |
| this[Symbol.iterator] = iterator; |
| } |
| |
| function* delegate(iter) { return yield* iter; } |
| |
| var inner = new Iter(42, 5); |
| var outer = delegate(inner); |
| |
| // Five values, and one terminal value. |
| outer.next(); |
| outer.next(); |
| outer.next(); |
| outer.next(); |
| outer.next(); |
| outer.next(); |
| |
| assertEq(log, "indndndndndndv"); |
| |
| // Outer's dead, man. Outer's dead. |
| assertDeepEq(outer.next(), {value: undefined, done: true}); |
| |
| // No more checking the iterator. |
| assertEq(log, "indndndndndndv"); |
| |
| if (typeof reportCompare == "function") |
| reportCompare(true, true); |