retrieve F64 behind Cons tags properly (#1369)

This commit is contained in:
Mark Thom
2022-03-26 21:18:07 -06:00
parent 4878e42e07
commit 012fefa37e
2 changed files with 21 additions and 5 deletions

View File

@@ -87,10 +87,21 @@ macro_rules! cell_as_atom_cell {
macro_rules! cell_as_f64_ptr {
($cell:expr) => {{
let ptr_u64 = ConsPtr::from_bytes($cell.into_bytes());
F64Ptr(TypedArenaPtr::new(
ptr_u64.as_ptr() as *mut OrderedFloat<f64>
))
let cons_ptr = ConsPtr::from_bytes($cell.into_bytes());
match cons_ptr.get_tag() {
ConsPtrMaskTag::F64 => {
F64Ptr(TypedArenaPtr::new(
cons_ptr.as_ptr() as *mut OrderedFloat<f64>
))
}
ConsPtrMaskTag::Cons => {
let ptr = cell_as_untyped_arena_ptr!($cell).payload_offset();
unsafe {
F64Ptr(TypedArenaPtr::new(std::mem::transmute(ptr)))
}
}
}
}};
}

View File

@@ -87,10 +87,15 @@ impl ConsPtr {
.with_tag(tag)
}
#[inline]
#[inline(always)]
pub fn as_ptr(self) -> *mut u8 {
self.ptr() as *mut _
}
#[inline(always)]
pub fn get_tag(self) -> ConsPtrMaskTag {
self.tag()
}
}
#[derive(BitfieldSpecifier, Copy, Clone, Debug)]