call-bound-scripted.js (3223B)
1 function testNumBoundArgsGuard() { 2 function f(a, b, c, d, e, f, g, h) { 3 return [a, b, c, d, e, f, g, h].join(","); 4 } 5 var arr = [ 6 f.bind(null, 1, 2, 3, 4, 5, 6), 7 f.bind(null, 4, 5, 6, 7, 8, 9), 8 f.bind(null, 1, 2), 9 f.bind(null, 1), 10 ]; 11 var expected = [ 12 "1,2,3,4,5,6,10,11", 13 "4,5,6,7,8,9,10,11", 14 "1,2,10,11,12,13,14,15", 15 "1,10,11,12,13,14,15,", 16 ]; 17 for (var i = 0; i < 100; i++) { 18 assertEq(arr[0](10, 11, 12, 13, 14, 15), expected[0]); 19 assertEq(arr[1](10, 11, 12, 13, 14, 15), expected[1]); 20 assertEq(arr[2](10, 11, 12, 13, 14, 15), expected[2]); 21 assertEq(arr[3](10, 11, 12, 13, 14, 15), expected[3]); 22 assertEq(arr[i % arr.length](10, 11, 12, 13, 14, 15), expected[i % arr.length]); 23 } 24 } 25 testNumBoundArgsGuard(); 26 27 function testJSFunctionGuard() { 28 var arr = [ 29 (x => x * 0).bind(null, 1), 30 (x => x * 1).bind(null, 2), 31 (x => x * 2).bind(null, 3), 32 (x => x * 3).bind(null, 4), 33 (x => x * 4).bind(null, 5), 34 (x => x * 5).bind(null, 6), 35 (x => x * 6).bind(null, 7), 36 (x => x * 7).bind(null, 8), 37 (x => x * 8).bind(null, 9), 38 ]; 39 var boundNative = Math.abs.bind(null, -123); 40 var boundProxy = (new Proxy(x => x * 42, {})).bind(null, 7); 41 42 for (var i = 0; i < 100; i++) { 43 var idx = i % arr.length; 44 var fun1 = arr[idx]; 45 var expected1 = idx * (idx + 1); 46 assertEq(fun1(), expected1); 47 var fun2 = i > 70 ? boundNative : fun1; 48 assertEq(fun2(), i > 70 ? 123 : expected1); 49 var fun3 = i > 70 ? boundProxy : fun1; 50 assertEq(fun3(), i > 70 ? 294 : expected1); 51 } 52 } 53 testJSFunctionGuard(); 54 55 function testCrossRealmTarget() { 56 globalThis.num = "FAIL"; 57 58 var globals = []; 59 for (var i = 0; i < 4; i++) { 60 var g = newGlobal({sameCompartmentAs: this}); 61 g.num = i; 62 globals.push(g); 63 } 64 var arr = globals.map(g => g.evaluate("(x => this.num)")); 65 arr = arr.map(f => Function.prototype.bind.call(f, null)); 66 67 for (var i = 0; i < 200; i++) { 68 assertEq(arr[0](), 0); 69 var idx = i % arr.length; 70 assertEq(arr[idx](), idx); 71 } 72 } 73 testCrossRealmTarget(); 74 75 // Bug 1819651. 76 function testReturnsItself() { 77 var fun = function() { return boundFun; }; 78 var boundFun = fun.bind(null); 79 for (var i = 0; i < 20; i++) { 80 assertEq(boundFun(), boundFun); 81 assertEq(new boundFun(), boundFun); 82 } 83 } 84 testReturnsItself(); 85 86 function testManyArgs() { 87 var fun = function(a, b, c, d, e, f, g, h, i, j) { 88 return [a, b, c, d, e, f, g, h, i, j].join(","); 89 }; 90 var boundFun1 = fun.bind(null, 1, 2); 91 var boundFun2 = fun.bind(null, 1, 2, 3, 4, 5, 6); 92 for (var i = 0; i < 60; i++) { 93 assertEq(boundFun1(), "1,2,,,,,,,,"); 94 assertEq(boundFun1(10, 11, 12, 13, 14), "1,2,10,11,12,13,14,,,"); 95 assertEq(boundFun1(10, 11, 12, 13, 14, 15, 16, 17), "1,2,10,11,12,13,14,15,16,17"); 96 97 assertEq(boundFun2(), "1,2,3,4,5,6,,,,"); 98 assertEq(boundFun2(10, 11), "1,2,3,4,5,6,10,11,,"); 99 assertEq(boundFun2(10, 11, 12, 13, 14, 15, 16, 17), "1,2,3,4,5,6,10,11,12,13"); 100 } 101 } 102 testManyArgs();