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