Source code

Revision control

Copy as Markdown

Other Tools

// Any copyright is dedicated to the Public Domain.
function test(thunk, result) {
let val, err;
try {
val = thunk();
} catch (e) {
err = e;
}
if (err) {
assertEq(err instanceof RangeError, true);
} else {
assertEq(val, result);
}
}
const UINT32_MAX = 2**32-1;
// Check that BigInt.asIntN and BigInt.asUintN either return correct results or
// throw RangeErrors for large |bits| arguments. GMP uses a type equivalent to
// 'unsigned long' for bit counts, which may be too small to represent all JS
// integer indexes.
for (let bits of [UINT32_MAX-1, UINT32_MAX, UINT32_MAX+1, Number.MAX_SAFE_INTEGER]) {
test(() => BigInt.asIntN(bits, 1n), 1n);
test(() => BigInt.asIntN(bits, 0n), 0n);
test(() => BigInt.asIntN(bits, -1n), -1n);
test(() => BigInt.asUintN(bits, 1n), 1n);
test(() => BigInt.asUintN(bits, 0n), 0n);
// Skip testing asUintN with negative BigInts since it could OOM.
}
reportCompare(true, true);