1// Copyright 2011 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// Flags: --harmony-proxies --allow-natives-syntax 29 30 31// TODO(neis): These tests are temporarily commented out because of ongoing 32// changes to the implementation of proxies. 33 34 35//// Ensures that checking the "length" property of a function proxy doesn't 36//// crash due to lack of a [[Get]] method. 37//var handler = { 38// get : function(r, n) { return n == "length" ? 2 : undefined } 39//} 40// 41// 42//// Calling (call, Function.prototype.call, Function.prototype.apply, 43//// Function.prototype.bind). 44// 45//var global_object = this 46//var receiver 47// 48//function TestCall(isStrict, callTrap) { 49// assertEquals(42, callTrap(5, 37)) 50// assertSame(isStrict ? undefined : global_object, receiver) 51// 52// var handler = { 53// get: function(r, k) { 54// return k == "length" ? 2 : Function.prototype[k] 55// } 56// } 57// var f = Proxy.createFunction(handler, callTrap) 58// var o = {f: f} 59// global_object.f = f 60// 61// receiver = 333 62// assertEquals(42, f(11, 31)) 63// assertSame(isStrict ? undefined : global_object, receiver) 64// receiver = 333 65// assertEquals(42, o.f(10, 32)) 66// assertSame(o, receiver) 67// receiver = 333 68// assertEquals(42, o["f"](9, 33)) 69// assertSame(o, receiver) 70// receiver = 333 71// assertEquals(42, (1, o).f(8, 34)) 72// assertSame(o, receiver) 73// receiver = 333 74// assertEquals(42, (1, o)["f"](7, 35)) 75// assertSame(o, receiver) 76// receiver = 333 77// assertEquals(42, f.call(o, 32, 10)) 78// assertSame(o, receiver) 79// receiver = 333 80// assertEquals(42, f.call(undefined, 33, 9)) 81// assertSame(isStrict ? undefined : global_object, receiver) 82// receiver = 333 83// assertEquals(42, f.call(null, 33, 9)) 84// assertSame(isStrict ? null : global_object, receiver) 85// receiver = 333 86// assertEquals(44, f.call(2, 21, 23)) 87// assertSame(2, receiver.valueOf()) 88// receiver = 333 89// assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) 90// assertSame(o, receiver) 91// receiver = 333 92// assertEquals(43, Function.prototype.call.call(f, null, 20, 23)) 93// assertSame(isStrict ? null : global_object, receiver) 94// assertEquals(44, Function.prototype.call.call(f, 2, 21, 23)) 95// assertEquals(2, receiver.valueOf()) 96// receiver = 333 97// assertEquals(32, f.apply(o, [16, 16])) 98// assertSame(o, receiver) 99// receiver = 333 100// assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) 101// assertSame(o, receiver) 102// receiver = 333 103// assertEquals(42, %Call(f, o, 11, 31)); 104// assertSame(o, receiver) 105// receiver = 333 106// assertEquals(42, %Call(f, null, 11, 31)); 107// assertSame(isStrict ? null : global_object, receiver) 108// receiver = 333 109// assertEquals(42, %Apply(f, o, [11, 31], 0, 2)) 110// assertSame(o, receiver) 111// receiver = 333 112// assertEquals(42, %Apply(f, null, [11, 31], 0, 2)) 113// assertSame(isStrict ? null : global_object, receiver) 114// receiver = 333 115// assertEquals(42, %_Call(f, o, 11, 31)) 116// assertSame(o, receiver) 117// receiver = 333 118// assertEquals(42, %_Call(f, null, 11, 31)) 119// assertSame(isStrict ? null : global_object, receiver) 120// 121// var ff = Function.prototype.bind.call(f, o, 12) 122// assertTrue(ff.length <= 1) // TODO(rossberg): Not spec'ed yet, be lax. 123// receiver = 333 124// assertEquals(42, ff(30)) 125// assertSame(o, receiver) 126// receiver = 333 127// assertEquals(33, Function.prototype.call.call(ff, {}, 21)) 128// assertSame(o, receiver) 129// receiver = 333 130// assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) 131// assertSame(o, receiver) 132// receiver = 333 133// assertEquals(23, %Call(ff, {}, 11)); 134// assertSame(o, receiver) 135// receiver = 333 136// assertEquals(23, %Call(ff, {}, 11, 3)); 137// assertSame(o, receiver) 138// receiver = 333 139// assertEquals(24, %Apply(ff, {}, [12, 13], 0, 1)) 140// assertSame(o, receiver) 141// receiver = 333 142// assertEquals(24, %Apply(ff, {}, [12, 13], 0, 2)) 143// assertSame(o, receiver) 144// receiver = 333 145// assertEquals(34, %_Call(ff, {}, 22)) 146// assertSame(o, receiver) 147// receiver = 333 148// assertEquals(34, %_Call(ff, {}, 22, 3)) 149// assertSame(o, receiver) 150// 151// var fff = Function.prototype.bind.call(ff, o, 30) 152// assertEquals(0, fff.length) 153// receiver = 333 154// assertEquals(42, fff()) 155// assertSame(o, receiver) 156// receiver = 333 157// assertEquals(42, Function.prototype.call.call(fff, {})) 158// assertSame(o, receiver) 159// receiver = 333 160// assertEquals(42, Function.prototype.apply.call(fff, {})) 161// assertSame(o, receiver) 162// receiver = 333 163// assertEquals(42, %Call(fff, {})); 164// assertSame(o, receiver) 165// receiver = 333 166// assertEquals(42, %Call(fff, {}, 11, 3)) 167// assertSame(o, receiver) 168// receiver = 333 169// assertEquals(42, %Apply(fff, {}, [], 0, 0)) 170// assertSame(o, receiver) 171// receiver = 333 172// assertEquals(42, %Apply(fff, {}, [12, 13], 0, 0)) 173// assertSame(o, receiver) 174// receiver = 333 175// assertEquals(42, %Apply(fff, {}, [12, 13], 0, 2)) 176// assertSame(o, receiver) 177// receiver = 333 178// assertEquals(42, %_Call(fff, {})) 179// assertSame(o, receiver) 180// receiver = 333 181// assertEquals(42, %_Call(fff, {}, 3, 4, 5)) 182// assertSame(o, receiver) 183// 184// var f = CreateFrozen({}, callTrap) 185// receiver = 333 186// assertEquals(42, f(11, 31)) 187// assertSame(isStrict ? undefined : global_object, receiver) 188// var o = {f: f} 189// receiver = 333 190// assertEquals(42, o.f(10, 32)) 191// assertSame(o, receiver) 192// receiver = 333 193// assertEquals(42, o["f"](9, 33)) 194// assertSame(o, receiver) 195// receiver = 333 196// assertEquals(42, (1, o).f(8, 34)) 197// assertSame(o, receiver) 198// receiver = 333 199// assertEquals(42, (1, o)["f"](7, 35)) 200// assertSame(o, receiver) 201// receiver = 333 202// assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) 203// assertSame(o, receiver) 204// receiver = 333 205// assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) 206// assertSame(o, receiver) 207// receiver = 333 208// assertEquals(23, %Call(f, o, 11, 12)) 209// assertSame(o, receiver) 210// receiver = 333 211// assertEquals(27, %Apply(f, o, [12, 13, 14], 1, 2)) 212// assertSame(o, receiver) 213// receiver = 333 214// assertEquals(42, %_Call(f, o, 18, 24)) 215// assertSame(o, receiver) 216//} 217// 218//TestCall(false, function(x, y) { 219// receiver = this 220// return x + y 221//}) 222// 223//TestCall(true, function(x, y) { 224// "use strict" 225// receiver = this 226// return x + y 227//}) 228// 229//TestCall(false, function() { 230// receiver = this 231// return arguments[0] + arguments[1] 232//}) 233// 234//TestCall(false, Proxy.createFunction(handler, function(x, y) { 235// receiver = this 236// return x + y 237//})) 238// 239//TestCall(true, Proxy.createFunction(handler, function(x, y) { 240// "use strict" 241// receiver = this 242// return x + y 243//})) 244// 245//TestCall(false, CreateFrozen(handler, function(x, y) { 246// receiver = this 247// return x + y 248//})) 249// 250// 251// 252//// Using intrinsics as call traps. 253// 254//function TestCallIntrinsic(type, callTrap) { 255// var f = Proxy.createFunction({}, callTrap) 256// var x = f() 257// assertTrue(typeof x == type) 258//} 259// 260//TestCallIntrinsic("boolean", Boolean) 261//TestCallIntrinsic("number", Number) 262//TestCallIntrinsic("string", String) 263//TestCallIntrinsic("object", Object) 264//TestCallIntrinsic("function", Function) 265// 266// 267// 268//// Throwing from call trap. 269// 270//function TestCallThrow(callTrap) { 271// var f = Proxy.createFunction({}, callTrap) 272// assertThrows(function(){ f(11) }, "myexn") 273// assertThrows(function(){ ({x: f}).x(11) }, "myexn") 274// assertThrows(function(){ ({x: f})["x"](11) }, "myexn") 275// assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") 276// assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") 277// assertThrows(function(){ %Call(f, {}) }, "myexn") 278// assertThrows(function(){ %Call(f, {}, 1, 2) }, "myexn") 279// assertThrows(function(){ %Apply({}, f, [], 3, 0) }, "myexn") 280// assertThrows(function(){ %Apply({}, f, [3, 4], 0, 1) }, "myexn") 281// assertThrows(function(){ %_Call(f, {}) }, "myexn") 282// assertThrows(function(){ %_Call(f, {}, 1, 2) }, "myexn") 283// 284// var f = CreateFrozen({}, callTrap) 285// assertThrows(function(){ f(11) }, "myexn") 286// assertThrows(function(){ ({x: f}).x(11) }, "myexn") 287// assertThrows(function(){ ({x: f})["x"](11) }, "myexn") 288// assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") 289// assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") 290// assertThrows(function(){ %Call(f, {}) }, "myexn") 291// assertThrows(function(){ %Call(f, {}, 1, 2) }, "myexn") 292// assertThrows(function(){ %Apply({}, f, [], 3, 0) }, "myexn") 293// assertThrows(function(){ %Apply({}, f, [3, 4], 0, 1) }, "myexn") 294// assertThrows(function(){ %_Call(f, {}) }, "myexn") 295// assertThrows(function(){ %_Call(f, {}, 1, 2) }, "myexn") 296//} 297// 298//TestCallThrow(function() { throw "myexn" }) 299//TestCallThrow(Proxy.createFunction({}, function() { throw "myexn" })) 300//TestCallThrow(CreateFrozen({}, function() { throw "myexn" })) 301// 302// 303// 304//// Construction (new). 305// 306//var prototype = {myprop: 0} 307//var receiver 308// 309//var handlerWithPrototype = { 310// fix: function() { return { prototype: { value: prototype } }; }, 311// get: function(r, n) { 312// if (n == "length") return 2; 313// assertEquals("prototype", n); 314// return prototype; 315// } 316//} 317// 318//var handlerSansPrototype = { 319// fix: function() { return { length: { value: 2 } } }, 320// get: function(r, n) { 321// if (n == "length") return 2; 322// assertEquals("prototype", n); 323// return undefined; 324// } 325//} 326// 327//function ReturnUndef(x, y) { 328// "use strict"; 329// receiver = this; 330// this.sum = x + y; 331//} 332// 333//function ReturnThis(x, y) { 334// "use strict"; 335// receiver = this; 336// this.sum = x + y; 337// return this; 338//} 339// 340//function ReturnNew(x, y) { 341// "use strict"; 342// receiver = this; 343// return {sum: x + y}; 344//} 345// 346//function ReturnNewWithProto(x, y) { 347// "use strict"; 348// receiver = this; 349// var result = Object.create(prototype); 350// result.sum = x + y; 351// return result; 352//} 353// 354//function TestConstruct(proto, constructTrap) { 355// TestConstruct2(proto, constructTrap, handlerWithPrototype) 356// TestConstruct2(proto, constructTrap, handlerSansPrototype) 357//} 358// 359//function TestConstruct2(proto, constructTrap, handler) { 360// var f = Proxy.createFunction(handler, function() {}, constructTrap) 361// var o = new f(11, 31) 362// assertEquals(undefined, receiver) 363// assertEquals(42, o.sum) 364// assertSame(proto, Object.getPrototypeOf(o)) 365// 366// var f = CreateFrozen(handler, function() {}, constructTrap) 367// var o = new f(11, 32) 368// assertEquals(undefined, receiver) 369// assertEquals(43, o.sum) 370// assertSame(proto, Object.getPrototypeOf(o)) 371//} 372// 373//TestConstruct(Object.prototype, ReturnNew) 374//TestConstruct(prototype, ReturnNewWithProto) 375// 376//TestConstruct(Object.prototype, Proxy.createFunction(handler, ReturnNew)) 377//TestConstruct(prototype, Proxy.createFunction(handler, ReturnNewWithProto)) 378// 379//TestConstruct(Object.prototype, CreateFrozen(handler, ReturnNew)) 380//TestConstruct(prototype, CreateFrozen(handler, ReturnNewWithProto)) 381// 382// 383// 384//// Construction with derived construct trap. 385// 386//function TestConstructFromCall(proto, returnsThis, callTrap) { 387// TestConstructFromCall2(prototype, returnsThis, callTrap, handlerWithPrototype) 388// TestConstructFromCall2(proto, returnsThis, callTrap, handlerSansPrototype) 389//} 390// 391//function TestConstructFromCall2(proto, returnsThis, callTrap, handler) { 392// // TODO(rossberg): handling of prototype for derived construct trap will be 393// // fixed in a separate change. Commenting out checks below for now. 394// var f = Proxy.createFunction(handler, callTrap) 395// var o = new f(11, 31) 396// if (returnsThis) assertEquals(o, receiver) 397// assertEquals(42, o.sum) 398// // assertSame(proto, Object.getPrototypeOf(o)) 399// 400// var g = CreateFrozen(handler, callTrap) 401// // assertSame(f.prototype, g.prototype) 402// var o = new g(11, 32) 403// if (returnsThis) assertEquals(o, receiver) 404// assertEquals(43, o.sum) 405// // assertSame(proto, Object.getPrototypeOf(o)) 406//} 407// 408//TestConstructFromCall(Object.prototype, true, ReturnUndef) 409//TestConstructFromCall(Object.prototype, true, ReturnThis) 410//TestConstructFromCall(Object.prototype, false, ReturnNew) 411//TestConstructFromCall(prototype, false, ReturnNewWithProto) 412// 413//TestConstructFromCall(Object.prototype, true, 414// Proxy.createFunction(handler, ReturnUndef)) 415//TestConstructFromCall(Object.prototype, true, 416// Proxy.createFunction(handler, ReturnThis)) 417//TestConstructFromCall(Object.prototype, false, 418// Proxy.createFunction(handler, ReturnNew)) 419//TestConstructFromCall(prototype, false, 420// Proxy.createFunction(handler, ReturnNewWithProto)) 421// 422//TestConstructFromCall(Object.prototype, true, CreateFrozen({}, ReturnUndef)) 423//TestConstructFromCall(Object.prototype, true, CreateFrozen({}, ReturnThis)) 424//TestConstructFromCall(Object.prototype, false, CreateFrozen({}, ReturnNew)) 425//TestConstructFromCall(prototype, false, CreateFrozen({}, ReturnNewWithProto)) 426// 427//ReturnUndef.prototype = prototype 428//ReturnThis.prototype = prototype 429//ReturnNew.prototype = prototype 430//ReturnNewWithProto.prototype = prototype 431// 432//TestConstructFromCall(prototype, true, ReturnUndef) 433//TestConstructFromCall(prototype, true, ReturnThis) 434//TestConstructFromCall(Object.prototype, false, ReturnNew) 435//TestConstructFromCall(prototype, false, ReturnNewWithProto) 436// 437//TestConstructFromCall(Object.prototype, true, 438// Proxy.createFunction(handler, ReturnUndef)) 439//TestConstructFromCall(Object.prototype, true, 440// Proxy.createFunction(handler, ReturnThis)) 441//TestConstructFromCall(Object.prototype, false, 442// Proxy.createFunction(handler, ReturnNew)) 443//TestConstructFromCall(prototype, false, 444// Proxy.createFunction(handler, ReturnNewWithProto)) 445// 446//TestConstructFromCall(prototype, true, 447// Proxy.createFunction(handlerWithPrototype, ReturnUndef)) 448//TestConstructFromCall(prototype, true, 449// Proxy.createFunction(handlerWithPrototype, ReturnThis)) 450//TestConstructFromCall(Object.prototype, false, 451// Proxy.createFunction(handlerWithPrototype, ReturnNew)) 452//TestConstructFromCall(prototype, false, 453// Proxy.createFunction(handlerWithPrototype, 454// ReturnNewWithProto)) 455// 456//TestConstructFromCall(prototype, true, 457// CreateFrozen(handlerWithPrototype, ReturnUndef)) 458//TestConstructFromCall(prototype, true, 459// CreateFrozen(handlerWithPrototype, ReturnThis)) 460//TestConstructFromCall(Object.prototype, false, 461// CreateFrozen(handlerWithPrototype, ReturnNew)) 462//TestConstructFromCall(prototype, false, 463// CreateFrozen(handlerWithPrototype, ReturnNewWithProto)) 464// 465// 466// 467//// Throwing from the construct trap. 468// 469//function TestConstructThrow(trap) { 470// TestConstructThrow2(Proxy.createFunction({ fix: function() {return {};} }, 471// trap)) 472// TestConstructThrow2(Proxy.createFunction({ fix: function() {return {};} }, 473// function() {}, 474// trap)) 475//} 476// 477//function TestConstructThrow2(f) { 478// assertThrows(function(){ new f(11) }, "myexn") 479// Object.freeze(f) 480// assertThrows(function(){ new f(11) }, "myexn") 481//} 482// 483//TestConstructThrow(function() { throw "myexn" }) 484//TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) 485//TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) 486// 487// 488// 489//// Using function proxies as getters and setters. 490// 491//var value 492//var receiver 493// 494//function TestAccessorCall(getterCallTrap, setterCallTrap) { 495// var handler = { fix: function() { return {} } } 496// var pgetter = Proxy.createFunction(handler, getterCallTrap) 497// var psetter = Proxy.createFunction(handler, setterCallTrap) 498// 499// var o = {} 500// var oo = Object.create(o) 501// Object.defineProperty(o, "a", {get: pgetter, set: psetter}) 502// Object.defineProperty(o, "b", {get: pgetter}) 503// Object.defineProperty(o, "c", {set: psetter}) 504// Object.defineProperty(o, "3", {get: pgetter, set: psetter}) 505// Object.defineProperty(oo, "a", {value: 43}) 506// 507// receiver = "" 508// assertEquals(42, o.a) 509// assertSame(o, receiver) 510// receiver = "" 511// assertEquals(42, o.b) 512// assertSame(o, receiver) 513// receiver = "" 514// assertEquals(undefined, o.c) 515// assertEquals("", receiver) 516// receiver = "" 517// assertEquals(42, o["a"]) 518// assertSame(o, receiver) 519// receiver = "" 520// assertEquals(42, o[3]) 521// assertSame(o, receiver) 522// 523// receiver = "" 524// assertEquals(43, oo.a) 525// assertEquals("", receiver) 526// receiver = "" 527// assertEquals(42, oo.b) 528// assertSame(oo, receiver) 529// receiver = "" 530// assertEquals(undefined, oo.c) 531// assertEquals("", receiver) 532// receiver = "" 533// assertEquals(43, oo["a"]) 534// assertEquals("", receiver) 535// receiver = "" 536// assertEquals(42, oo[3]) 537// assertSame(oo, receiver) 538// 539// receiver = "" 540// assertEquals(50, o.a = 50) 541// assertSame(o, receiver) 542// assertEquals(50, value) 543// receiver = "" 544// assertEquals(51, o.b = 51) 545// assertEquals("", receiver) 546// assertEquals(50, value) // no setter 547// assertThrows(function() { "use strict"; o.b = 51 }, TypeError) 548// receiver = "" 549// assertEquals(52, o.c = 52) 550// assertSame(o, receiver) 551// assertEquals(52, value) 552// receiver = "" 553// assertEquals(53, o["a"] = 53) 554// assertSame(o, receiver) 555// assertEquals(53, value) 556// receiver = "" 557// assertEquals(54, o[3] = 54) 558// assertSame(o, receiver) 559// assertEquals(54, value) 560// 561// value = 0 562// receiver = "" 563// assertEquals(60, oo.a = 60) 564// assertEquals("", receiver) 565// assertEquals(0, value) // oo has own 'a' 566// assertEquals(61, oo.b = 61) 567// assertSame("", receiver) 568// assertEquals(0, value) // no setter 569// assertThrows(function() { "use strict"; oo.b = 61 }, TypeError) 570// receiver = "" 571// assertEquals(62, oo.c = 62) 572// assertSame(oo, receiver) 573// assertEquals(62, value) 574// receiver = "" 575// assertEquals(63, oo["c"] = 63) 576// assertSame(oo, receiver) 577// assertEquals(63, value) 578// receiver = "" 579// assertEquals(64, oo[3] = 64) 580// assertSame(oo, receiver) 581// assertEquals(64, value) 582//} 583// 584//TestAccessorCall( 585// function() { receiver = this; return 42 }, 586// function(x) { receiver = this; value = x } 587//) 588// 589//TestAccessorCall( 590// function() { "use strict"; receiver = this; return 42 }, 591// function(x) { "use strict"; receiver = this; value = x } 592//) 593// 594//TestAccessorCall( 595// Proxy.createFunction({}, function() { receiver = this; return 42 }), 596// Proxy.createFunction({}, function(x) { receiver = this; value = x }) 597//) 598// 599//TestAccessorCall( 600// CreateFrozen({}, function() { receiver = this; return 42 }), 601// CreateFrozen({}, function(x) { receiver = this; value = x }) 602//) 603// 604// 605// 606//// Passing a proxy function to higher-order library functions. 607// 608//function TestHigherOrder(f) { 609// assertEquals(6, [6, 2].map(f)[0]) 610// assertEquals(4, [5, 2].reduce(f, 4)) 611// assertTrue([1, 2].some(f)) 612// assertEquals("a.b.c", "a.b.c".replace(".", f)) 613//} 614// 615//TestHigherOrder(function(x) { return x }) 616//TestHigherOrder(function(x) { "use strict"; return x }) 617//TestHigherOrder(Proxy.createFunction({}, function(x) { return x })) 618//TestHigherOrder(CreateFrozen({}, function(x) { return x })) 619// 620// 621// 622//// TODO(rossberg): Ultimately, I want to have the following test function 623//// run through, but it currently fails on so many cases (some not even 624//// involving proxies), that I leave that for later... 625///* 626//function TestCalls() { 627// var handler = { 628// get: function(r, k) { 629// return k == "length" ? 2 : Function.prototype[k] 630// } 631// } 632// var bind = Function.prototype.bind 633// var o = {} 634// 635// var traps = [ 636// function(x, y) { 637// return {receiver: this, result: x + y, strict: false} 638// }, 639// function(x, y) { "use strict"; 640// return {receiver: this, result: x + y, strict: true} 641// }, 642// function() { 643// var x = arguments[0], y = arguments[1] 644// return {receiver: this, result: x + y, strict: false} 645// }, 646// Proxy.createFunction(handler, function(x, y) { 647// return {receiver: this, result: x + y, strict: false} 648// }), 649// Proxy.createFunction(handler, function() { 650// var x = arguments[0], y = arguments[1] 651// return {receiver: this, result: x + y, strict: false} 652// }), 653// Proxy.createFunction(handler, function(x, y) { "use strict" 654// return {receiver: this, result: x + y, strict: true} 655// }), 656// CreateFrozen(handler, function(x, y) { 657// return {receiver: this, result: x + y, strict: false} 658// }), 659// CreateFrozen(handler, function(x, y) { "use strict" 660// return {receiver: this, result: x + y, strict: true} 661// }), 662// ] 663// var creates = [ 664// function(trap) { return trap }, 665// function(trap) { return CreateFrozen({}, callTrap) }, 666// function(trap) { return Proxy.createFunction(handler, callTrap) }, 667// function(trap) { 668// return Proxy.createFunction(handler, CreateFrozen({}, callTrap)) 669// }, 670// function(trap) { 671// return Proxy.createFunction(handler, Proxy.createFunction(handler, callTrap)) 672// }, 673// ] 674// var binds = [ 675// function(f, o, x, y) { return f }, 676// function(f, o, x, y) { return bind.call(f, o) }, 677// function(f, o, x, y) { return bind.call(f, o, x) }, 678// function(f, o, x, y) { return bind.call(f, o, x, y) }, 679// function(f, o, x, y) { return bind.call(f, o, x, y, 5) }, 680// function(f, o, x, y) { return bind.call(bind.call(f, o), {}, x, y) }, 681// function(f, o, x, y) { return bind.call(bind.call(f, o, x), {}, y) }, 682// function(f, o, x, y) { return bind.call(bind.call(f, o, x, y), {}, 5) }, 683// ] 684// var calls = [ 685// function(f, x, y) { return f(x, y) }, 686// function(f, x, y) { var g = f; return g(x, y) }, 687// function(f, x, y) { with ({}) return f(x, y) }, 688// function(f, x, y) { var g = f; with ({}) return g(x, y) }, 689// function(f, x, y, o) { with (o) return f(x, y) }, 690// function(f, x, y, o) { return f.call(o, x, y) }, 691// function(f, x, y, o) { return f.apply(o, [x, y]) }, 692// function(f, x, y, o) { return Function.prototype.call.call(f, o, x, y) }, 693// function(f, x, y, o) { return Function.prototype.apply.call(f, o, [x, y]) }, 694// function(f, x, y, o) { return %_Call(f, o, x, y) }, 695// function(f, x, y, o) { return %Call(f, o, x, y) }, 696// function(f, x, y, o) { return %Apply(f, o, [null, x, y, null], 1, 2) }, 697// function(f, x, y, o) { return %Apply(f, o, arguments, 2, 2) }, 698// function(f, x, y, o) { if (typeof o == "object") return o.f(x, y) }, 699// function(f, x, y, o) { if (typeof o == "object") return o["f"](x, y) }, 700// function(f, x, y, o) { if (typeof o == "object") return (1, o).f(x, y) }, 701// function(f, x, y, o) { if (typeof o == "object") return (1, o)["f"](x, y) }, 702// ] 703// var receivers = [o, global_object, undefined, null, 2, "bla", true] 704// var expectedSloppies = [o, global_object, global_object, global_object] 705// 706// for (var t = 0; t < traps.length; ++t) { 707// for (var i = 0; i < creates.length; ++i) { 708// for (var j = 0; j < binds.length; ++j) { 709// for (var k = 0; k < calls.length; ++k) { 710// for (var m = 0; m < receivers.length; ++m) { 711// for (var n = 0; n < receivers.length; ++n) { 712// var bound = receivers[m] 713// var receiver = receivers[n] 714// var func = binds[j](creates[i](traps[t]), bound, 31, 11) 715// var expected = j > 0 ? bound : receiver 716// var expectedSloppy = expectedSloppies[j > 0 ? m : n] 717// o.f = func 718// global_object.f = func 719// var x = calls[k](func, 11, 31, receiver) 720// if (x !== undefined) { 721// assertEquals(42, x.result) 722// if (calls[k].length < 4) 723// assertSame(x.strict ? undefined : global_object, x.receiver) 724// else if (x.strict) 725// assertSame(expected, x.receiver) 726// else if (expectedSloppy === undefined) 727// assertSame(expected, x.receiver.valueOf()) 728// else 729// assertSame(expectedSloppy, x.receiver) 730// } 731// } 732// } 733// } 734// } 735// } 736// } 737//} 738// 739//TestCalls() 740//*/ 741// 742//var realms = [Realm.create(), Realm.create()]; 743//Realm.shared = {}; 744// 745//Realm.eval(realms[0], "function f() { return this; };"); 746//Realm.eval(realms[0], "Realm.shared.f = f;"); 747//Realm.eval(realms[0], "Realm.shared.fg = this;"); 748//Realm.eval(realms[1], "function g() { return this; };"); 749//Realm.eval(realms[1], "Realm.shared.g = g;"); 750//Realm.eval(realms[1], "Realm.shared.gg = this;"); 751// 752//var fp = Proxy.createFunction({}, Realm.shared.f); 753//var gp = Proxy.createFunction({}, Realm.shared.g); 754// 755//for (var i = 0; i < 10; i++) { 756// assertEquals(Realm.shared.fg, fp()); 757// assertEquals(Realm.shared.gg, gp()); 758// 759// with (this) { 760// assertEquals(this, fp()); 761// assertEquals(this, gp()); 762// } 763// 764// with ({}) { 765// assertEquals(Realm.shared.fg, fp()); 766// assertEquals(Realm.shared.gg, gp()); 767// } 768//} 769