write-unaligned.js (1952B)
1 // Test unaligned 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 = 1; 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 }