tor-browser

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

add-dense-element-non-writable-length.js (3225B)


      1 // Add dense elements to packed and non-packed arrays. Cover both mono- and
      2 // polymorphic call sites. Change array length to non-writable during execution.
      3 
      4 function testAddDenseEmpty() {
      5  var array = [];
      6 
      7  function store(ar, index) {
      8    ar[index] = index;
      9  }
     10 
     11  for (var i = 0; i < 10; ++i) {
     12    if (i === 5) {
     13      Object.defineProperty(array, "length", {writable: false});
     14    }
     15    store(array, i);
     16  }
     17 
     18  assertEq(array.length, 5);
     19  for (var i = 0; i < 5; ++i) {
     20    assertEq(array[i], i);
     21  }
     22  for (var i = 5; i < 10; ++i) {
     23    assertEq(i in array, false);
     24  }
     25 }
     26 testAddDenseEmpty();
     27 
     28 function testAddDensePacked() {
     29  var array = [0, 1];
     30 
     31  function store(ar, index) {
     32    ar[index] = index;
     33  }
     34 
     35  for (var i = 2; i < 10; ++i) {
     36    if (i === 5) {
     37      Object.defineProperty(array, "length", {writable: false});
     38    }
     39    store(array, i);
     40  }
     41 
     42  assertEq(array.length, 5);
     43  for (var i = 0; i < 5; ++i) {
     44    assertEq(array[i], i);
     45  }
     46  for (var i = 5; i < 10; ++i) {
     47    assertEq(i in array, false);
     48  }
     49 }
     50 testAddDensePacked();
     51 
     52 function testAddDenseNonPacked() {
     53  var array = [/* hole */, 1];
     54 
     55  function store(ar, index) {
     56    ar[index] = index;
     57  }
     58 
     59  for (var i = 2; i < 10; ++i) {
     60    if (i === 5) {
     61      Object.defineProperty(array, "length", {writable: false});
     62    }
     63    store(array, i);
     64  }
     65 
     66  assertEq(array.length, 5);
     67  assertEq(0 in array, false);
     68  for (var i = 1; i < 5; ++i) {
     69    assertEq(array[i], i);
     70  }
     71  for (var i = 5; i < 10; ++i) {
     72    assertEq(i in array, false);
     73  }
     74 }
     75 testAddDenseNonPacked();
     76 
     77 function testAddDenseEmptyPoly() {
     78  var array = [];
     79 
     80  function store(ar, index) {
     81    ar[index] = index;
     82  }
     83 
     84  var objects = [array, {}];
     85 
     86  for (var i = 0; i < 10; ++i) {
     87    if (i === 5) {
     88      Object.defineProperty(array, "length", {writable: false});
     89    }
     90    for (var j = 0; j < objects.length; ++j) {
     91      store(objects[j], i);
     92    }
     93  }
     94 
     95  assertEq(array.length, 5);
     96  for (var i = 0; i < 5; ++i) {
     97    assertEq(array[i], i);
     98  }
     99  for (var i = 5; i < 10; ++i) {
    100    assertEq(i in array, false);
    101  }
    102 }
    103 testAddDenseEmptyPoly();
    104 
    105 function testAddDensePackedPoly() {
    106  var array = [0, 1];
    107 
    108  function store(ar, index) {
    109    ar[index] = index;
    110  }
    111 
    112  var objects = [array, {}];
    113 
    114  for (var i = 2; i < 10; ++i) {
    115    if (i === 5) {
    116      Object.defineProperty(array, "length", {writable: false});
    117    }
    118    for (var j = 0; j < objects.length; ++j) {
    119      store(objects[j], i);
    120    }
    121  }
    122 
    123  assertEq(array.length, 5);
    124  for (var i = 0; i < 5; ++i) {
    125    assertEq(array[i], i);
    126  }
    127  for (var i = 5; i < 10; ++i) {
    128    assertEq(i in array, false);
    129  }
    130 }
    131 testAddDensePackedPoly();
    132 
    133 function testAddDenseNonPackedPoly() {
    134  var array = [/* hole */, 1];
    135 
    136  function store(ar, index) {
    137    ar[index] = index;
    138  }
    139 
    140  var objects = [array, {}];
    141 
    142  for (var i = 2; i < 10; ++i) {
    143    if (i === 5) {
    144      Object.defineProperty(array, "length", {writable: false});
    145    }
    146    for (var j = 0; j < objects.length; ++j) {
    147      store(objects[j], i);
    148    }
    149  }
    150 
    151  assertEq(array.length, 5);
    152  assertEq(0 in array, false);
    153  for (var i = 1; i < 5; ++i) {
    154    assertEq(array[i], i);
    155  }
    156  for (var i = 5; i < 10; ++i) {
    157    assertEq(i in array, false);
    158  }
    159 }
    160 testAddDenseNonPackedPoly();