tor-browser

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

mega-morphic-load-and-has-prop.js (2562B)


      1 function testMegamorphicLoadSlot(i) {
      2  var xs = [
      3    {p: 0},
      4    {a: 0, p: 1},
      5    {a: 0, b: 0, p: 2},
      6    {a: 0, b: 0, c: 0, p: 3},
      7    {a: 0, b: 0, c: 0, d: 0, p: 4},
      8    {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5},
      9    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6},
     10    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7},
     11    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8},
     12    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9},
     13  ];
     14  var called = 0;
     15  var obj = {
     16    get p() {
     17      called++;
     18    }
     19  };
     20 
     21  for (var j = 0; j <= 100; ++j) {
     22    // Don't use if-statements to avoid cold code bailouts.
     23    var x = xs[j % 10];
     24    var y = [x, obj][(i === 1 && j === 100)|0];
     25 
     26    // Can't DCE this instruction.
     27    y.p;
     28  }
     29 
     30  assertEq(i === 0 || called === 1, true);
     31 }
     32 for (var i = 0; i < 2; ++i) testMegamorphicLoadSlot(i);
     33 
     34 function testMegamorphicLoadSlotByValue(i) {
     35  var xs = [
     36    {p: 0},
     37    {a: 0, p: 1},
     38    {a: 0, b: 0, p: 2},
     39    {a: 0, b: 0, c: 0, p: 3},
     40    {a: 0, b: 0, c: 0, d: 0, p: 4},
     41    {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5},
     42    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6},
     43    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7},
     44    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8},
     45    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9},
     46  ];
     47  var called = 0;
     48  var obj = {
     49    get p() {
     50      called++;
     51    }
     52  };
     53 
     54  var p = "p";
     55  for (var j = 0; j <= 100; ++j) {
     56    // Don't use if-statements to avoid cold code bailouts.
     57    var x = xs[j % 10];
     58    var y = [x, obj][(i === 1 && j === 100)|0];
     59 
     60    // Can't DCE this instruction.
     61    y[p];
     62  }
     63 
     64  assertEq(i === 0 || called === 1, true);
     65 }
     66 for (var i = 0; i < 2; ++i) testMegamorphicLoadSlotByValue(i);
     67 
     68 function testMegamorphicHasProp(i) {
     69  var xs = [
     70    {p: 0},
     71    {a: 0, p: 1},
     72    {a: 0, b: 0, p: 2},
     73    {a: 0, b: 0, c: 0, p: 3},
     74    {a: 0, b: 0, c: 0, d: 0, p: 4},
     75    {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5},
     76    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6},
     77    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7},
     78    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8},
     79    {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9},
     80  ];
     81  var called = 0;
     82  var obj = new Proxy({}, {
     83    has() {
     84      called++;
     85    }
     86  });
     87 
     88  for (var j = 0; j <= 100; ++j) {
     89    // Don't use if-statements to avoid cold code bailouts.
     90    var x = xs[j % 10];
     91    var y = [x, obj][(i === 1 && j === 100)|0];
     92 
     93    // Can't DCE this instruction.
     94    "p" in y;
     95  }
     96 
     97  assertEq(i === 0 || called === 1, true);
     98 }
     99 for (var i = 0; i < 2; ++i) testMegamorphicHasProp(i);