tor-browser

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

write-aligned.js (1950B)


      1 // Test aligned write access.
      2 
      3 load(libdir + "dataview.js");
      4 
      5 // Create a new test function for each scalar type.
      6 function createWrite(data) {
      7  const name = typeName(data.type);
      8  const offset = 0;
      9 
     10  return Function("data", `
     11    const {values, littleEndian, bigEndian} = data;
     12 
     13    // Load from array so that Ion doesn't treat as constants.
     14    const True = [true, 1];
     15    const False = [false, 0];
     16 
     17    const src = new ${data.type.name}(values);
     18 
     19    const ab = new ArrayBuffer(${data.type.BYTES_PER_ELEMENT + offset});
     20    const dv = new DataView(ab);
     21 
     22    const srcUint8 = new Uint8Array(src.buffer);
     23    const dstUint8 = new Uint8Array(ab);
     24 
     25    function assertSameContents(idx, msg) {
     26      for (let i = 0; i < ${data.type.BYTES_PER_ELEMENT}; ++i) {
     27        assertEq(dstUint8[i + ${offset}], srcUint8[i + idx * ${data.type.BYTES_PER_ELEMENT}]);
     28      }
     29    }
     30 
     31    for (let i = 0; i < 100; ++i) {
     32      let j = i % values.length;
     33 
     34      // Skip over NaNs to avoid false-negatives due to NaN canonicalisation.
     35      if (${name === "Float16" || name === "Float32" || name === "Float64"}) {
     36        if (Number.isNaN(bigEndian[j]) || Number.isNaN(littleEndian[j])) {
     37          continue;
     38        }
     39      }
     40 
     41      dstUint8.fill(0);
     42      dv.set${name}(${offset}, bigEndian[j]);
     43      assertSameContents(j, "default");
     44 
     45      dstUint8.fill(0);
     46      dv.set${name}(${offset}, littleEndian[j], true);
     47      assertSameContents(j, "little");
     48 
     49      dstUint8.fill(0);
     50      dv.set${name}(${offset}, bigEndian[j], false);
     51      assertSameContents(j, "big");
     52 
     53      dstUint8.fill(0);
     54      dv.set${name}(${offset}, littleEndian[j], True[i & 1]);
     55      assertSameContents(j, "little, dynamic");
     56 
     57      dstUint8.fill(0);
     58      dv.set${name}(${offset}, bigEndian[j], False[i & 1]);
     59      assertSameContents(j, "big, dynamic");
     60    }
     61  `);
     62 }
     63 
     64 for (let data of createTestData()) {
     65  let f = createWrite(data);
     66 
     67  for (let i = 0; i < 2; ++i) {
     68    f(data);
     69  }
     70 }