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