Chromium Code Reviews| Index: test/mjsunit/harmony/proxies-function.js |
| diff --git a/test/mjsunit/harmony/proxies-function.js b/test/mjsunit/harmony/proxies-function.js |
| index 7b08ad7511286be48f0be1b2d5df82649e7c7aa6..fe24308bf2224e65bc554a95e2943f2c44c8cf95 100644 |
| --- a/test/mjsunit/harmony/proxies-function.js |
| +++ b/test/mjsunit/harmony/proxies-function.js |
| @@ -31,7 +31,9 @@ |
| // Helper. |
|
Lasse Reichstein
2011/10/17 12:38:39
I'll undo the manual semicolon insertions so you w
|
| function CreateFrozen(handler, callTrap, constructTrap) { |
| - if (handler.fix === undefined) handler.fix = function() { return {} } |
| + if (handler.fix === undefined) { |
| + handler.fix = function() { return { length: { value: 2 } }; }; |
|
rossberg
2011/10/17 11:49:08
This shouldn't be necessary, because Object.freeze
Lasse Reichstein
2011/10/17 12:38:39
Ok, removing fix for fix.
|
| + } |
| var f = Proxy.createFunction(handler, callTrap, constructTrap) |
| Object.freeze(f) |
| return f |
| @@ -41,134 +43,146 @@ function CreateFrozen(handler, callTrap, constructTrap) { |
| // Calling (call, Function.prototype.call, Function.prototype.apply, |
| // Function.prototype.bind). |
| -var global_object = this |
| -var receiver |
| +var global_object = this; |
| +var receiver; |
| + |
| +// Ensures that checking the "length" property of a function proxy doesn't |
| +// crash due to lack of a [[Get]] method. |
| +var handler = { |
|
rossberg
2011/10/17 11:49:08
Could you move this up to the helpers section?
Lasse Reichstein
2011/10/17 12:38:39
Done.
|
| + get : function(r, n) { return n == "length" ? 2 : undefined; } |
| +}; |
| + |
| function TestCall(isStrict, callTrap) { |
| - assertEquals(42, callTrap(5, 37)) |
| - assertEquals(isStrict ? undefined : global_object, receiver) |
| + assertEquals(42, callTrap(5, 37)); |
| + assertEquals(isStrict ? undefined : global_object, receiver); |
| var handler = { |
| get: function(r, k) { |
| - return k == "length" ? 2 : Function.prototype[k] |
| + return k == "length" ? 2 : Function.prototype[k]; |
| } |
| - } |
| - var f = Proxy.createFunction(handler, callTrap) |
| - |
| - receiver = 333 |
| - assertEquals(42, f(11, 31)) |
| - assertEquals(isStrict ? undefined : global_object, receiver) |
| - var o = {f: f} |
| - receiver = 333 |
| - assertEquals(42, o.f(10, 32)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, o["f"](9, 33)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, (1, o).f(8, 34)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, (1, o)["f"](7, 35)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, f.call(o, 32, 10)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, f.call(null, 33, 9)) |
| - assertSame(isStrict ? null : global_object, receiver) |
| - receiver = 333 |
| - assertEquals(44, f.call(2, 21, 23)) |
| - assertSame(2, receiver.valueOf()) |
| - receiver = 333 |
| - assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(43, Function.prototype.call.call(f, null, 20, 23)) |
| - assertSame(isStrict ? null : global_object, receiver) |
| - assertEquals(44, Function.prototype.call.call(f, 2, 21, 23)) |
| - assertEquals(2, receiver.valueOf()) |
| - receiver = 333 |
| - assertEquals(32, f.apply(o, [16, 16])) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) |
| - assertSame(o, receiver) |
| - |
| - var ff = Function.prototype.bind.call(f, o, 12) |
| - assertTrue(ff.length <= 1) // TODO(rossberg): Not spec'ed yet, be lax. |
| - receiver = 333 |
| - assertEquals(42, ff(30)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) |
| - assertSame(o, receiver) |
| - |
| - var fff = Function.prototype.bind.call(ff, o, 30) |
| - assertEquals(0, fff.length) |
| - receiver = 333 |
| - assertEquals(42, fff()) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, Function.prototype.call.call(fff, {})) |
| - assertSame(o, receiver) |
| - |
| - var f = CreateFrozen({}, callTrap) |
| - receiver = 333 |
| - assertEquals(42, f(11, 31)) |
| - assertSame(isStrict ? undefined : global_object, receiver) |
| - var o = {f: f} |
| - receiver = 333 |
| - assertEquals(42, o.f(10, 32)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, o["f"](9, 33)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, (1, o).f(8, 34)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, (1, o)["f"](7, 35)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(42, ff(30)) |
| - assertSame(o, receiver) |
| - receiver = 333 |
| - assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) |
| - assertSame(o, receiver) |
| + }; |
| + var f = Proxy.createFunction(handler, callTrap); |
| + |
| + receiver = 333; |
| + assertEquals(42, f(11, 31)); |
| + assertEquals(isStrict ? undefined : global_object, receiver); |
| + var o = {f: f}; |
| + receiver = 333; |
| + assertEquals(42, o.f(10, 32)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, o["f"](9, 33)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, (1, o).f(8, 34)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, (1, o)["f"](7, 35)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, f.call(o, 32, 10)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, f.call(null, 33, 9)); |
| + assertSame(isStrict ? null : global_object, receiver); |
| + receiver = 333; |
| + assertEquals(44, f.call(2, 21, 23)); |
| + assertSame(2, receiver.valueOf()); |
| + receiver = 333; |
| + assertEquals(42, Function.prototype.call.call(f, o, 20, 22)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(43, Function.prototype.call.call(f, null, 20, 23)); |
| + assertSame(isStrict ? null : global_object, receiver); |
| + assertEquals(44, Function.prototype.call.call(f, 2, 21, 23)); |
| + assertEquals(2, receiver.valueOf()); |
| + receiver = 333; |
| + assertEquals(32, f.apply(o, [16, 16])); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])); |
| + assertSame(o, receiver); |
| + |
| + var ff = Function.prototype.bind.call(f, o, 12); |
| + assertTrue(ff.length <= 1); // TODO(rossberg): Not spec'ed yet, be lax. |
| + receiver = 333; |
| + assertEquals(42, ff(30)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(32, Function.prototype.apply.call(ff, {}, [20])); |
| + assertSame(o, receiver); |
| + |
| + var fff = Function.prototype.bind.call(ff, o, 30); |
| + assertEquals(0, fff.length); |
| + receiver = 333; |
| + assertEquals(42, fff()); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, Function.prototype.call.call(fff, {})); |
| + assertSame(o, receiver); |
| + |
| + var f = CreateFrozen({}, callTrap); |
| + receiver = 333; |
| + assertEquals(42, f(11, 31)); |
| + assertSame(isStrict ? undefined : global_object, receiver); |
| + var o = {f: f}; |
| + receiver = 333; |
| + assertEquals(42, o.f(10, 32)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, o["f"](9, 33)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, (1, o).f(8, 34)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, (1, o)["f"](7, 35)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, Function.prototype.call.call(f, o, 20, 22)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(42, ff(30)); |
| + assertSame(o, receiver); |
| + receiver = 333; |
| + assertEquals(32, Function.prototype.apply.call(ff, {}, [20])); |
| + assertSame(o, receiver); |
| } |
| TestCall(false, function(x, y) { |
| - receiver = this; return x + y |
| -}) |
| + receiver = this; |
| + return x + y; |
| +}); |
| TestCall(true, function(x, y) { |
| "use strict"; |
| - receiver = this; return x + y |
| -}) |
| + receiver = this; |
| + return x + y; |
| +}); |
| TestCall(false, function() { |
| - receiver = this; return arguments[0] + arguments[1] |
| + receiver = this; return arguments[0] + arguments[1]; |
| }) |
| -TestCall(false, Proxy.createFunction({}, function(x, y) { |
| - receiver = this; return x + y |
| -})) |
| +TestCall(false, Proxy.createFunction(handler, function(x, y) { |
| + receiver = this; |
| + return x + y; |
| +})); |
| -TestCall(true, Proxy.createFunction({}, function(x, y) { |
| +TestCall(true, Proxy.createFunction(handler, function(x, y) { |
| "use strict"; |
| - receiver = this; return x + y |
| -})) |
| + receiver = this; |
| + return x + y; |
| +})); |
| -TestCall(false, CreateFrozen({}, function(x, y) { |
| - receiver = this; return x + y |
| -})) |
| +TestCall(false, CreateFrozen(handler, function(x, y) { |
| + receiver = this; |
| + return x + y; |
| +})); |
| @@ -191,45 +205,72 @@ TestCallIntrinsic("function", Function) |
| // Throwing from call trap. |
| function TestCallThrow(callTrap) { |
| - var f = Proxy.createFunction({}, callTrap) |
| - assertThrows(function(){ f(11) }, "myexn") |
| - assertThrows(function(){ ({x: f}).x(11) }, "myexn") |
| - assertThrows(function(){ ({x: f})["x"](11) }, "myexn") |
| - assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") |
| - assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") |
| - |
| - var f = CreateFrozen({}, callTrap) |
| - assertThrows(function(){ f(11) }, "myexn") |
| - assertThrows(function(){ ({x: f}).x(11) }, "myexn") |
| - assertThrows(function(){ ({x: f})["x"](11) }, "myexn") |
| - assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") |
| - assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") |
| + var f = Proxy.createFunction(handler, callTrap); |
|
rossberg
2011/10/17 11:49:08
None of this should actually need the length prope
Lasse Reichstein
2011/10/17 12:38:39
Right, no call to bind here. Undoing.
|
| + assertThrows(function(){ f(11) }, "myexn"); |
| + assertThrows(function(){ ({x: f}).x(11) }, "myexn"); |
| + assertThrows(function(){ ({x: f})["x"](11) }, "myexn"); |
| + assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn"); |
| + assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn"); |
| + |
| + var f = CreateFrozen(handler, callTrap); |
| + assertThrows(function(){ f(11) }, "myexn"); |
| + assertThrows(function(){ ({x: f}).x(11) }, "myexn"); |
| + assertThrows(function(){ ({x: f})["x"](11) }, "myexn"); |
| + assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn"); |
| + assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn"); |
| } |
| -TestCallThrow(function() { throw "myexn" }) |
| -TestCallThrow(Proxy.createFunction({}, function() { throw "myexn" })) |
| -TestCallThrow(CreateFrozen({}, function() { throw "myexn" })) |
| +TestCallThrow(function() { throw "myexn"; }); |
| +TestCallThrow(Proxy.createFunction(handler, function() { throw "myexn"; })); |
| +TestCallThrow(CreateFrozen(handler, function() { throw "myexn"; })); |
| // Construction (new). |
| -var prototype = {} |
| -var receiver |
| +var prototype = {}; |
| +var receiver; |
| var handlerWithPrototype = { |
| - fix: function() { return {prototype: prototype} }, |
| - get: function(r, n) { assertEquals("prototype", n); return prototype } |
| -} |
| + fix: function() { |
| + return { length: {value: 2}, |
| + prototype: { value: prototype } } |
| + }, |
| + get: function(r, n) { |
| + if (n == "length") return 2; |
| + assertEquals("prototype", n); |
| + return prototype; |
| + } |
| +}; |
| var handlerSansPrototype = { |
| - fix: function() { return {} }, |
| - get: function(r, n) { assertEquals("prototype", n); return undefined } |
| + fix: function() { return { length: { value: 2 } }; }, |
|
Lasse Reichstein
2011/10/17 12:38:39
Removing length from fix here too.
|
| + get: function(r, n) { |
| + if (n == "length") return 2; |
| + assertEquals("prototype", n); |
| + return undefined; |
| + } |
| +}; |
| + |
| +function ReturnUndef(x, y) { |
| + "use strict"; |
| + receiver = this; |
| + this.sum = x + y; |
| +} |
| + |
| +function ReturnThis(x, y) { |
| + "use strict"; |
| + receiver = this; |
| + this.sum = x + y; |
| + return this; |
| +} |
| + |
| +function ReturnNew(x, y) { |
| + "use strict"; |
| + receiver = this; |
| + return {sum: x + y}; |
| } |
| -function ReturnUndef(x, y) { "use strict"; receiver = this; this.sum = x + y } |
| -function ReturnThis(x, y) { "use strict"; receiver = this; this.sum = x + y; return this } |
| -function ReturnNew(x, y) { "use strict"; receiver = this; return {sum: x + y} } |
| function ReturnNewWithProto(x, y) { |
| "use strict"; |
| receiver = this; |
| @@ -239,16 +280,16 @@ function ReturnNewWithProto(x, y) { |
| } |
| function TestConstruct(proto, constructTrap) { |
| - TestConstruct2(proto, constructTrap, handlerWithPrototype) |
| - TestConstruct2(proto, constructTrap, handlerSansPrototype) |
| + TestConstruct2(proto, constructTrap, handlerWithPrototype); |
| + TestConstruct2(proto, constructTrap, handlerSansPrototype); |
| } |
| function TestConstruct2(proto, constructTrap, handler) { |
| - var f = Proxy.createFunction(handler, function() {}, constructTrap) |
| - var o = new f(11, 31) |
| - assertEquals(undefined, receiver) |
| - assertEquals(42, o.sum) |
| - assertSame(proto, Object.getPrototypeOf(o)) |
| + var f = Proxy.createFunction(handler, function() {}, constructTrap); |
| + var o = new f(11, 31); |
| + assertEquals(undefined, receiver); |
| + assertEquals(42, o.sum); |
| + assertSame(proto, Object.getPrototypeOf(o)); |
| // TODO(rossberg): does not work yet. |
| // var ff = Function.prototype.bind.call(f, o, 10) |
| @@ -257,43 +298,43 @@ function TestConstruct2(proto, constructTrap, handler) { |
| // assertEquals(42, o.sum) |
| // assertSame(proto, Object.getPrototypeOf(o)) |
| - var f = CreateFrozen(handler, function() {}, constructTrap) |
| - var o = new f(11, 32) |
| - assertEquals(undefined, receiver) |
| - assertEquals(43, o.sum) |
| - assertSame(proto, Object.getPrototypeOf(o)) |
| - |
| - var ff = Function.prototype.bind.call(f, o, 10) |
| - var o = new ff(32) |
| - assertEquals(undefined, receiver) |
| - assertEquals(42, o.sum) |
| - assertSame(proto, Object.getPrototypeOf(o)) |
| + var f = CreateFrozen(handler, function() {}, constructTrap); |
| + var o = new f(11, 32); |
| + assertEquals(undefined, receiver); |
| + assertEquals(43, o.sum); |
| + assertSame(proto, Object.getPrototypeOf(o)); |
| + |
| + var ff = Function.prototype.bind.call(f, o, 10); |
| + var o = new ff(32); |
| + assertEquals(undefined, receiver); |
| + assertEquals(42, o.sum); |
| + assertSame(proto, Object.getPrototypeOf(o)); |
| } |
| -TestConstruct(Object.prototype, ReturnNew) |
| -TestConstruct(prototype, ReturnNewWithProto) |
| +TestConstruct(Object.prototype, ReturnNew); |
| +TestConstruct(prototype, ReturnNewWithProto); |
| -TestConstruct(Object.prototype, Proxy.createFunction({}, ReturnNew)) |
| -TestConstruct(prototype, Proxy.createFunction({}, ReturnNewWithProto)) |
| +TestConstruct(Object.prototype, Proxy.createFunction(handler, ReturnNew)); |
| +TestConstruct(prototype, Proxy.createFunction(handler, ReturnNewWithProto)); |
| -TestConstruct(Object.prototype, CreateFrozen({}, ReturnNew)) |
| -TestConstruct(prototype, CreateFrozen({}, ReturnNewWithProto)) |
| +TestConstruct(Object.prototype, CreateFrozen(handler, ReturnNew)); |
| +TestConstruct(prototype, CreateFrozen(handler, ReturnNewWithProto)); |
| // Construction with derived construct trap. |
| function TestConstructFromCall(proto, returnsThis, callTrap) { |
| - TestConstructFromCall2(proto, returnsThis, callTrap, handlerWithPrototype) |
| - TestConstructFromCall2(proto, returnsThis, callTrap, handlerSansPrototype) |
| + TestConstructFromCall2(proto, returnsThis, callTrap, handlerWithPrototype); |
| + TestConstructFromCall2(proto, returnsThis, callTrap, handlerSansPrototype); |
| } |
| function TestConstructFromCall2(proto, returnsThis, callTrap, handler) { |
| - var f = Proxy.createFunction(handler, callTrap) |
| - var o = new f(11, 31) |
| - if (returnsThis) assertEquals(o, receiver) |
| - assertEquals(42, o.sum) |
| - assertSame(proto, Object.getPrototypeOf(o)) |
| + var f = Proxy.createFunction(handler, callTrap); |
| + var o = new f(11, 31); |
| + if (returnsThis) assertEquals(o, receiver); |
| + assertEquals(42, o.sum); |
| + assertSame(proto, Object.getPrototypeOf(o)); |
| // TODO(rossberg): does not work yet. |
| // var ff = Function.prototype.bind.call(f, o, 10) |
| @@ -302,11 +343,11 @@ function TestConstructFromCall2(proto, returnsThis, callTrap, handler) { |
| // assertEquals(42, o.sum) |
| // assertSame(proto, Object.getPrototypeOf(o)) |
| - var f = CreateFrozen(handler, callTrap) |
| - var o = new f(11, 32) |
| - if (returnsThis) assertEquals(o, receiver) |
| - assertEquals(43, o.sum) |
| - assertSame(proto, Object.getPrototypeOf(o)) |
| + var f = CreateFrozen(handler, callTrap); |
| + var o = new f(11, 32); |
| + if (returnsThis) assertEquals(o, receiver); |
| + assertEquals(43, o.sum); |
| + assertSame(proto, Object.getPrototypeOf(o)); |
| // TODO(rossberg): does not work yet. |
| // var ff = Function.prototype.bind.call(f, o, 10) |
| @@ -316,179 +357,198 @@ function TestConstructFromCall2(proto, returnsThis, callTrap, handler) { |
| // assertSame(proto, Object.getPrototypeOf(o)) |
| } |
| -TestConstructFromCall(Object.prototype, true, ReturnUndef) |
| -TestConstructFromCall(Object.prototype, true, ReturnThis) |
| -TestConstructFromCall(Object.prototype, false, ReturnNew) |
| -TestConstructFromCall(prototype, false, ReturnNewWithProto) |
| - |
| -TestConstructFromCall(Object.prototype, true, Proxy.createFunction({}, ReturnUndef)) |
| -TestConstructFromCall(Object.prototype, true, Proxy.createFunction({}, ReturnThis)) |
| -TestConstructFromCall(Object.prototype, false, Proxy.createFunction({}, ReturnNew)) |
| -TestConstructFromCall(prototype, false, Proxy.createFunction({}, ReturnNewWithProto)) |
| - |
| -TestConstructFromCall(Object.prototype, true, CreateFrozen({}, ReturnUndef)) |
| -TestConstructFromCall(Object.prototype, true, CreateFrozen({}, ReturnThis)) |
| -TestConstructFromCall(Object.prototype, false, CreateFrozen({}, ReturnNew)) |
| -TestConstructFromCall(prototype, false, CreateFrozen({}, ReturnNewWithProto)) |
| - |
| -ReturnUndef.prototype = prototype |
| -ReturnThis.prototype = prototype |
| -ReturnNew.prototype = prototype |
| -ReturnNewWithProto.prototype = prototype |
| - |
| -TestConstructFromCall(prototype, true, ReturnUndef) |
| -TestConstructFromCall(prototype, true, ReturnThis) |
| -TestConstructFromCall(Object.prototype, false, ReturnNew) |
| -TestConstructFromCall(prototype, false, ReturnNewWithProto) |
| - |
| -TestConstructFromCall(Object.prototype, true, Proxy.createFunction({}, ReturnUndef)) |
| -TestConstructFromCall(Object.prototype, true, Proxy.createFunction({}, ReturnThis)) |
| -TestConstructFromCall(Object.prototype, false, Proxy.createFunction({}, ReturnNew)) |
| -TestConstructFromCall(prototype, false, Proxy.createFunction({}, ReturnNewWithProto)) |
| - |
| -TestConstructFromCall(prototype, true, Proxy.createFunction(handlerWithPrototype, ReturnUndef)) |
| -TestConstructFromCall(prototype, true, Proxy.createFunction(handlerWithPrototype, ReturnThis)) |
| -TestConstructFromCall(Object.prototype, false, Proxy.createFunction(handlerWithPrototype, ReturnNew)) |
| -TestConstructFromCall(prototype, false, Proxy.createFunction(handlerWithPrototype, ReturnNewWithProto)) |
| - |
| -TestConstructFromCall(prototype, true, CreateFrozen(handlerWithPrototype, ReturnUndef)) |
| -TestConstructFromCall(prototype, true, CreateFrozen(handlerWithPrototype, ReturnThis)) |
| -TestConstructFromCall(Object.prototype, false, CreateFrozen(handlerWithPrototype, ReturnNew)) |
| -TestConstructFromCall(prototype, false, CreateFrozen(handlerWithPrototype, ReturnNewWithProto)) |
| +TestConstructFromCall(Object.prototype, true, ReturnUndef); |
| +TestConstructFromCall(Object.prototype, true, ReturnThis); |
| +TestConstructFromCall(Object.prototype, false, ReturnNew); |
| +TestConstructFromCall(prototype, false, ReturnNewWithProto); |
| + |
| +TestConstructFromCall(Object.prototype, true, |
| + Proxy.createFunction(handler, ReturnUndef)); |
| +TestConstructFromCall(Object.prototype, true, |
| + Proxy.createFunction(handler, ReturnThis)); |
| +TestConstructFromCall(Object.prototype, false, |
| + Proxy.createFunction(handler, ReturnNew)); |
| +TestConstructFromCall(prototype, false, |
| + Proxy.createFunction(handler, ReturnNewWithProto)); |
| + |
| +TestConstructFromCall(Object.prototype, true, CreateFrozen({}, ReturnUndef)); |
| +TestConstructFromCall(Object.prototype, true, CreateFrozen({}, ReturnThis)); |
| +TestConstructFromCall(Object.prototype, false, CreateFrozen({}, ReturnNew)); |
| +TestConstructFromCall(prototype, false, CreateFrozen({}, ReturnNewWithProto)); |
| + |
| +ReturnUndef.prototype = prototype; |
| +ReturnThis.prototype = prototype; |
| +ReturnNew.prototype = prototype; |
| +ReturnNewWithProto.prototype = prototype; |
| + |
| +TestConstructFromCall(prototype, true, ReturnUndef); |
| +TestConstructFromCall(prototype, true, ReturnThis); |
| +TestConstructFromCall(Object.prototype, false, ReturnNew); |
| +TestConstructFromCall(prototype, false, ReturnNewWithProto); |
| + |
| +TestConstructFromCall(Object.prototype, true, |
| + Proxy.createFunction(handler, ReturnUndef)); |
| +TestConstructFromCall(Object.prototype, true, |
| + Proxy.createFunction(handler, ReturnThis)); |
| +TestConstructFromCall(Object.prototype, false, |
| + Proxy.createFunction(handler, ReturnNew)); |
| +TestConstructFromCall(prototype, false, |
| + Proxy.createFunction(handler, ReturnNewWithProto)); |
| + |
| +TestConstructFromCall(prototype, true, |
| + Proxy.createFunction(handlerWithPrototype, ReturnUndef)); |
| +TestConstructFromCall(prototype, true, |
| + Proxy.createFunction(handlerWithPrototype, ReturnThis)); |
| +TestConstructFromCall(Object.prototype, false, |
| + Proxy.createFunction(handlerWithPrototype, ReturnNew)); |
| +TestConstructFromCall(prototype, false, |
| + Proxy.createFunction(handlerWithPrototype, |
| + ReturnNewWithProto)); |
| + |
| +TestConstructFromCall(prototype, true, |
| + CreateFrozen(handlerWithPrototype, ReturnUndef)); |
| +TestConstructFromCall(prototype, true, |
| + CreateFrozen(handlerWithPrototype, ReturnThis)); |
| +TestConstructFromCall(Object.prototype, false, |
| + CreateFrozen(handlerWithPrototype, ReturnNew)); |
| +TestConstructFromCall(prototype, false, |
| + CreateFrozen(handlerWithPrototype, ReturnNewWithProto)); |
| // Throwing from the construct trap. |
| function TestConstructThrow(trap) { |
| - TestConstructThrow2(Proxy.createFunction({fix: function() {return {}}}, trap)) |
| - TestConstructThrow2(Proxy.createFunction({fix: function() {return {}}}, |
| - function() {}, trap)) |
| + TestConstructThrow2(Proxy.createFunction({ fix: function() {return {};} }, |
| + trap)); |
| + TestConstructThrow2(Proxy.createFunction({ fix: function() {return {};} }, |
| + function() {}, |
| + trap)); |
| } |
| function TestConstructThrow2(f) { |
| - assertThrows(function(){ new f(11) }, "myexn") |
| - Object.freeze(f) |
| - assertThrows(function(){ new f(11) }, "myexn") |
| + assertThrows(function(){ new f(11) }, "myexn"); |
| + Object.freeze(f); |
| + assertThrows(function(){ new f(11) }, "myexn"); |
| } |
| -TestConstructThrow(function() { throw "myexn" }) |
| -TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) |
| -TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) |
| +TestConstructThrow(function() { throw "myexn"; }); |
| +TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn"; })); |
| +TestConstructThrow(CreateFrozen({}, function() { throw "myexn"; })); |
| // Using function proxies as getters and setters. |
| -var value |
| -var receiver |
| +var value; |
| +var receiver; |
| function TestAccessorCall(getterCallTrap, setterCallTrap) { |
| - var handler = {fix: function() { return {} }} |
| - var pgetter = Proxy.createFunction(handler, getterCallTrap) |
| - var psetter = Proxy.createFunction(handler, setterCallTrap) |
| - |
| - var o = {} |
| - var oo = Object.create(o) |
| - Object.defineProperty(o, "a", {get: pgetter, set: psetter}) |
| - Object.defineProperty(o, "b", {get: pgetter}) |
| - Object.defineProperty(o, "c", {set: psetter}) |
| - Object.defineProperty(o, "3", {get: pgetter, set: psetter}) |
| - Object.defineProperty(oo, "a", {value: 43}) |
| - |
| - receiver = "" |
| - assertEquals(42, o.a) |
| - assertSame(o, receiver) |
| - receiver = "" |
| - assertEquals(42, o.b) |
| - assertSame(o, receiver) |
| - receiver = "" |
| - assertEquals(undefined, o.c) |
| - assertEquals("", receiver) |
| - receiver = "" |
| - assertEquals(42, o["a"]) |
| - assertSame(o, receiver) |
| - receiver = "" |
| - assertEquals(42, o[3]) |
| - assertSame(o, receiver) |
| - |
| - receiver = "" |
| - assertEquals(43, oo.a) |
| - assertEquals("", receiver) |
| - receiver = "" |
| - assertEquals(42, oo.b) |
| - assertSame(o, receiver) |
| - receiver = "" |
| - assertEquals(undefined, oo.c) |
| - assertEquals("", receiver) |
| - receiver = "" |
| - assertEquals(43, oo["a"]) |
| - assertEquals("", receiver) |
| - receiver = "" |
| - assertEquals(42, oo[3]) |
| - assertSame(o, receiver) |
| - |
| - receiver = "" |
| - assertEquals(50, o.a = 50) |
| - assertSame(o, receiver) |
| - assertEquals(50, value) |
| - receiver = "" |
| - assertEquals(51, o.b = 51) |
| - assertEquals("", receiver) |
| - assertEquals(50, value) // no setter |
| - assertThrows(function() { "use strict"; o.b = 51 }, TypeError) |
| - receiver = "" |
| - assertEquals(52, o.c = 52) |
| - assertSame(o, receiver) |
| - assertEquals(52, value) |
| - receiver = "" |
| - assertEquals(53, o["a"] = 53) |
| - assertSame(o, receiver) |
| - assertEquals(53, value) |
| - receiver = "" |
| - assertEquals(54, o[3] = 54) |
| - assertSame(o, receiver) |
| - assertEquals(54, value) |
| - |
| - value = 0 |
| - receiver = "" |
| - assertEquals(60, oo.a = 60) |
| - assertEquals("", receiver) |
| - assertEquals(0, value) // oo has own 'a' |
| - assertEquals(61, oo.b = 61) |
| - assertSame("", receiver) |
| - assertEquals(0, value) // no setter |
| - assertThrows(function() { "use strict"; oo.b = 61 }, TypeError) |
| - receiver = "" |
| - assertEquals(62, oo.c = 62) |
| - assertSame(oo, receiver) |
| - assertEquals(62, value) |
| - receiver = "" |
| - assertEquals(63, oo["c"] = 63) |
| - assertSame(oo, receiver) |
| - assertEquals(63, value) |
| - receiver = "" |
| - assertEquals(64, oo[3] = 64) |
| - assertSame(oo, receiver) |
| - assertEquals(64, value) |
| + var handler = { fix: function() { return {}; } }; |
| + var pgetter = Proxy.createFunction(handler, getterCallTrap); |
| + var psetter = Proxy.createFunction(handler, setterCallTrap); |
| + |
| + var o = {}; |
| + var oo = Object.create(o); |
| + Object.defineProperty(o, "a", {get: pgetter, set: psetter}); |
| + Object.defineProperty(o, "b", {get: pgetter}); |
| + Object.defineProperty(o, "c", {set: psetter}); |
| + Object.defineProperty(o, "3", {get: pgetter, set: psetter}); |
| + Object.defineProperty(oo, "a", {value: 43}); |
| + |
| + receiver = ""; |
| + assertEquals(42, o.a); |
| + assertSame(o, receiver); |
| + receiver = ""; |
| + assertEquals(42, o.b); |
| + assertSame(o, receiver); |
| + receiver = ""; |
| + assertEquals(undefined, o.c); |
| + assertEquals("", receiver); |
| + receiver = ""; |
| + assertEquals(42, o["a"]); |
| + assertSame(o, receiver); |
| + receiver = ""; |
| + assertEquals(42, o[3]); |
| + assertSame(o, receiver); |
| + |
| + receiver = ""; |
| + assertEquals(43, oo.a); |
| + assertEquals("", receiver); |
| + receiver = ""; |
| + assertEquals(42, oo.b); |
| + assertSame(o, receiver); |
| + receiver = ""; |
| + assertEquals(undefined, oo.c); |
| + assertEquals("", receiver); |
| + receiver = ""; |
| + assertEquals(43, oo["a"]); |
| + assertEquals("", receiver); |
| + receiver = ""; |
| + assertEquals(42, oo[3]); |
| + assertSame(o, receiver); |
| + |
| + receiver = ""; |
| + assertEquals(50, o.a = 50); |
| + assertSame(o, receiver); |
| + assertEquals(50, value); |
| + receiver = ""; |
| + assertEquals(51, o.b = 51); |
| + assertEquals("", receiver); |
| + assertEquals(50, value); // no setter |
| + assertThrows(function() { "use strict"; o.b = 51 }, TypeError); |
| + receiver = ""; |
| + assertEquals(52, o.c = 52); |
| + assertSame(o, receiver); |
| + assertEquals(52, value); |
| + receiver = ""; |
| + assertEquals(53, o["a"] = 53); |
| + assertSame(o, receiver); |
| + assertEquals(53, value); |
| + receiver = ""; |
| + assertEquals(54, o[3] = 54); |
| + assertSame(o, receiver); |
| + assertEquals(54, value); |
| + |
| + value = 0; |
| + receiver = ""; |
| + assertEquals(60, oo.a = 60); |
| + assertEquals("", receiver); |
| + assertEquals(0, value); // oo has own 'a' |
| + assertEquals(61, oo.b = 61); |
| + assertSame("", receiver); |
| + assertEquals(0, value); // no setter |
| + assertThrows(function() { "use strict"; oo.b = 61; }, TypeError); |
| + receiver = ""; |
| + assertEquals(62, oo.c = 62); |
| + assertSame(oo, receiver); |
| + assertEquals(62, value); |
| + receiver = ""; |
| + assertEquals(63, oo["c"] = 63); |
| + assertSame(oo, receiver); |
| + assertEquals(63, value); |
| + receiver = ""; |
| + assertEquals(64, oo[3] = 64); |
| + assertSame(oo, receiver); |
| + assertEquals(64, value); |
| } |
| TestAccessorCall( |
| - function() { receiver = this; return 42 }, |
| - function(x) { receiver = this; value = x } |
| -) |
| + function() { receiver = this; return 42; }, |
| + function(x) { receiver = this; value = x; } |
| +); |
| TestAccessorCall( |
| - function() { "use strict"; receiver = this; return 42 }, |
| - function(x) { "use strict"; receiver = this; value = x } |
| -) |
| + function() { "use strict"; receiver = this; return 42; }, |
| + function(x) { "use strict"; receiver = this; value = x; } |
| +); |
| TestAccessorCall( |
| - Proxy.createFunction({}, function() { receiver = this; return 42 }), |
| - Proxy.createFunction({}, function(x) { receiver = this; value = x }) |
| -) |
| + Proxy.createFunction({}, function() { receiver = this; return 42; }), |
| + Proxy.createFunction({}, function(x) { receiver = this; value = x; }) |
| +); |
| TestAccessorCall( |
| - CreateFrozen({}, function() { receiver = this; return 42 }), |
| - CreateFrozen({}, function(x) { receiver = this; value = x }) |
| -) |
| + CreateFrozen({}, function() { receiver = this; return 42; }), |
| + CreateFrozen({}, function(x) { receiver = this; value = x; }) |
| +); |