@@ -550,46 +550,46 @@ export function napi_create_dataview (
550550 byte_offset : size_t ,
551551 result : Pointer < napi_value >
552552) : napi_status {
553- // eslint-disable-next-line @typescript-eslint/no-unused-vars
554- let value : number
555-
556553 return $PREAMBLE ! ( env , ( envObject ) => {
557554 $CHECK_ARG ! ( envObject , arraybuffer )
558555 $CHECK_ARG ! ( envObject , result )
559556 from64 ( 'byte_length' )
560557 from64 ( 'byte_offset' )
561558 byte_length = byte_length >>> 0
562559 byte_offset = byte_offset >>> 0
563- const handle = emnapiCtx . handleStore . get ( arraybuffer ) !
564- if ( ! handle . isArrayBuffer ( ) ) {
565- return envObject . setLastError ( napi_status . napi_invalid_arg )
566- }
567- const buffer = handle . value
560+ const value = emnapiCtx . handleStore . get ( arraybuffer ) ! . value
568561
569- if ( ( byte_length + byte_offset ) > buffer . byteLength ) {
570- const err : RangeError & { code ?: string } = new RangeError ( 'byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in' )
571- err . code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS'
572- throw err
573- }
574-
575- const dataview = new DataView ( buffer , byte_offset , byte_length )
576- if ( buffer === wasmMemory . buffer ) {
577- if ( ! emnapiExternalMemory . wasmMemoryViewTable . has ( dataview ) ) {
578- emnapiExternalMemory . wasmMemoryViewTable . set ( dataview , {
579- Ctor : DataView ,
580- address : byte_offset ,
581- length : byte_length ,
582- ownership : ReferenceOwnership . kUserland ,
583- runtimeAllocated : 0
584- } )
562+ const createDataview = ( buffer : ArrayBuffer | SharedArrayBuffer ) : napi_status => {
563+ if ( ( byte_length + byte_offset ) > buffer . byteLength ) {
564+ const err : RangeError & { code ?: string } = new RangeError ( 'byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in' )
565+ err . code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS'
566+ throw err
585567 }
568+ const dataview = new DataView ( buffer , byte_offset , byte_length )
569+ if ( buffer === wasmMemory . buffer ) {
570+ if ( ! emnapiExternalMemory . wasmMemoryViewTable . has ( dataview ) ) {
571+ emnapiExternalMemory . wasmMemoryViewTable . set ( dataview , {
572+ Ctor : DataView ,
573+ address : byte_offset ,
574+ length : byte_length ,
575+ ownership : ReferenceOwnership . kUserland ,
576+ runtimeAllocated : 0
577+ } )
578+ }
579+ }
580+
581+ from64 ( 'result' )
582+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
583+ const v = emnapiCtx . addToCurrentScope ( dataview ) . id
584+ makeSetValue ( 'result' , 0 , 'v' , '*' )
585+ return envObject . getReturnStatus ( )
586586 }
587- from64 ( 'result' )
588587
589- // eslint-disable-next-line @typescript-eslint/no-unused-vars
590- value = emnapiCtx . addToCurrentScope ( dataview ) . id
591- makeSetValue ( 'result' , 0 , 'value' , '*' )
592- return envObject . getReturnStatus ( )
588+ if ( value instanceof ArrayBuffer || emnapiExternalMemory . isSharedArrayBuffer ( value ) ) {
589+ return createDataview ( value )
590+ } else {
591+ return envObject . setLastError ( napi_status . napi_invalid_arg )
592+ }
593593 } )
594594}
595595
0 commit comments