function assert(b) { if (!b) throw new Error("bad assertion"); } // Currently, only "get", "getOwnPropertyDescriptor", and "set" are testable. { let theTarget = []; let sawPrivateSymbolAsString = false; let handler = { get: function(target, propName, proxyArg) { if (typeof propName === "string") sawPrivateSymbolAsString = propName === "PrivateSymbol.arrayIterationKind"; return target[propName]; } }; let proxy = new Proxy(theTarget, handler); for (let i = 0; i < 100; i++) { let threw = false; try { proxy[Symbol.iterator]().next.call(proxy); } catch(e) { // this will throw because we convert private symbols to strings. assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance"); threw = true; } assert(threw); assert(!sawPrivateSymbolAsString); sawPrivateSymbolAsString = false; } } { let theTarget = []; let sawPrivateSymbolAsString = false; let handler = { getOwnPropertyDescriptor: function(theTarget, propName) { if (typeof propName === "string") sawPrivateSymbolAsString = propName === "PrivateSymbol.arrayIterationKind"; return target[propName]; } }; let proxy = new Proxy(theTarget, handler); for (let i = 0; i < 100; i++) { let threw = false; try { proxy[Symbol.iterator]().next.call(proxy); } catch(e) { // this will throw because we convert private symbols to strings. assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance"); threw = true; } assert(threw); assert(!sawPrivateSymbolAsString); sawPrivateSymbolAsString = false; } } { let theTarget = [1,2,3,4,5]; let iterator = theTarget[Symbol.iterator](); let sawPrivateSymbolAsString = false; let handler = { set: function(theTarget, propName, value, receiver) { if (typeof propName === "string") sawPrivateSymbolAsString = propName === "PrivateSymbol.arrayIterationKind"; return target[propName]; } }; let proxy = new Proxy(iterator, handler); for (let i = 0; i < 100; i++) { let threw = false; try { proxy.next(); } catch(e) { // this will throw because we convert private symbols to strings. assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance"); threw = true; } assert(!threw); assert(!sawPrivateSymbolAsString); sawPrivateSymbolAsString = false; } }