function assert(b) { if (!b) throw new Error("Bad assertion"); } { let target = {}; let error = null; let handler = { get isExtensible() { error = new Error; throw error; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e === error); threw = true; } assert(threw); } } { let target = {}; let error = null; let handler = { isExtensible: function() { error = new Error; throw error; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e === error); threw = true; } assert(threw); } } { let error = null; let target = new Proxy({}, { isExtensible: function() { error = new Error; throw error; } }); let handler = { isExtensible: function(theTarget) { return Reflect.isExtensible(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e === error); threw = true; } assert(threw); } } { let target = {}; let handler = { isExtensible: function(theTarget) { return false; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned false when the target is extensible. It should have returned true"); threw = true; } assert(threw); } } { let target = {}; Reflect.preventExtensions(target); let handler = { isExtensible: function(theTarget) { return true; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false"); threw = true; } assert(threw); } } { let target = {}; Object.freeze(target); let handler = { isExtensible: function(theTarget) { return true; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false"); threw = true; } assert(threw); } } { let target = {}; Object.seal(target); let handler = { isExtensible: function(theTarget) { return true; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false"); threw = true; } assert(threw); } } { let target = {}; Object.preventExtensions(target); let handler = { isExtensible: function(theTarget) { return true; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.isExtensible(proxy); } catch(e) { assert(e.toString() === "TypeError: Proxy object's 'isExtensible' trap returned true when the target is non-extensible. It should have returned false"); threw = true; } assert(threw); } } { let target = {}; let called = false; let handler = { isExtensible: function(theTarget) { called = true; return true; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; let result = Reflect.isExtensible(proxy); assert(result); assert(called); called = false; } } { let target = {}; let called = false; Reflect.preventExtensions(target); let handler = { isExtensible: function(theTarget) { assert(theTarget === target); called = true; return Reflect.isExtensible(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; let result = Object.isExtensible(proxy); assert(!result); assert(called); called = false; result = Object.isFrozen(proxy); assert(result); assert(called); called = false; result = Object.isSealed(proxy); assert(result); assert(called); called = false; } } { let target = {}; let called = false; Object.freeze(target); let handler = { isExtensible: function(theTarget) { assert(theTarget === target); called = true; return Reflect.isExtensible(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; let result = Object.isExtensible(proxy); assert(!result); assert(called); called = false; result = Object.isFrozen(proxy); assert(result); assert(called); called = false; result = Object.isSealed(proxy); assert(result); assert(called); called = false; } } { let target = {}; let called = false; Object.seal(target); let handler = { isExtensible: function(theTarget) { assert(theTarget === target); called = true; return Reflect.isExtensible(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; let result = Object.isExtensible(proxy); assert(!result); assert(called); called = false; result = Object.isFrozen(proxy); assert(result); assert(called); called = false; result = Object.isSealed(proxy); assert(result); assert(called); called = false; } } { let target = {}; Object.defineProperty(target, "x", { writable: true, configurable: true, value: 45, enumerable: true }); let called = false; Reflect.preventExtensions(target); let handler = { isExtensible: function(theTarget) { assert(theTarget === target); called = true; return Reflect.isExtensible(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; let result = Object.isExtensible(proxy); assert(!result); assert(called); called = false; result = Object.isFrozen(proxy); assert(!result); assert(called); called = false; result = Object.isSealed(proxy); assert(!result); assert(called); called = false; } }