-instance RefObj (Ptr a) where
- payload = return . ptrToIntPtr
- refs = unpackRefs . castPtr
- marked = markedRef
- mark = markRef (0x1::Int32)
- unmark = markRef (0x0::Int32)
- newRef = newRefPtr
- patchRefs = undefined
- copy = undefined
-
-instance PrintableRef (Ptr a) where
- printRef = printRef'
-
-
-idOff = 0x0
-numberOfObjsOff = 0x4
-markedOff = 0x8
-newRefOff = 0xC
-fieldsOff = 0x10
-
-unpackRefs :: Ptr Int32 -> IO [Ptr b]
-unpackRefs ptr = do --dereference number of objs; mark field skipped via fieldsOffset
- numberOfObjs <- peekByteOff ptr numberOfObjsOff :: IO Int32
- mapM (peekElemOff (ptr `plusPtr` fieldsOff)) [0..fromIntegral $ numberOfObjs-1]
-
-markedRef :: Ptr a -> IO Bool
-markedRef ptr = liftM ((/=0) . fromIntegral) (peekByteOff ptr markedOff :: IO Int32)
-
-markRef :: Int32 -> Ptr a -> IO ()
-markRef val ptr = pokeByteOff ptr markedOff val
-
-newRefPtr :: Ptr a -> Ptr a -> IO ()
-newRefPtr ptr newRef = pokeByteOff ptr newRefOff newRef
-
-printRef' :: Ptr a -> IO ()
-printRef' ptr = do printf "obj 0x%08x\n" =<< (peekByteOff ptr idOff :: IO Int32)
- printf "children 0x%08x\n" =<< (peekByteOff ptr numberOfObjsOff :: IO Int32)
- printf "marked 0x%08x\n" =<< (peekByteOff ptr markedOff :: IO Int32)
- printf "newRef 0x%08x\n\n" =<< (peekByteOff ptr newRefOff :: IO Int32)
-