@@ -458,9 +458,13 @@ fn codegen_u8_slice(core: &TokenStream2, idx: usize) -> TokenStream2 {
458458 match #core:: v8:: Local :: <#core:: v8:: ArrayBuffer >:: try_from( value) {
459459 Ok ( b) => {
460460 let byte_length = b. byte_length( ) ;
461- let store = b. data( ) as * mut u8 ;
462- // SAFETY: rust guarantees that lifetime of slice is no longer than the call.
463- unsafe { :: std:: slice:: from_raw_parts_mut( store, byte_length) }
461+ if let Some ( data) = b. data( ) {
462+ let store = data. cast:: <u8 >( ) . as_ptr( ) ;
463+ // SAFETY: rust guarantees that lifetime of slice is no longer than the call.
464+ unsafe { :: std:: slice:: from_raw_parts_mut( store, byte_length) }
465+ } else {
466+ & mut [ ]
467+ }
464468 } ,
465469 Err ( _) => {
466470 if let Ok ( view) = #core:: v8:: Local :: <#core:: v8:: ArrayBufferView >:: try_from( value) {
@@ -472,9 +476,13 @@ fn codegen_u8_slice(core: &TokenStream2, idx: usize) -> TokenStream2 {
472476 return #core:: _ops:: throw_type_error( scope, format!( "Expected ArrayBufferView at position {}" , #idx) ) ;
473477 }
474478 } ;
475- let store = buffer. data( ) as * mut u8 ;
476- // SAFETY: rust guarantees that lifetime of slice is no longer than the call.
477- unsafe { :: std:: slice:: from_raw_parts_mut( store. add( offset) , len) }
479+ if let Some ( data) = buffer. data( ) {
480+ let store = data. cast:: <u8 >( ) . as_ptr( ) ;
481+ // SAFETY: rust guarantees that lifetime of slice is no longer than the call.
482+ unsafe { :: std:: slice:: from_raw_parts_mut( store. add( offset) , len) }
483+ } else {
484+ & mut [ ]
485+ }
478486 } else {
479487 return #core:: _ops:: throw_type_error( scope, format!( "Expected ArrayBufferView at position {}" , #idx) ) ;
480488 }
@@ -487,7 +495,13 @@ fn codegen_u8_ptr(core: &TokenStream2, idx: usize) -> TokenStream2 {
487495 quote ! { {
488496 let value = args. get( #idx as i32 ) ;
489497 match #core:: v8:: Local :: <#core:: v8:: ArrayBuffer >:: try_from( value) {
490- Ok ( b) => b. data( ) as * const u8 ,
498+ Ok ( b) => {
499+ if let Some ( data) = b. data( ) {
500+ data. cast:: <u8 >( ) . as_ptr( )
501+ } else {
502+ std:: ptr:: null:: <u8 >( )
503+ }
504+ } ,
491505 Err ( _) => {
492506 if let Ok ( view) = #core:: v8:: Local :: <#core:: v8:: ArrayBufferView >:: try_from( value) {
493507 let offset = view. byte_offset( ) ;
@@ -497,7 +511,11 @@ fn codegen_u8_ptr(core: &TokenStream2, idx: usize) -> TokenStream2 {
497511 return #core:: _ops:: throw_type_error( scope, format!( "Expected ArrayBufferView at position {}" , #idx) ) ;
498512 }
499513 } ;
500- let store = buffer. data( ) as * mut u8 ;
514+ let store = if let Some ( data) = buffer. data( ) {
515+ data. cast:: <u8 >( ) . as_ptr( )
516+ } else {
517+ std:: ptr:: null_mut:: <u8 >( )
518+ } ;
501519 unsafe { store. add( offset) }
502520 } else {
503521 return #core:: _ops:: throw_type_error( scope, format!( "Expected ArrayBufferView at position {}" , #idx) ) ;
@@ -517,9 +535,13 @@ fn codegen_u32_mut_slice(core: &TokenStream2, idx: usize) -> TokenStream2 {
517535 return #core:: _ops:: throw_type_error( scope, format!( "Expected Uint32Array at position {}" , #idx) ) ;
518536 }
519537 } ;
520- let store = buffer. data( ) as * mut u8 ;
521- // SAFETY: buffer from Uint32Array. Rust guarantees that lifetime of slice is no longer than the call.
522- unsafe { :: std:: slice:: from_raw_parts_mut( store. add( offset) as * mut u32 , len / 4 ) }
538+ if let Some ( data) = buffer. data( ) {
539+ let store = data. cast:: <u8 >( ) . as_ptr( ) ;
540+ // SAFETY: buffer from Uint32Array. Rust guarantees that lifetime of slice is no longer than the call.
541+ unsafe { :: std:: slice:: from_raw_parts_mut( store. add( offset) as * mut u32 , len / 4 ) }
542+ } else {
543+ & mut [ ]
544+ }
523545 } else {
524546 return #core:: _ops:: throw_type_error( scope, format!( "Expected Uint32Array at position {}" , #idx) ) ;
525547 }
0 commit comments