bound-fun-apply-inlinable-native.js (2935B)
1 // Test inlining bound fun_apply to inlinable natives. 2 3 function testNoBoundThis() { 4 var ArrayJoin = Function.prototype.apply.bind(Array.prototype.join); 5 6 var xs = [ 7 [], 8 ["a"], 9 ["a", "b"], 10 ["a", "b", "c"], 11 ]; 12 13 for (var i = 0; i < 100; ++i) { 14 var x = xs[i & 3]; 15 assertEq(ArrayJoin(x), x.join()); 16 assertEq(ArrayJoin(x, null), x.join()); 17 assertEq(ArrayJoin(x, undefined), x.join()); 18 19 // Not optimized cases. 20 assertEq(ArrayJoin(x, []), x.join()); 21 assertEq(ArrayJoin(x, [""]), x.join("")); 22 } 23 } 24 testNoBoundThis(); 25 26 function testBoundThis() { 27 var array = ["a", "b"]; 28 var ArrayJoin = Function.prototype.apply.bind(Array.prototype.join, array); 29 30 for (var i = 0; i < 100; ++i) { 31 assertEq(ArrayJoin(), "a,b"); 32 assertEq(ArrayJoin(null), "a,b"); 33 assertEq(ArrayJoin(undefined), "a,b"); 34 35 // Not optimized cases. 36 assertEq(ArrayJoin([]), "a,b"); 37 assertEq(ArrayJoin([""]), "ab"); 38 } 39 } 40 testBoundThis(); 41 42 function testBoundThisAndArgs() { 43 var array = ["a", "b"]; 44 var ArrayJoinNull = Function.prototype.apply.bind(Array.prototype.join, array, null); 45 var ArrayJoinUndefined = Function.prototype.apply.bind(Array.prototype.join, array, undefined); 46 var ArrayJoinEmptyArgs = Function.prototype.apply.bind(Array.prototype.join, array, []); 47 var ArrayJoinWithArgs = Function.prototype.apply.bind(Array.prototype.join, array, [""]); 48 49 for (var i = 0; i < 100; ++i) { 50 assertEq(ArrayJoinNull(), "a,b"); 51 assertEq(ArrayJoinUndefined(), "a,b"); 52 53 // Not optimized cases. 54 assertEq(ArrayJoinEmptyArgs(), "a,b"); 55 assertEq(ArrayJoinWithArgs(), "ab"); 56 } 57 } 58 testBoundThisAndArgs(); 59 60 function testUndefinedGuard() { 61 var array = ["a", "b"]; 62 63 var ArrayJoin = Function.prototype.apply.bind(Array.prototype.join); 64 var ArrayJoinBoundThis = Function.prototype.apply.bind(Array.prototype.join, array); 65 66 var args = [ 67 null, 68 [""], 69 ]; 70 var expected = [ 71 "a,b", 72 "ab", 73 ]; 74 75 for (var i = 0; i < 100; i++) { 76 var index = (i > 50)|0; 77 78 assertEq(ArrayJoin(array, args[index]), expected[index]); 79 assertEq(ArrayJoinBoundThis(args[index]), expected[index]); 80 } 81 } 82 testUndefinedGuard(); 83 84 function testUndefinedBoundArgsGuard() { 85 var array = ["a", "b"]; 86 87 var ArrayJoinBoundNull = Function.prototype.apply.bind(Array.prototype.join, array, null); 88 var ArrayJoinBoundUndefined = Function.prototype.apply.bind(Array.prototype.join, array, undefined); 89 var ArrayJoinBoundArgs = Function.prototype.apply.bind(Array.prototype.join, array, [""]); 90 91 var fns = [ 92 [ 93 ArrayJoinBoundNull, 94 ArrayJoinBoundArgs, 95 ], 96 [ 97 ArrayJoinBoundUndefined, 98 ArrayJoinBoundArgs, 99 ], 100 ]; 101 var expected = [ 102 "a,b", 103 "ab", 104 ]; 105 106 for (var i = 0; i < 100; i++) { 107 var index = (i > 50)|0; 108 109 assertEq(fns[0][index](), expected[index]); 110 assertEq(fns[1][index](), expected[index]); 111 } 112 } 113 testUndefinedBoundArgsGuard();