tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

bound-inlinable-native-2.js (3565B)


      1 // Test inlining bound function to inlinable natives when additional bound
      2 // arguments are used.
      3 
      4 function testMathMinBound1() {
      5  // Bind the inlinable native |Math.min|.
      6  // |Math.min| is inlined when up to four arguments are present.
      7  var MathMin = Math.min.bind(null, 4);
      8 
      9  for (var i = 0; i < 100; ++i) {
     10    assertEq(MathMin(i & 7), Math.min(i & 7, 4));
     11  }
     12 }
     13 testMathMinBound1();
     14 
     15 function testMathMinBound2() {
     16  // Bind the inlinable native |Math.min|.
     17  // |Math.min| is inlined when up to four arguments are present.
     18  var MathMin = Math.min.bind(null, 4, 3);
     19 
     20  for (var i = 0; i < 100; ++i) {
     21    assertEq(MathMin(i & 7), Math.min(i & 7, 3));
     22  }
     23 }
     24 testMathMinBound2();
     25 
     26 function testMathMinBound3() {
     27  // Bind the inlinable native |Math.min|.
     28  // |Math.min| is inlined when up to four arguments are present.
     29  var MathMin = Math.min.bind(null, 4, 3, 2);
     30 
     31  for (var i = 0; i < 100; ++i) {
     32    assertEq(MathMin(i & 7), Math.min(i & 7, 2));
     33  }
     34 }
     35 testMathMinBound3();
     36 
     37 function testMathMinBound4() {
     38  // Bind the inlinable native |Math.min|.
     39  // |Math.min| is inlined when up to four arguments are present.
     40  var MathMin = Math.min.bind(null, 4, 3, 2, 1);
     41 
     42  for (var i = 0; i < 100; ++i) {
     43    assertEq(MathMin(), 1);
     44  }
     45 }
     46 testMathMinBound4();
     47 
     48 function testMathMinBound4NoInline() {
     49  // Bind the inlinable native |Math.min|.
     50  // |Math.min| is inlined when up to four arguments are present.
     51  var MathMin = Math.min.bind(null, 4, 3, 2, 1);
     52 
     53  for (var i = 0; i < 100; ++i) {
     54    assertEq(MathMin(i & 7), Math.min(i & 7, 1));
     55  }
     56 }
     57 testMathMinBound4NoInline();
     58 
     59 function testStringCharAt() {
     60  // Bind the inlinable native |String.prototype.charCodeAt| to
     61  // cover reading the |this| value.
     62  var str = "abcdefgh";
     63  var CharAt = String.prototype.charAt.bind(str, 0);
     64 
     65  for (var i = 0; i < 100; ++i) {
     66    assertEq(CharAt(), "a");
     67  }
     68 }
     69 testStringCharAt();
     70 
     71 function testArrayConstructor() {
     72  // Bind the Array constructor function.
     73  var A = Array.bind(null, 10);
     74 
     75  for (var i = 0; i < 100; ++i) {
     76    var a = new A();
     77    assertEq(a.length, 10);
     78    assertEq(Object.getPrototypeOf(a), Array.prototype);
     79  }
     80 }
     81 testArrayConstructor();
     82 
     83 function testMathMaxSpreadNoInline() {
     84  // Spread calls to bound functions aren't supported when additional bound
     85  // arguments are present.
     86  var MathMax = Math.max.bind(null, 0);
     87 
     88  for (var i = 0; i < 100; ++i) {
     89    var args = [i - 1, i, i + 1];
     90    assertEq(MathMax(...args), i + 1);
     91  }
     92 }
     93 testMathMaxSpreadNoInline();
     94 
     95 function testMathMaxVariableBoundArgs() {
     96  // Bound Math.max with different number of bound arguments.
     97  var MathMax = [
     98    Math.max.bind(null, 4),
     99    Math.max.bind(null, 4, 5),
    100  ];
    101 
    102  for (var i = 0; i < 100; ++i) {
    103    assertEq(MathMax[i & 1](i & 7), Math.max(i & 7, 4 + (i & 1)));
    104  }
    105 }
    106 testMathMaxVariableBoundArgs();
    107 
    108 function testFunctionBindWithBoundArgNoInline() {
    109  var array = [];
    110 
    111  // Bound function whose target is |Function.prototype.bind| and whose
    112  // this-value is |Array.prototype.push|. Also pass |array| as the this-value
    113  // for bound function which is returned when calling |FunBind()|.
    114  var FunBind = Function.prototype.bind.bind(Array.prototype.push, array);
    115 
    116  for (var i = 0; i < 100; ++i) {
    117    // Create a new bound function.
    118    //
    119    // This call to the bound target |Function.prototype.bind| won't be inlined,
    120    // because |FunBind| has additional bound arguments.
    121    var push = FunBind();
    122 
    123    assertEq(array.length, i * 3);
    124    push(1, 2, 3);
    125    assertEq(array.length, (i + 1) * 3);
    126  }
    127 }
    128 testFunctionBindWithBoundArgNoInline();