| // for-of on a proxy causes a predictable sequence of trap calls. |
| |
| load(libdir + "iteration.js"); |
| |
| var s = ''; |
| |
| var i = 0; |
| var next_fn = Proxy.createFunction({}, function () { |
| s += "n"; |
| if (i == 3) |
| return { value: undefined, done: true }; |
| return { value: i++, done: false }; |
| }); |
| |
| var it = Proxy.create({ |
| get: function (receiver, name) { |
| if (name == 'toSource') { |
| s += '?'; |
| return () => 'it'; |
| } |
| assertEq(name, "next"); |
| s += "N"; |
| return next_fn; |
| } |
| }); |
| |
| var iterator_fn = Proxy.createFunction({}, function () { |
| s += 'i'; |
| return it; |
| }); |
| |
| var obj = Proxy.create({ |
| get: function (receiver, name) { |
| assertEq(name, Symbol.iterator); |
| s += "I"; |
| return iterator_fn; |
| } |
| }); |
| |
| for (var v of obj) |
| s += v; |
| |
| assertEq(s, 'IiNn0Nn1Nn2Nn'); |