unify pointer width

This commit is contained in:
Bennet Bleßmann
2024-07-06 01:41:05 +02:00
parent 3de0a4e2ad
commit 821358c062
2 changed files with 12 additions and 51 deletions

View File

@@ -171,12 +171,13 @@ macro_rules! typed_arena_ptr_as_cell {
} }
macro_rules! raw_ptr_as_cell { macro_rules! raw_ptr_as_cell {
($ptr:expr) => { ($ptr:expr) => {{
// Cell is 64-bit, but raw ptr is 32-bit in 32-bit systems // Cell is 64-bit, but raw ptr is 32-bit in 32-bit systems
// TODO use <*{const,mut} _>::addr instead of as when the strict_provenance feature is stable rust-lang/rust#95228 // TODO use <*{const,mut} _>::addr instead of as when the strict_provenance feature is stable rust-lang/rust#95228
// we might need <*{const,mut} _>::expose_provenance for strict provenance, dependening on how we recreate a pointer later // we might need <*{const,mut} _>::expose_provenance for strict provenance, dependening on how we recreate a pointer later
HeapCellValue::from_raw_ptr_bytes(($ptr as usize).to_ne_bytes()) let ptr : *const _ = $ptr;
}; HeapCellValue::from_ptr_addr(ptr as usize)
}};
} }
macro_rules! untyped_arena_ptr_as_cell { macro_rules! untyped_arena_ptr_as_cell {

View File

@@ -88,18 +88,10 @@ impl ConsPtr {
.with_tag(tag) .with_tag(tag)
} }
#[cfg(target_pointer_width = "32")]
#[inline(always)] #[inline(always)]
pub fn as_ptr(self) -> *mut u8 { pub fn as_ptr(self) -> *mut u8 {
let bytes = self.into_bytes(); let addr: u64 = self.ptr();
let raw_ptr_bytes = [bytes[1], bytes[2], bytes[3], bytes[4]]; addr as usize as *mut _
unsafe { mem::transmute(raw_ptr_bytes) }
}
#[cfg(target_pointer_width = "64")]
#[inline(always)]
pub fn as_ptr(self) -> *mut u8 {
self.ptr() as *mut _
} }
#[inline(always)] #[inline(always)]
@@ -534,37 +526,13 @@ impl HeapCellValue {
} }
} }
#[cfg(target_pointer_width = "32")]
#[inline] #[inline]
pub fn from_raw_ptr_bytes(ptr_bytes: [u8; 4]) -> Self { pub fn from_ptr_addr(ptr_bytes: usize) -> Self {
HeapCellValue::from_bytes([ HeapCellValue::from_bytes((ptr_bytes as u64).to_ne_bytes())
ptr_bytes[0],
ptr_bytes[1],
ptr_bytes[2],
ptr_bytes[3],
0,
0,
0,
0,
])
}
#[cfg(target_pointer_width = "64")]
#[inline]
pub fn from_raw_ptr_bytes(ptr_bytes: [u8; 8]) -> Self {
HeapCellValue::from_bytes(ptr_bytes)
} }
#[inline] pub fn to_ptr_addr(self) -> usize {
#[cfg(target_pointer_width = "32")] u64::from_ne_bytes(self.into_bytes()) as usize
pub fn to_raw_ptr_bytes(self) -> [u8; 4] {
let bytes = self.into_bytes();
[bytes[0], bytes[1], bytes[2], bytes[3]]
}
#[inline]
#[cfg(target_pointer_width = "64")]
pub fn to_raw_ptr_bytes(self) -> [u8; 8] {
self.into_bytes()
} }
#[inline] #[inline]
@@ -716,18 +684,10 @@ impl UntypedArenaPtr {
self.set_m(m); self.set_m(m);
} }
#[cfg(target_pointer_width = "32")]
#[inline] #[inline]
pub fn get_ptr(self) -> *const u8 { pub fn get_ptr(self) -> *const u8 {
let bytes = self.into_bytes(); let addr: u64 = self.ptr();
let raw_ptr_bytes = [bytes[0], bytes[1], bytes[2], bytes[3]]; addr as usize as *const u8
unsafe { mem::transmute(raw_ptr_bytes) }
}
#[cfg(target_pointer_width = "64")]
#[inline]
pub fn get_ptr(self) -> *const u8 {
self.ptr() as *const u8
} }
#[inline] #[inline]