[TypedArray.prototype.copyWithin] Refactor coerced-target-start-end-shrink.js

This commit is contained in:
Richard Gibson 2025-07-28 18:40:29 -04:00 committed by Ms2ger
parent f807ed7c06
commit e5731d6fa7

View File

@ -9,72 +9,59 @@ includes: [compareArray.js, resizableArrayBufferUtils.js]
features: [resizable-arraybuffer] features: [resizable-arraybuffer]
---*/ ---*/
const fillWithIndexes = (ta, length) => {
for (let i = 0; i < length; ++i) {
ta[i] = MayNeedBigInt(ta, i);
}
return ta;
};
for (let ctor of ctors) { for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT); const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT);
const fixedLength = new ctor(rab, 0, 4); const fixedLength = new ctor(rab, 0, 4);
const evil = { const evil = () => {
valueOf: () => { rab.resize(2 * ctor.BYTES_PER_ELEMENT);
rab.resize(2 * ctor.BYTES_PER_ELEMENT); return 2;
return 2;
}
}; };
assert.throws(TypeError, () => { assert.throws(TypeError, () => {
fixedLength.copyWithin(evil, 0, 1); fixedLength.copyWithin({ valueOf: evil }, 0, 1, ctor.name + " evil target.");
}); });
rab.resize(4 * ctor.BYTES_PER_ELEMENT); rab.resize(4 * ctor.BYTES_PER_ELEMENT);
assert.throws(TypeError, () => { assert.throws(TypeError, () => {
fixedLength.copyWithin(0, evil, 3); fixedLength.copyWithin(0, { valueOf: evil }, 3, ctor.name + " evil start.");
}); });
rab.resize(4 * ctor.BYTES_PER_ELEMENT); rab.resize(4 * ctor.BYTES_PER_ELEMENT);
assert.throws(TypeError, () => { assert.throws(TypeError, () => {
fixedLength.copyWithin(0, 1, evil); fixedLength.copyWithin(0, 1, { valueOf: evil }, ctor.name + " evil end.");
}); });
} }
for (let ctor of ctors) { for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT); const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT);
const lengthTracking = new ctor(rab); const lengthTracking = fillWithIndexes(new ctor(rab), 4);
for (let i = 0; i < 4; ++i) { // [0, 1, 2,] 3]
lengthTracking[i] = MayNeedBigInt(lengthTracking, i); // <=--> dest
} // <=-> src
// [0, 1, 2, 3] const evil = () => {
// ^ rab.resize(3 * ctor.BYTES_PER_ELEMENT);
// target return 2;
// ^
// start
const evil = {
valueOf: () => {
rab.resize(3 * ctor.BYTES_PER_ELEMENT);
return 2;
}
}; };
lengthTracking.copyWithin(evil, 0); lengthTracking.copyWithin({ valueOf: evil }, 0);
assert.compareArray(ToNumbers(lengthTracking), [ assert.compareArray(ToNumbers(lengthTracking), [0, 1, 0],
0, ctor.name + " truncated copy forward.");
1,
0
]);
} }
for (let ctor of ctors) { for (let ctor of ctors) {
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT); const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT);
const lengthTracking = new ctor(rab); const lengthTracking = fillWithIndexes(new ctor(rab), 4);
for (let i = 0; i < 4; ++i) { // [0, 1, 2,] 3]
lengthTracking[i] = MayNeedBigInt(lengthTracking, i); // <=--> src
} // <=-> dest
// [0, 1, 2, 3] const evil = () => {
// ^ rab.resize(3 * ctor.BYTES_PER_ELEMENT);
// start return 2;
// ^
// target
const evil = {
valueOf: () => {
rab.resize(3 * ctor.BYTES_PER_ELEMENT);
return 2;
}
}; };
lengthTracking.copyWithin(0, evil); lengthTracking.copyWithin(0, { valueOf: evil });
assert.compareArray(ToNumbers(lengthTracking), [ assert.compareArray(ToNumbers(lengthTracking), [2, 1, 2],
2, ctor.name + " truncated copy backward.");
1,
2
]);
} }