tor-browser

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

Set-ctor-with-Set.js (2828B)


      1 load(libdir + "asserts.js");
      2 
      3 function testOptimized1() {
      4  var obj = {};
      5  var s = new Set([obj, undefined, 3.1415]);
      6  for (var i = 0; i < 15; i++) {
      7    var clone = new Set(s);
      8    s.add(i); // Not added to `clone`.
      9    s = clone;
     10  }
     11  assertEq(s.size, 3);
     12  assertEq(s.has(obj), true);
     13  assertEq(s.has(undefined), true);
     14  assertEq(s.has(3.1415), true);
     15  assertEq(Array.from(s).toString(), "[object Object],,3.1415");
     16  return s;
     17 }
     18 testOptimized1();
     19 
     20 function testOptimized2() {
     21  var s = new Set();
     22  for (var i = 0; i < 15; i++) {
     23    s = new Set(s);
     24    s.add(i);
     25  }
     26  assertEq(s.size, 15);
     27  assertEq(Array.from(s).toString(), "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14");
     28  return s;
     29 }
     30 testOptimized2();
     31 
     32 function testOtherProto() {
     33  var s = new Set([1, 2, 3]);
     34  Object.setPrototypeOf(s, null);
     35  for (var i = 0; i < 15; i++) {
     36    assertThrowsInstanceOf(() => new Set(s), TypeError);
     37  }
     38 }
     39 testOtherProto();
     40 
     41 function testOwnIteratorProp() {
     42  var s = new Set([1, 2, 3]);
     43  var c = 0;
     44  s[Symbol.iterator] = function() {
     45    c++;
     46    return {next() { return {done: true}; }};
     47  };
     48  for (var i = 0; i < 15; i++) {
     49    assertEq(new Set(s).size, 0);
     50  }
     51  assertEq(c, 15);
     52 }
     53 testOwnIteratorProp();
     54 
     55 function testCustomProtoIteratorProp() {
     56  // Use a new global because this pops a realm fuse.
     57  newGlobal().evaluate(`
     58    var s = new Set([1, 2, 3]);
     59    var c = 0;
     60    assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, true);
     61    Set.prototype[Symbol.iterator] = function() {
     62      c++;
     63      return {next() { return {done: true}; }};
     64    };
     65    assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, false);
     66    for (var i = 0; i < 15; i++) {
     67      assertEq(new Set(s).size, 0);
     68    }
     69    assertEq(c, 15);
     70  `);
     71 }
     72 testCustomProtoIteratorProp();
     73 
     74 function testCustomProtoIteratorPropEmpty() {
     75  newGlobal().evaluate(`
     76    var s = new Set();
     77    var c = 0;
     78    assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, true);
     79    Set.prototype[Symbol.iterator] = function() {
     80      c++;
     81      return {next() { return {done: true}; }};
     82    };
     83    assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, false);
     84    for (var i = 0; i < 15; i++) {
     85      assertEq(new Set(s).size, 0);
     86    }
     87    assertEq(c, 15);
     88  `);
     89 }
     90 testCustomProtoIteratorPropEmpty();
     91 
     92 function testCustomIteratorNext() {
     93  newGlobal().evaluate(`
     94    var iterProto = Object.getPrototypeOf(new Set()[Symbol.iterator]());
     95    var s = new Set([1, 2, 3]);
     96    var c = 0;
     97    assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, true);
     98    iterProto.next = function() {
     99      c++;
    100      return {done: true};
    101    };
    102    assertEq(getFuseState().OptimizeSetObjectIteratorFuse.intact, false);
    103    for (var i = 0; i < 15; i++) {
    104      assertEq(new Set(s).size, 0);
    105    }
    106    assertEq(c, 15);
    107  `);
    108 }
    109 testCustomIteratorNext();