fix: preserve byteLength when cloning a DataView

copyBuffer routed DataView through the TypedArray path, passing cur.length
(undefined on a DataView) as the constructor's third argument. Since that
argument is a byte length for DataView, a partial view was extended to the
end of the buffer. Clone DataView explicitly using byteLength.
This commit is contained in:
dualfroz committed 2026-09-04 22:16:53 +02:00
1 parent 078fa09ff4
commit 99f52dbf7f
2 files changed
+32

No files matched your search

+27
View File
@@ -283,6 +283,33 @@ function types (clone, label) {
deepEqual(Array.from(cloned.view2), [input2, input3], 'cloned value content is correct')
deepEqual(Array.from(cloned.view3), [input1, 0, input2, input3], 'cloned value content is correct')
})
test(`${label} copies a DataView over the full buffer correctly`, async ({ ok, is, isNot }) => {
const input = rnd(1000)
const buffer = new ArrayBuffer(8)
const view = new DataView(buffer)
view.setInt32(0, input)
const cloned = clone({ a: view }).a
ok(cloned instanceof DataView, 'cloned value is instance of DataView')
isNot(cloned, view, 'cloned value is not same as input value')
is(cloned.byteOffset, view.byteOffset, 'byteOffset preserved')
is(cloned.byteLength, view.byteLength, 'byteLength preserved')
is(cloned.getInt32(0), input, 'cloned value content is correct')
})
test(`${label} copies a partial DataView correctly`, async ({ ok, is, isNot }) => {
const input = rnd(100)
const buffer = new ArrayBuffer(16)
const view = new DataView(buffer, 4, 8) // offset 4, length 8 of a 16-byte buffer
view.setInt32(0, input)
const cloned = clone({ a: view }).a
ok(cloned instanceof DataView, 'cloned value is instance of DataView')
isNot(cloned, view, 'cloned value is not same as input value')
is(cloned.byteOffset, view.byteOffset, 'byteOffset preserved')
is(cloned.byteLength, view.byteLength, 'byteLength preserved')
is(cloned.getInt32(0), input, 'cloned value content is correct')
// Mutating the source must not affect the clone.
view.setInt32(0, input + 1)
is(cloned.getInt32(0), input, 'clone is independent of the source')
})
test(`${label} - maps`, async ({ same, isNot }) => {
const map = new Map([['a', 1]])
same(Array.from(clone(map)), [['a', 1]], 'same value')