From: Mark Thom Date: Sun, 27 Mar 2022 03:18:07 +0000 (-0600) Subject: retrieve F64 behind Cons tags properly (#1369) X-Git-Tag: v0.9.1~94 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=012fefa37e2cc0f323b50849b3d33f4361fe0dba;p=scryer-prolog.git retrieve F64 behind Cons tags properly (#1369) --- 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)]