@@ -528,18 +528,31 @@ enum UnpackedAtom {
528528 Static ( u32 ) ,
529529}
530530
531- struct RawSlice {
532- data : * const u8 ,
533- len : usize ,
531+ #[ inline( always) ]
532+ fn inline_atom_slice ( x : & u64 ) -> & [ u8 ] {
533+ unsafe {
534+ let x: * const u64 = x;
535+ let mut data = x as * const u8 ;
536+ // All except the lowest byte, which is first in little-endian, last in big-endian.
537+ if cfg ! ( target_endian = "little" ) {
538+ data = data. offset ( 1 ) ;
539+ }
540+ let len = 7 ;
541+ slice:: from_raw_parts ( data, len)
542+ }
534543}
535544
536- #[ cfg( target_endian = "little" ) ] // Not implemented yet for big-endian
537545#[ inline( always) ]
538- unsafe fn inline_atom_slice ( x : & u64 ) -> RawSlice {
539- let x: * const u64 = x;
540- RawSlice {
541- data : ( x as * const u8 ) . offset ( 1 ) ,
542- len : 7 ,
546+ fn inline_atom_slice_mut ( x : & mut u64 ) -> & mut [ u8 ] {
547+ unsafe {
548+ let x: * mut u64 = x;
549+ let mut data = x as * mut u8 ;
550+ // All except the lowest byte, which is first in little-endian, last in big-endian.
551+ if cfg ! ( target_endian = "little" ) {
552+ data = data. offset ( 1 ) ;
553+ }
554+ let len = 7 ;
555+ slice:: from_raw_parts_mut ( data, len)
543556 }
544557}
545558
@@ -557,9 +570,7 @@ impl UnpackedAtom {
557570 debug_assert ! ( ( len as usize ) <= MAX_INLINE_LEN ) ;
558571 let mut data: u64 = ( INLINE_TAG as u64 ) | ( ( len as u64 ) << 4 ) ;
559572 {
560- let raw_slice = inline_atom_slice ( & mut data) ;
561- let dest: & mut [ u8 ] = slice:: from_raw_parts_mut (
562- raw_slice. data as * mut u8 , raw_slice. len ) ;
573+ let dest = inline_atom_slice_mut ( & mut data) ;
563574 copy_memory ( & buf[ ..] , dest) ;
564575 }
565576 data
@@ -578,8 +589,7 @@ impl UnpackedAtom {
578589 let len = ( ( data & 0xf0 ) >> 4 ) as usize ;
579590 debug_assert ! ( len <= MAX_INLINE_LEN ) ;
580591 let mut buf: [ u8 ; 7 ] = [ 0 ; 7 ] ;
581- let raw_slice = inline_atom_slice ( & data) ;
582- let src: & [ u8 ] = slice:: from_raw_parts ( raw_slice. data , raw_slice. len ) ;
592+ let src = inline_atom_slice ( & data) ;
583593 copy_memory ( src, & mut buf[ ..] ) ;
584594 Inline ( len as u8 , buf)
585595 } ,
@@ -606,8 +616,7 @@ unsafe fn from_packed_dynamic(data: u64) -> Option<*mut ()> {
606616unsafe fn inline_orig_bytes < ' a > ( data : & ' a u64 ) -> & ' a [ u8 ] {
607617 match UnpackedAtom :: from_packed ( * data) {
608618 Inline ( len, _) => {
609- let raw_slice = inline_atom_slice ( & data) ;
610- let src: & [ u8 ] = slice:: from_raw_parts ( raw_slice. data , raw_slice. len ) ;
619+ let src = inline_atom_slice ( & data) ;
611620 & src[ ..( len as usize ) ]
612621 }
613622 _ => debug_unreachable ! ( ) ,
0 commit comments