summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/object/values-entries-typedarray.js
blob: b0ac5a51bbec60601aff482cb444ba3f5d76860e (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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function assertSameEntries(actual, expected) {
    assertEq(actual.length, expected.length);
    for (let i = 0; i < expected.length; ++i)
        assertEqArray(actual[i], expected[i]);
}

function throwsTypeError(fn) {
    try {
        fn();
    } catch (e) {
        assertEq(e instanceof TypeError, true);
        return true;
    }
    return false;
}

// Non-standard: Accessing elements of detached array buffers should throw, but
// this is currently not implemented.
const ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS = (() => {
    let ta = new Int32Array(10);
    detachArrayBuffer(ta.buffer);
    let throws = throwsTypeError(() => ta[0]);
    // Ensure [[Get]] and [[GetOwnProperty]] return consistent results.
    assertEq(throwsTypeError(() => Object.getOwnPropertyDescriptor(ta, 0)), throws);
    return throws;
})();

function maybeThrowOnDetached(fn, returnValue) {
    if (ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS) {
        assertThrowsInstanceOf(fn, TypeError);
        return returnValue;
    }
    return fn();
}

// Ensure Object.keys/values/entries work correctly on typed arrays.
for (let len of [0, 1, 10]) {
    let array = new Array(len).fill(1);
    let ta = new Int32Array(array);

    assertEqArray(Object.keys(ta), Object.keys(array));
    assertEqArray(Object.values(ta), Object.values(array));
    assertSameEntries(Object.entries(ta), Object.entries(array));

    detachArrayBuffer(ta.buffer);

    assertEqArray(maybeThrowOnDetached(() => Object.keys(ta), []), []);
    assertEqArray(maybeThrowOnDetached(() => Object.values(ta), []), []);
    assertSameEntries(maybeThrowOnDetached(() => Object.entries(ta), []), []);
}

if (typeof reportCompare === "function")
    reportCompare(true, true);