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