Skip to content

Commit 8394297

Browse files
committed
Remove RawSlice, support big-endian platforms
1 parent 3b1bcf8 commit 8394297

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

src/atom.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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 ()> {
606616
unsafe 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

Comments
 (0)