diff --git a/src/macros.rs b/src/macros.rs index 0b83bbb7..a51a30b2 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -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 - )) + 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 + )) + } + ConsPtrMaskTag::Cons => { + let ptr = cell_as_untyped_arena_ptr!($cell).payload_offset(); + unsafe { + F64Ptr(TypedArenaPtr::new(std::mem::transmute(ptr))) + } + } + } }}; } diff --git a/src/types.rs b/src/types.rs index 0c2f289d..3a18e845 100644 --- a/src/types.rs +++ b/src/types.rs @@ -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)]