| function assert(b) { |
| if (!b) |
| throw new Error("Bad assertion"); |
| } |
| |
| { |
| let target = function foo(...args) { |
| assert(args[0] === 10); |
| assert(args[1] === 20); |
| return "foo"; |
| } |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| assert(theTarget === target); |
| assert(argArray[0] === 10); |
| assert(argArray[1] === 20); |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(proxy(10, 20) === "foo"); |
| } |
| } |
| |
| { |
| let target = function foo() { } |
| let error = null; |
| let handler = { |
| get apply() { |
| error = new Error(); |
| throw error; |
| } |
| }; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let threw = false; |
| try { |
| proxy(10, 20); |
| } catch(e) { |
| assert(e === error); |
| threw = true; |
| } |
| assert(threw); |
| } |
| } |
| |
| { |
| let called = false; |
| let globalThis = this; |
| let target = function foo() { |
| assert(this === globalThis); |
| called = true; |
| } |
| let handler = { |
| apply: null |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| proxy(); |
| assert(called); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let globalThis = this; |
| let target = function foo() { |
| assert(this === globalThis); |
| called = true; |
| } |
| let handler = { |
| apply: undefined |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| proxy(); |
| assert(called); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let thisValue = {}; |
| let target = function foo(x, y, z) { |
| assert(this === thisValue); |
| assert(x === 20); |
| assert(y === 45); |
| assert(z === "foo"); |
| called = true; |
| } |
| |
| let handler = { |
| apply: undefined |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| proxy.call(thisValue, 20, 45, "foo"); |
| assert(called); |
| called = false; |
| proxy.apply(thisValue, [20, 45, "foo"]); |
| assert(called); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let thisValue = {}; |
| let target = function foo(x, y, z) { |
| assert(this === thisValue); |
| assert(x === 20); |
| assert(y === 45); |
| assert(z === "foo"); |
| called = true; |
| return this; |
| } |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| assert(theTarget === target); |
| assert(argArray[0] === 20); |
| assert(argArray[1] === 45); |
| assert(argArray[2] === "foo"); |
| assert(thisArg === thisValue); |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(proxy.call(thisValue, 20, 45, "foo") === thisValue); |
| assert(called); |
| called = false; |
| assert(proxy.apply(thisValue, [20, 45, "foo"]) === thisValue); |
| assert(called); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let target = Error; |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| called = true; |
| assert(theTarget === Error); |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let error = proxy(); |
| assert(!!error.stack); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let self = this; |
| let target = (x) => { |
| called = true; |
| assert(this === self); |
| return x; |
| }; |
| |
| let handler = { }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let result = proxy(i); |
| assert(result === i); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let self = this; |
| let target = (x) => { |
| assert(this === self); |
| return x; |
| }; |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| called = true; |
| assert(theTarget === target); |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let result = proxy(i); |
| assert(result === i); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let self = this; |
| let target = (x) => { |
| assert(this === self); |
| return x; |
| }; |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| called = true; |
| assert(theTarget === target); |
| return theTarget.apply(null, argArray); |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let result = proxy(i); |
| assert(called); |
| assert(result === i); |
| called = false; |
| } |
| } |
| |
| { |
| let called = false; |
| let target = (x) => { }; |
| let error = null; |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| error = new Error(); |
| throw error; |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let threw = false; |
| try { |
| proxy(); |
| } catch(e) { |
| assert(e === error); |
| threw = true; |
| } |
| assert(threw); |
| } |
| } |
| |
| { |
| let called = false; |
| let error = null; |
| let target = (x) => { |
| error = new Error(); |
| throw error; |
| }; |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| assert(theTarget === target); |
| return theTarget.apply(null, argArray); |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| let threw = false; |
| try { |
| proxy(); |
| } catch(e) { |
| assert(e === error); |
| threw = true; |
| } |
| assert(threw); |
| } |
| } |
| |
| { |
| let called = false; |
| let error = null; |
| let target = new Proxy((x) => x, {}); |
| |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| assert(theTarget === target); |
| called = true; |
| return theTarget.apply(null, argArray); |
| } |
| }; |
| |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(proxy(i) === i); |
| assert(called); |
| called = false; |
| } |
| } |
| |
| { |
| let target = (x) => x; |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "function"); |
| } |
| } |
| |
| { |
| let target = function() { } |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "function"); |
| } |
| } |
| |
| { |
| let target = Error; |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "function"); |
| } |
| } |
| |
| { |
| let target = (function foo() { }).bind({}); |
| let handler = { |
| apply: function(theTarget, thisArg, argArray) { |
| return theTarget.apply(thisArg, argArray); |
| } |
| }; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "function"); |
| } |
| } |
| |
| { |
| let target = function() { }; |
| let handler = {}; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "function"); |
| } |
| } |
| |
| { |
| let target = {}; |
| let handler = {}; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "object"); |
| } |
| } |
| |
| { |
| let target = []; |
| let handler = {}; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "object"); |
| } |
| } |
| |
| { |
| let target = new String("foo"); |
| let handler = {}; |
| let proxy = new Proxy(target, handler); |
| for (let i = 0; i < 500; i++) { |
| assert(typeof proxy === "object"); |
| } |
| } |