"use strict"; function assert(b, m = "") { if (!b) throw new Error("Bad: " + m); } let getOps = { getUint8: 1, getUint16: 2, getUint32: 4, getInt8: 1, getInt16: 2, getInt32: 4, getFloat32: 4, getFloat64: 8, }; let setOps = { setUint8: 1, setUint16: 2, setUint32: 4, setInt8: 1, setInt16: 2, setInt32: 4, setFloat32: 4, setFloat64: 8, }; let getFuncs = []; for (let p of Object.keys(getOps)) { let endOfCall = getOps[p] === 1 ? ");" : ", true);"; let str = ` (function ${p}(dv, index) { return dv.${p}(index${endOfCall} }) `; let func = eval(str); noInline(func); getFuncs.push(func); } let setFuncs = []; for (let p of Object.keys(setOps)) { let endOfCall = setOps[p] === 1 ? ");" : ", true);"; let str = ` (function ${p}(dv, index, value) { return dv.${p}(index, value${endOfCall} }) `; let func = eval(str); noInline(func); setFuncs.push(func); } function assertThrowsRangeError(f) { let e = null; try { f(); } catch(err) { e = err; } assert(e instanceof RangeError, e); } function test(warmup) { const size = 16*1024; let ab = new ArrayBuffer(size); let dv = new DataView(ab); for (let i = 0; i < warmup; ++i) { for (let f of getFuncs) { f(dv, 0); } for (let f of setFuncs) { f(dv, 0, 10); } } for (let f of getFuncs) { assertThrowsRangeError(() => { let index = size - getOps[f.name] + 1; f(dv, index); }); assertThrowsRangeError(() => { let index = -1; f(dv, index); }); assertThrowsRangeError(() => { let index = -2147483648; f(dv, index); }); } for (let f of setFuncs) { assertThrowsRangeError(() => { let index = size - setOps[f.name] + 1; f(dv, index, 10); }); assertThrowsRangeError(() => { let index = -1; f(dv, index, 10); }); assertThrowsRangeError(() => { let index = -2147483648; f(dv, index, 10); }); } } test(2000); test(10000);