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