blob: bd9a6dae0dcbf920f94a9921458f1a498361f72b [file] [log] [blame]
"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);