|
1 // Test for-of with iter.next and monkeypatching. |
|
2 |
|
3 function* g(n) { for (var i=0; i<n; i++) yield i; } |
|
4 var GeneratorObjectPrototype = Object.getPrototypeOf(g).prototype; |
|
5 var GeneratorObjectPrototype_next = GeneratorObjectPrototype.next; |
|
6 |
|
7 // Monkeypatch next on an iterator. |
|
8 var inner = g(20); |
|
9 var n = 0; |
|
10 for (let x of inner) { |
|
11 if (n == 0) { |
|
12 assertEq(x, n++); |
|
13 } else if (n == 1) { |
|
14 assertEq(x, n++); |
|
15 inner.next = function() { return { value: 42, done: false }; }; |
|
16 } else if (n == 2) { |
|
17 assertEq(x, 42); |
|
18 inner.next = function() { return { value: 100, done: true }; }; |
|
19 } else |
|
20 throw 'not reached'; |
|
21 } |
|
22 |
|
23 // Monkeypatch next on the prototype. |
|
24 var inner = g(20); |
|
25 var n = 0; |
|
26 for (let x of inner) { |
|
27 if (n == 0) { |
|
28 assertEq(x, n++); |
|
29 } else if (n == 1) { |
|
30 assertEq(x, n++); |
|
31 GeneratorObjectPrototype.next = |
|
32 function() { return { value: 42, done: false }; }; |
|
33 } else if (n == 2) { |
|
34 n++; |
|
35 assertEq(x, 42); |
|
36 GeneratorObjectPrototype.next = GeneratorObjectPrototype_next; |
|
37 } else if (n <= 20) { |
|
38 assertEq(x, n++ - 1); |
|
39 } else |
|
40 throw 'not reached'; |
|
41 } |