tor-browser

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

Map-ctor-with-Map.js (2920B)


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