|
1 // Test yield* with iter.next and monkeypatching. |
|
2 |
|
3 function* g(n) { for (var i=0; i<n; i++) yield i; } |
|
4 function* delegate(iter) { return yield* iter; } |
|
5 var GeneratorObjectPrototype = Object.getPrototypeOf(g).prototype; |
|
6 var GeneratorObjectPrototype_next = GeneratorObjectPrototype.next; |
|
7 |
|
8 // Monkeypatch next on an iterator. |
|
9 var inner = g(20); |
|
10 var outer = delegate(inner); |
|
11 assertIteratorNext(outer, 0); |
|
12 assertIteratorNext(outer, 1); |
|
13 inner.next = function() { return 0; }; |
|
14 // 42 yielded directly without re-boxing. |
|
15 assertEq(0, outer.next()); |
|
16 // Outer generator not terminated. |
|
17 assertEq(0, outer.next()); |
|
18 // Restore. |
|
19 inner.next = GeneratorObjectPrototype_next; |
|
20 assertIteratorNext(outer, 2); |
|
21 // Repatch. |
|
22 inner.next = function() { return { value: 42, done: true }; }; |
|
23 assertIteratorDone(outer, 42); |
|
24 |
|
25 // Monkeypunch next on the prototype. |
|
26 var inner = g(20); |
|
27 var outer = delegate(inner); |
|
28 assertIteratorNext(outer, 0); |
|
29 assertIteratorNext(outer, 1); |
|
30 GeneratorObjectPrototype.next = function() { return 0; }; |
|
31 // 42 yielded directly without re-boxing. |
|
32 assertEq(0, GeneratorObjectPrototype_next.call(outer)); |
|
33 // Outer generator not terminated. |
|
34 assertEq(0, GeneratorObjectPrototype_next.call(outer)); |
|
35 // Restore. |
|
36 GeneratorObjectPrototype.next = GeneratorObjectPrototype_next; |
|
37 assertIteratorNext(outer, 2); |
|
38 |
|
39 if (typeof reportCompare == "function") |
|
40 reportCompare(true, true); |