|
1 // for-of on a proxy causes a predictable sequence of trap calls. |
|
2 |
|
3 load(libdir + "iteration.js"); |
|
4 |
|
5 var s = ''; |
|
6 |
|
7 var i = 0; |
|
8 var next_fn = Proxy.createFunction({}, function () { |
|
9 s += "n"; |
|
10 if (i == 3) |
|
11 return { value: undefined, done: true }; |
|
12 return { value: i++, done: false }; |
|
13 }); |
|
14 |
|
15 var it = Proxy.create({ |
|
16 get: function (receiver, name) { |
|
17 if (name == 'toSource') { |
|
18 s += '?'; |
|
19 return function () 'it'; |
|
20 } |
|
21 assertEq(name, "next"); |
|
22 s += "N"; |
|
23 return next_fn; |
|
24 } |
|
25 }); |
|
26 |
|
27 var iterator_fn = Proxy.createFunction({}, function () { |
|
28 s += 'i'; |
|
29 return it; |
|
30 }); |
|
31 |
|
32 var obj = Proxy.create({ |
|
33 get: function (receiver, name) { |
|
34 assertEq(name, std_iterator); |
|
35 s += "I"; |
|
36 return iterator_fn; |
|
37 } |
|
38 }); |
|
39 |
|
40 for (var v of obj) |
|
41 s += v; |
|
42 |
|
43 assertEq(s, 'IiNn0Nn1Nn2Nn'); |