summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/BigInt/large-bit-length.js
blob: 5f4617159b42970cfbe99907b6950c68acd656ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Any copyright is dedicated to the Public Domain.
// https://creativecommons.org/licenses/publicdomain/

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);