michael@0: // Test that a deep yield* chain re-yields received results without michael@0: // re-boxing. michael@0: michael@0: function results(results) { michael@0: var i = 0; michael@0: function next() { michael@0: return results[i++]; michael@0: } michael@0: var iter = { next: next }; michael@0: var ret = {}; michael@0: ret[std_iterator] = function () { return iter; } michael@0: return ret; michael@0: } michael@0: michael@0: function* yield_results(expected, n) { michael@0: return yield* n ? yield_results(expected, n - 1) : results(expected); michael@0: } michael@0: michael@0: function collect_results(iterable) { michael@0: var ret = []; michael@0: var result; michael@0: var iter = iterable[std_iterator](); 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: // We have to put a full result for the end, because the return will re-box. michael@0: var expected = [{value: 1}, 13, "foo", {value: 34, done: true}]; michael@0: michael@0: assertDeepEq(expected, collect_results(results(expected))); michael@0: assertDeepEq(expected, collect_results(yield_results(expected, 20))); michael@0: michael@0: if (typeof reportCompare == "function") michael@0: reportCompare(true, true);