michael@0: // An array iterator for a proxy calls the traps in a predictable order. michael@0: michael@0: load(libdir + "asserts.js"); michael@0: load(libdir + "iteration.js"); michael@0: michael@0: var s = ''; michael@0: michael@0: var proxyObj = { michael@0: get: function (recipient, name) { michael@0: if (name == 'length') { michael@0: s += 'L'; michael@0: return 2; michael@0: } else { michael@0: s += name; michael@0: return name; michael@0: } michael@0: } michael@0: }; michael@0: michael@0: var it = Array.prototype[std_iterator].call(Proxy.create(proxyObj)); michael@0: michael@0: assertIteratorNext(it, "0"); michael@0: s += ' '; michael@0: assertIteratorNext(it, "1"); michael@0: s += ' '; michael@0: assertIteratorDone(it, undefined); michael@0: assertEq(s, "L0 L1 L"); michael@0: michael@0: s = ''; michael@0: var ki = Array.prototype.keys.call(Proxy.create(proxyObj)); michael@0: michael@0: assertIteratorNext(ki, 0); michael@0: s += ' '; michael@0: assertIteratorNext(ki, 1); michael@0: s += ' '; michael@0: assertIteratorDone(ki, undefined); michael@0: assertEq(s, "L L L"); michael@0: michael@0: s = ''; michael@0: var ei = Array.prototype.entries.call(Proxy.create(proxyObj)); michael@0: michael@0: assertIteratorNext(ei, [0, "0"]); michael@0: s += ' '; michael@0: assertIteratorNext(ei, [1, "1"]); michael@0: s += ' '; michael@0: assertIteratorDone(ei, undefined); michael@0: assertEq(s, "L0 L1 L");