Skip to content

Commit 643f89a

Browse files
committed
fix pointer unpacking
1 parent 1eafc2a commit 643f89a

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

src/structs_ffi.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,10 @@ function primitivePackers(type: PrimitiveType) {
236236
? view.setBigUint64(off, val ? BigInt(val) : 0n, true)
237237
: view.setUint32(off, val ? Number(val) : 0, true);
238238
};
239-
unpack = (view: DataView, off: number) => {
240-
const ptrBytes = pointerSize === 8
239+
unpack = (view: DataView, off: number): bigint => {
240+
return pointerSize === 8
241241
? view.getBigUint64(off, true)
242242
: BigInt(view.getUint32(off, true));
243-
return Number(ptrBytes);
244243
}
245244
break;
246245
default:
@@ -538,8 +537,20 @@ export function defineStruct<const Fields extends readonly StructField[], const
538537
requester.unpack = (view, off) => {
539538
const result = [];
540539
const length = lengthOfField.unpack(view, lengthOfField.offset);
541-
const ptr = pointerUnpacker(view, off);
542-
const buffer = toArrayBuffer(ptr, 0, length * elemSize);
540+
const ptrAddress = pointerUnpacker(view, off);
541+
542+
if (ptrAddress === 0n && length > 0) {
543+
throw new Error(`Array field ${requester.name} has null pointer but length ${length}.`);
544+
}
545+
if (ptrAddress === 0n && length === 0) {
546+
return [];
547+
}
548+
if (length === 0) {
549+
return [];
550+
}
551+
552+
const bunPointer = ptr(ptrAddress);
553+
const buffer = toArrayBuffer(bunPointer, 0, length * elemSize);
543554
const bufferView = new DataView(buffer);
544555

545556
for (let i = 0; i < length; i++) {

0 commit comments

Comments
 (0)