blob: f077d706ab40a51e4584682dad33a21caa36d1ed [file] [log] [blame]
//@ requireOptions("--forceEagerCompilation=true", "--osrExitCountForReoptimization=10", "--useConcurrentJIT=0")
const typedArrays = [
Uint8ClampedArray,
Uint8Array,
Uint16Array,
Uint32Array,
Int8Array,
Int16Array,
Int32Array,
Float32Array,
Float64Array,
];
const failures = new Set();
let value = 0;
function makeTest(test) {
noInline(test);
function assert(typedArray, condition, message) {
if (!condition)
failures.add(`${typedArray.name}: ${message}`);
}
function testFor(typedArray, key) {
return new Function('key', 'typedArray', 'test', 'assert', `
const value = ${value++} % 128;
const u8 = new typedArray(1);
u8[key] = value;
test(u8, key, value, assert);
`).bind(undefined, key, typedArray, test, assert.bind(undefined, typedArray));
};
return function(keys) {
for (let typedArray of typedArrays) {
for (let key of keys) {
const runTest = testFor(typedArray, key);
noInline(runTest);
for (let i = 0; i < 10; i++) {
runTest();
}
}
}
}
}
const testInvalidIndices = makeTest((array, key, value, assert) => {
assert(array[key] === undefined, `${key.toString()} should not be set`);
assert(!(key in array), `${key.toString()} should not be in array`);
const keys = Object.keys(array);
assert(keys.length === 1, `no new keys should be added`);
assert(keys[0] === '0', `'0' should be the only key`);
assert(array[0] === 0, `offset 0 should not have been modified`);
assert(array.hasOwnProperty(key) === false, `hasOwnProperty(${key.toString()}) should be false`);
assert(Object.getOwnPropertyDescriptor(array, key) === undefined, `Object.getOwnPropertyDescriptor(${key.toString()}) should be undefined`);
});
testInvalidIndices([
'-0',
'-1',
-1,
1,
'Infinity',
'-Infinity',
'NaN',
'0.1',
'4294967294',
'4294967295',
'4294967296',
]);
const makeTestValidIndex = (configurable) =>
(array, key, value, assert) => {
assert(array[key] === value, `${key.toString()} should be set to ${value}`);
assert(key in array, `should contain key ${key.toString()}`);
assert(array.hasOwnProperty(key) === true, `hasOwnProperty(${key.toString()}) should be true`);
const descriptor = Object.getOwnPropertyDescriptor(array, key);
assert(typeof descriptor === 'object', `Object.getOwnPropertyDescriptor(${key.toString()}) return an object`);
assert(descriptor.value === value, `descriptor.value should be ${value}`);
assert(descriptor.writable === true, `descriptor.writable should be true`);
assert(descriptor.enumerable === true, `descriptor.enumerable should be true`);
assert(descriptor.configurable === configurable, `descriptor.configurable should be ${configurable}`);
};
const testValidConfigurableIndices = makeTest(makeTestValidIndex(true));
testValidConfigurableIndices([
'01',
'0.10',
'+Infinity',
'-NaN',
'-0.0',
Symbol('1'),
]);
testValidNonConfigurableIndices = makeTest(makeTestValidIndex(false))
testValidNonConfigurableIndices([
'0',
0,
]);
if (failures.size)
throw new Error(`Subtests failed:\n${Array.from(failures).join('\n')}`);