tor-browser

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

map-get-nongcthing.js (7031B)


      1 // Similar test as "cacheir/map-get-nongcthing.js", except that we now perform
      2 // duplicate lookups to ensure GVN works properly.
      3 
      4 // Return a new map, possibly filling some dummy entries to enforce creating
      5 // multiple hash buckets.
      6 function createMap(values, n) {
      7  var xs = [...values];
      8  for (var i = 0; i < n; ++i) {
      9    xs.push({});
     10  }
     11  return new Map(xs.map((x, i) => [x, i + 1]));
     12 }
     13 
     14 function runTest(fn) {
     15  fn(0);
     16  fn(100);
     17 }
     18 
     19 function testInt32_same_map(n) {
     20  var xs = [1, 2];
     21  var ys = [3, 4];
     22  var zs = [...xs, ...ys];
     23  var map = createMap(xs, n);
     24 
     25  var N = 100;
     26  var c = 0;
     27  for (var i = 0; i < N; ++i) {
     28    var z = zs[i & 3];
     29    var v = map.get(z);
     30    if (v !== undefined) c += v;
     31    var w = map.get(z);
     32    if (w !== undefined) c += w;
     33  }
     34  assertEq(c, N + N / 2);
     35 }
     36 runTest(testInt32_same_map);
     37 
     38 function testDouble_same_map(n) {
     39  var xs = [Math.PI, Infinity];
     40  var ys = [Math.E, -Infinity];
     41  var zs = [...xs, ...ys];
     42  var map = createMap(xs, n);
     43 
     44  var N = 100;
     45  var c = 0;
     46  for (var i = 0; i < N; ++i) {
     47    var z = zs[i & 3];
     48    var v = map.get(z);
     49    if (v !== undefined) c += v;
     50    var w = map.get(z);
     51    if (w !== undefined) c += w;
     52  }
     53  assertEq(c, N + N / 2);
     54 }
     55 runTest(testDouble_same_map);
     56 
     57 function testZero_same_map(n) {
     58  var xs = [0, -0];
     59  var ys = [1, -1];
     60  var zs = [...xs, ...ys];
     61  var map = createMap([0], n);
     62 
     63  var N = 100;
     64  var c = 0;
     65  for (var i = 0; i < N; ++i) {
     66    var z = zs[i & 3];
     67    var v = map.get(z);
     68    if (v !== undefined) c += v;
     69    var w = map.get(z);
     70    if (w !== undefined) c += w;
     71  }
     72  assertEq(c, N);
     73 }
     74 runTest(testZero_same_map);
     75 
     76 function testNaN_same_map(n) {
     77  var xs = [NaN, -NaN];
     78  var ys = [1, -1];
     79  var zs = [...xs, ...ys];
     80  var map = createMap([NaN], n);
     81 
     82  var N = 100;
     83  var c = 0;
     84  for (var i = 0; i < N; ++i) {
     85    var z = zs[i & 3];
     86    var v = map.get(z);
     87    if (v !== undefined) c += v;
     88    var w = map.get(z);
     89    if (w !== undefined) c += w;
     90  }
     91  assertEq(c, N);
     92 }
     93 runTest(testNaN_same_map);
     94 
     95 function testUndefinedAndNull_same_map(n) {
     96  var xs = [undefined, null];
     97  var ys = [1, -1];
     98  var zs = [...xs, ...ys];
     99  var map = createMap(xs, n);
    100 
    101  var N = 100;
    102  var c = 0;
    103  for (var i = 0; i < N; ++i) {
    104    var z = zs[i & 3];
    105    var v = map.get(z);
    106    if (v !== undefined) c += v;
    107    var w = map.get(z);
    108    if (w !== undefined) c += w;
    109  }
    110  assertEq(c, N + N / 2);
    111 }
    112 runTest(testUndefinedAndNull_same_map);
    113 
    114 function testBoolean_same_map(n) {
    115  var xs = [true, false];
    116  var ys = [1, -1];
    117  var zs = [...xs, ...ys];
    118  var map = createMap(xs, n);
    119 
    120  var N = 100;
    121  var c = 0;
    122  for (var i = 0; i < N; ++i) {
    123    var z = zs[i & 3];
    124    var v = map.get(z);
    125    if (v !== undefined) c += v;
    126    var w = map.get(z);
    127    if (w !== undefined) c += w;
    128  }
    129  assertEq(c, N + N / 2);
    130 }
    131 runTest(testBoolean_same_map);
    132 
    133 // Duplicate the above tests, but this time use a different map.
    134 
    135 function testInt32_different_map(n) {
    136  var xs = [1, 2];
    137  var ys = [3, 4];
    138  var zs = [...xs, ...ys];
    139  var map1 = createMap(xs, n);
    140  var map2 = createMap(xs, n);
    141 
    142  var N = 100;
    143  var c = 0;
    144  for (var i = 0; i < N; ++i) {
    145    var z = zs[i & 3];
    146    var v = map1.get(z);
    147    if (v !== undefined) c += v;
    148    var w = map2.get(z);
    149    if (w !== undefined) c += w;
    150  }
    151  assertEq(c, N + N / 2);
    152 }
    153 runTest(testInt32_different_map);
    154 
    155 function testDouble_different_map(n) {
    156  var xs = [Math.PI, Infinity];
    157  var ys = [Math.E, -Infinity];
    158  var zs = [...xs, ...ys];
    159  var map1 = createMap(xs, n);
    160  var map2 = createMap(xs, n);
    161 
    162  var N = 100;
    163  var c = 0;
    164  for (var i = 0; i < N; ++i) {
    165    var z = zs[i & 3];
    166    var v = map1.get(z);
    167    if (v !== undefined) c += v;
    168    var w = map2.get(z);
    169    if (w !== undefined) c += w;
    170  }
    171  assertEq(c, N + N / 2);
    172 }
    173 runTest(testDouble_different_map);
    174 
    175 function testZero_different_map(n) {
    176  var xs = [0, -0];
    177  var ys = [1, -1];
    178  var zs = [...xs, ...ys];
    179  var map1 = createMap([0], n);
    180  var map2 = createMap([0], n);
    181 
    182  var N = 100;
    183  var c = 0;
    184  for (var i = 0; i < N; ++i) {
    185    var z = zs[i & 3];
    186    var v = map1.get(z);
    187    if (v !== undefined) c += v;
    188    var w = map2.get(z);
    189    if (w !== undefined) c += w;
    190  }
    191  assertEq(c, N);
    192 }
    193 runTest(testZero_different_map);
    194 
    195 function testNaN_different_map(n) {
    196  var xs = [NaN, -NaN];
    197  var ys = [1, -1];
    198  var zs = [...xs, ...ys];
    199  var map1 = createMap([NaN], n);
    200  var map2 = createMap([NaN], n);
    201 
    202  var N = 100;
    203  var c = 0;
    204  for (var i = 0; i < N; ++i) {
    205    var z = zs[i & 3];
    206    var v = map1.get(z);
    207    if (v !== undefined) c += v;
    208    var w = map2.get(z);
    209    if (w !== undefined) c += w;
    210  }
    211  assertEq(c, N);
    212 }
    213 runTest(testNaN_different_map);
    214 
    215 function testUndefinedAndNull_different_map(n) {
    216  var xs = [undefined, null];
    217  var ys = [1, -1];
    218  var zs = [...xs, ...ys];
    219  var map1 = createMap(xs, n);
    220  var map2 = createMap(xs, n);
    221 
    222  var N = 100;
    223  var c = 0;
    224  for (var i = 0; i < N; ++i) {
    225    var z = zs[i & 3];
    226    var v = map1.get(z);
    227    if (v !== undefined) c += v;
    228    var w = map2.get(z);
    229    if (w !== undefined) c += w;
    230  }
    231  assertEq(c, N + N / 2);
    232 }
    233 runTest(testUndefinedAndNull_different_map);
    234 
    235 function testBoolean_different_map(n) {
    236  var xs = [true, false];
    237  var ys = [1, -1];
    238  var zs = [...xs, ...ys];
    239  var map1 = createMap(xs, n);
    240  var map2 = createMap(xs, n);
    241 
    242  var N = 100;
    243  var c = 0;
    244  for (var i = 0; i < N; ++i) {
    245    var z = zs[i & 3];
    246    var v = map1.get(z);
    247    if (v !== undefined) c += v;
    248    var w = map2.get(z);
    249    if (w !== undefined) c += w;
    250  }
    251  assertEq(c, N + N / 2);
    252 }
    253 runTest(testBoolean_different_map);
    254 
    255 // Test the alias information is correct.
    256 
    257 function testInt32_alias(n) {
    258  var xs = [1, 2];
    259  var map = createMap([], n);
    260 
    261  var N = 100;
    262  var c = 0;
    263  for (var i = 0; i < N; ++i) {
    264    var x = xs[i & 1];
    265 
    266    map.set(x, 1);
    267    var v = map.get(x);
    268 
    269    map.delete(x);
    270    var w = map.get(x);
    271 
    272    c += v;
    273    assertEq(w, undefined);
    274  }
    275  assertEq(c, N);
    276 }
    277 runTest(testInt32_alias);
    278 
    279 function testDouble_alias(n) {
    280  var xs = [Math.PI, Infinity];
    281  var map = createMap([], n);
    282 
    283  var N = 100;
    284  var c = 0;
    285  for (var i = 0; i < N; ++i) {
    286    var x = xs[i & 1];
    287 
    288    map.set(x, 1);
    289    var v = map.get(x);
    290 
    291    map.delete(x);
    292    var w = map.get(x);
    293 
    294    c += v;
    295    assertEq(w, undefined);
    296  }
    297  assertEq(c, N);
    298 }
    299 runTest(testDouble_alias);
    300 
    301 function testUndefinedAndNull_alias(n) {
    302  var xs = [undefined, null];
    303  var map = createMap([], n);
    304 
    305  var N = 100;
    306  var c = 0;
    307  for (var i = 0; i < N; ++i) {
    308    var x = xs[i & 1];
    309 
    310    map.set(x, 1);
    311    var v = map.get(x);
    312 
    313    map.delete(x);
    314    var w = map.get(x);
    315 
    316    c += v;
    317    assertEq(w, undefined);
    318  }
    319  assertEq(c, N);
    320 }
    321 runTest(testUndefinedAndNull_alias);
    322 
    323 function testBoolean_alias(n) {
    324  var xs = [true, false];
    325  var map = createMap([], n);
    326 
    327  var N = 100;
    328  var c = 0;
    329  for (var i = 0; i < N; ++i) {
    330    var x = xs[i & 1];
    331 
    332    map.set(x, 1);
    333    var v = map.get(x);
    334 
    335    map.delete(x);
    336    var w = map.get(x);
    337 
    338    c += v;
    339    assertEq(w, undefined);
    340  }
    341  assertEq(c, N);
    342 }
    343 runTest(testBoolean_alias);