michael@0: // yield* calls @@iterator on the iterable to produce the iterator. michael@0: michael@0: var log = ''; michael@0: michael@0: function IteratorWrapper(iterator) { michael@0: return { michael@0: next: function (val) { michael@0: log += 'n'; michael@0: return iterator.next(val); michael@0: }, michael@0: michael@0: throw: function (exn) { michael@0: log += 't'; michael@0: return iterator.throw(exn); michael@0: } michael@0: }; michael@0: } michael@0: michael@0: function IterableWrapper(iterable) { michael@0: var ret = {}; michael@0: michael@0: ret[std_iterator] = function () { michael@0: log += 'i'; michael@0: return IteratorWrapper(iterable[std_iterator]()); michael@0: } michael@0: michael@0: return ret; michael@0: } michael@0: michael@0: function* delegate(iter) { return yield* iter; } michael@0: michael@0: var iter = delegate(IterableWrapper([1, 2, 3])); michael@0: assertIteratorNext(iter, 1); michael@0: assertIteratorNext(iter, 2); michael@0: assertIteratorNext(iter, 3); michael@0: assertIteratorDone(iter, undefined); michael@0: michael@0: assertEq(log, 'innnn'); michael@0: michael@0: iter = delegate([1, 2, 3]); michael@0: assertIteratorNext(iter, 1); michael@0: assertIteratorNext(iter, 2); michael@0: assertIteratorNext(iter, 3); michael@0: assertIteratorDone(iter, undefined); michael@0: michael@0: assertEq(log, 'innnn'); michael@0: michael@0: if (typeof reportCompare == "function") michael@0: reportCompare(true, true);