|
1 // Test that a deep yield* chain re-yields received results without |
|
2 // re-boxing. |
|
3 |
|
4 function results(results) { |
|
5 var i = 0; |
|
6 function next() { |
|
7 return results[i++]; |
|
8 } |
|
9 var iter = { next: next }; |
|
10 var ret = {}; |
|
11 ret[std_iterator] = function () { return iter; } |
|
12 return ret; |
|
13 } |
|
14 |
|
15 function* yield_results(expected, n) { |
|
16 return yield* n ? yield_results(expected, n - 1) : results(expected); |
|
17 } |
|
18 |
|
19 function collect_results(iterable) { |
|
20 var ret = []; |
|
21 var result; |
|
22 var iter = iterable[std_iterator](); |
|
23 do { |
|
24 result = iter.next(); |
|
25 ret.push(result); |
|
26 } while (!result.done); |
|
27 return ret; |
|
28 } |
|
29 |
|
30 // We have to put a full result for the end, because the return will re-box. |
|
31 var expected = [{value: 1}, 13, "foo", {value: 34, done: true}]; |
|
32 |
|
33 assertDeepEq(expected, collect_results(results(expected))); |
|
34 assertDeepEq(expected, collect_results(yield_results(expected, 20))); |
|
35 |
|
36 if (typeof reportCompare == "function") |
|
37 reportCompare(true, true); |