tor-browser

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

sort-trampoline.js (3415B)


      1 function testGC() {
      2  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
      3  for (var i = 0; i < 20; i++) {
      4    arr.sort((x, y) => {
      5      if (i === 17) {
      6        gc();
      7      }
      8      return x.n - y.n;
      9    });
     10  }
     11  assertEq(arr.map(x => x.n).join(""), "0135");
     12 }
     13 testGC();
     14 
     15 function testException() {
     16  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
     17  var ex;
     18  try {
     19    for (var i = 0; i < 20; i++) {
     20      arr.sort((x, y) => {
     21        if (i === 17) {
     22          throw "fit";
     23        }
     24        return x.n - y.n;
     25      });
     26    }
     27  } catch (e) {
     28    ex = e;
     29  }
     30  assertEq(ex, "fit");
     31  assertEq(i, 17);
     32 }
     33 testException();
     34 
     35 function testRectifier() {
     36  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
     37  for (var i = 0; i < 20; i++) {
     38    arr.sort(function(x, y, a) {
     39      assertEq(arguments.length, 2);
     40      assertEq(a, undefined);
     41      return y.n - x.n;
     42    });
     43  }
     44  assertEq(arr.map(x => x.n).join(""), "5310");
     45 }
     46 testRectifier();
     47 
     48 function testClassConstructor() {
     49  var normal = (x, y) => x.n - y.n;
     50  var dummy = {};
     51  var ctor = (class { constructor(x, y) {
     52    assertEq(x, dummy);
     53  }});
     54  // Warm up the constructor.
     55  for (var i = 0; i < 20; i++) {
     56    new ctor(dummy, dummy);
     57  }
     58  for (var i = 0; i < 20; i++) {
     59    var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
     60    var ex;
     61    try {
     62      arr.sort(i < 17 ? normal : ctor);
     63    } catch (e) {
     64      ex = e;
     65    }
     66    assertEq(ex instanceof TypeError, i >= 17);
     67    assertEq(arr.map(x => x.n).join(""), i >= 17 ? "1305" : "0135");
     68  }
     69 }
     70 testClassConstructor();
     71 
     72 function testSwitchRealms() {
     73  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
     74  var g = newGlobal({sameCompartmentAs: this});
     75  g.foo = 123;
     76  var comp = g.evaluate(`((x, y) => {
     77    assertEq(foo, 123);
     78    return x.n - y.n;
     79  })`);
     80  for (var i = 0; i < 20; i++) {
     81    arr.sort(comp);
     82  }
     83  assertEq(arr.map(x => x.n).join(""), "0135");
     84 }
     85 testSwitchRealms();
     86 
     87 function testCrossCompartment() {
     88  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
     89  var g = newGlobal({newCompartment: true});
     90  var wrapper = g.evaluate(`((x, y) => {
     91    return x.n - y.n;
     92  })`);
     93  for (var i = 0; i < 20; i++) {
     94    arr.sort(wrapper);
     95  }
     96  assertEq(arr.map(x => x.n).join(""), "0135");
     97 }
     98 testCrossCompartment();
     99 
    100 function testBound() {
    101  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
    102  var fun = (function(a, x, y) {
    103    "use strict";
    104    assertEq(this, null);
    105    assertEq(a, 1);
    106    return x.n - y.n;
    107  }).bind(null, 1);
    108  for (var i = 0; i < 20; i++) {
    109    arr.sort(fun);
    110  }
    111  assertEq(arr.map(x => x.n).join(""), "0135");
    112 }
    113 testBound();
    114 
    115 function testExtraArgs() {
    116  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
    117  var cmp = (x, y) => x.n - y.n;
    118  for (var i = 0; i < 20; i++) {
    119    arr.sort(cmp, cmp, cmp, cmp, cmp, cmp, cmp);
    120  }
    121  assertEq(arr.map(x => x.n).join(""), "0135");
    122 }
    123 testExtraArgs();
    124 
    125 function testBailout() {
    126  var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}];
    127  for (var i = 0; i < 110; i++) {
    128    arr.sort(function(x, y) {
    129      if (i === 108) {
    130        bailout();
    131      }
    132      return x.n - y.n;
    133    });
    134  }
    135  assertEq(arr.map(x => x.n).join(""), "0135");
    136 }
    137 testBailout();
    138 
    139 function testExceptionHandlerSwitchRealm() {
    140  var g = newGlobal({sameCompartmentAs: this});
    141  for (var i = 0; i < 25; i++) {
    142    var ex = null;
    143    try {
    144      g.Array.prototype.toSorted.call([2, 3], () => {
    145        throw "fit";
    146      });
    147    } catch (e) {
    148      ex = e;
    149    }
    150    assertEq(ex, "fit");
    151  }
    152 }
    153 testExceptionHandlerSwitchRealm();