@@ -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