Skip to content

Commit

Permalink
some fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Feb 12, 2023
1 parent 139abbf commit 7e0399d
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 7 deletions.
8 changes: 5 additions & 3 deletions packages/core-js/internals/array-buffer-transfer.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ var TypeError = global.TypeError;
var structuredClone = global.structuredClone;
var ArrayBuffer = global.ArrayBuffer;
var DataView = global.DataView;
var min = Math.min;
var ArrayBufferPrototype = ArrayBuffer.prototype;
var DataViewPrototype = DataView.prototype;
var slice = uncurryThis(ArrayBufferPrototype.slice);
Expand All @@ -20,11 +21,12 @@ var setInt8 = uncurryThis(DataViewPrototype.setInt8);

module.exports = PROPER_TRANSFER && function (arrayBuffer, newLength, preserveResizability) {
var byteLength = arrayBufferByteLength(arrayBuffer);
var newByteLength = newLength === undefined ? byteLength : toIndex(newLength);
var newByteLength = newLength === undefined ? byteLength : min(toIndex(newLength), byteLength);
var fixedLength = !isResizable || !isResizable(arrayBuffer);
if (isDetached(arrayBuffer)) throw TypeError('ArrayBuffer is detached');
var newBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });
if (byteLength <= newByteLength) return newBuffer;
if (!preserveResizability || !isResizable || !isResizable(newBuffer)) return slice(newBuffer, 0, newByteLength);
if (byteLength == newByteLength && (preserveResizability || fixedLength)) return newBuffer;
if (!preserveResizability || fixedLength) return slice(newBuffer, 0, newByteLength);
var newNewBuffer = new ArrayBuffer(newByteLength, maxByteLength && { maxByteLength: maxByteLength(newBuffer) });
var a = new DataView(newBuffer);
var b = new DataView(newNewBuffer);
Expand Down
21 changes: 19 additions & 2 deletions tests/unit-global/esnext.array-buffer.transfer-to-fixed-length.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ if (transferToFixedLength) QUnit.test('ArrayBuffer#transferToFixedLength', asser

const DETACHED = 'detached' in ArrayBuffer.prototype;

const array = [1, 2, 3, 4, 5, 6, 7, 8];
const array = [0, 1, 2, 3, 4, 5, 6, 7];

let buffer = arrayToBuffer(array);
let transferred = buffer.transferToFixedLength();
Expand All @@ -31,7 +31,7 @@ if (transferToFixedLength) QUnit.test('ArrayBuffer#transferToFixedLength', asser
assert.same(buffer.byteLength, 0, 'original array length 2');
if (DETACHED) assert.true(buffer.detached, 'original array detached 2');
assert.same(transferred.byteLength, 5, 'proper transferred byteLength 2');
assert.arrayEqual(bufferToArray(transferred), [1, 2, 3, 4, 5], 'properly copied 2');
assert.arrayEqual(bufferToArray(transferred), array.slice(0, 5), 'properly copied 2');

buffer = arrayToBuffer(array);
transferred = buffer.transferToFixedLength(16.7);
Expand All @@ -47,4 +47,21 @@ if (transferToFixedLength) QUnit.test('ArrayBuffer#transferToFixedLength', asser
if (typeof SharedArrayBuffer == 'function') {
assert.throws(() => transferToFixedLength.call(new SharedArrayBuffer(8)), TypeError, 'non-generic-2');
}

if ('resizable' in ArrayBuffer.prototype) {
assert.false(arrayToBuffer(array).transferToFixedLength().resizable, 'non-resizable-1');
assert.false(arrayToBuffer(array).transferToFixedLength(5).resizable, 'non-resizable-2');

buffer = new ArrayBuffer(8, { maxByteLength: 16 });
new Int8Array(buffer).set(array);
transferred = buffer.transferToFixedLength();
assert.arrayEqual(bufferToArray(transferred), array, 'resizable-1');
assert.false(transferred.resizable, 'resizable-2');

buffer = new ArrayBuffer(8, { maxByteLength: 16 });
new Int8Array(buffer).set(array);
transferred = buffer.transferToFixedLength(5);
assert.arrayEqual(bufferToArray(transferred), array.slice(0, 5), 'resizable-3');
assert.false(transferred.resizable, 'resizable-4');
}
});
21 changes: 19 additions & 2 deletions tests/unit-global/esnext.array-buffer.transfer.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ if (transfer) QUnit.test('ArrayBuffer#transfer', assert => {

const DETACHED = 'detached' in ArrayBuffer.prototype;

const array = [1, 2, 3, 4, 5, 6, 7, 8];
const array = [0, 1, 2, 3, 4, 5, 6, 7];

let buffer = arrayToBuffer(array);
let transferred = buffer.transfer();
Expand All @@ -31,7 +31,7 @@ if (transfer) QUnit.test('ArrayBuffer#transfer', assert => {
assert.same(buffer.byteLength, 0, 'original array length 2');
if (DETACHED) assert.true(buffer.detached, 'original array detached 2');
assert.same(transferred.byteLength, 5, 'proper transferred byteLength 2');
assert.arrayEqual(bufferToArray(transferred), [1, 2, 3, 4, 5], 'properly copied 2');
assert.arrayEqual(bufferToArray(transferred), array.slice(0, 5), 'properly copied 2');

buffer = arrayToBuffer(array);
transferred = buffer.transfer(16.7);
Expand All @@ -47,4 +47,21 @@ if (transfer) QUnit.test('ArrayBuffer#transfer', assert => {
if (typeof SharedArrayBuffer == 'function') {
assert.throws(() => transfer.call(new SharedArrayBuffer(8)), TypeError, 'non-generic-2');
}

if ('resizable' in ArrayBuffer.prototype) {
assert.false(arrayToBuffer(array).transfer().resizable, 'non-resizable-1');
assert.false(arrayToBuffer(array).transfer(5).resizable, 'non-resizable-2');

buffer = new ArrayBuffer(8, { maxByteLength: 16 });
new Int8Array(buffer).set(array);
transferred = buffer.transfer();
assert.arrayEqual(bufferToArray(transferred), array, 'resizable-1');
assert.true(transferred.resizable, 'resizable-2');

buffer = new ArrayBuffer(8, { maxByteLength: 16 });
new Int8Array(buffer).set(array);
transferred = buffer.transfer(5);
assert.arrayEqual(bufferToArray(transferred), array.slice(0, 5), 'resizable-3');
assert.true(transferred.resizable, 'resizable-4');
}
});

0 comments on commit 7e0399d

Please sign in to comment.