GHC/Ptr.lhs (original) (raw)
\begin{code}
module GHC.Ptr ( Ptr(..), FunPtr(..), nullPtr, castPtr, plusPtr, alignPtr, minusPtr, nullFunPtr, castFunPtr,
castFunPtrToPtr, castPtrToFunPtr
) where
import GHC.Base import GHC.Show import GHC.Num import GHC.List ( length, replicate ) import Numeric ( showHex )
#include "MachDeps.h"
data Ptr a = Ptr Addr# deriving (Eq, Ord)
nullPtr :: Ptr a nullPtr = Ptr nullAddr#
castPtr :: Ptr a -> Ptr b castPtr (Ptr addr) = Ptr addr
plusPtr :: Ptr a -> Int -> Ptr b plusPtr (Ptr addr) (I# d) = Ptr (plusAddr# addr d)
alignPtr :: Ptr a -> Int -> Ptr a alignPtr addr@(Ptr a) (I# i) = case remAddr# a i of { 0# -> addr; n -> Ptr (plusAddr# a (i -# n)) }
minusPtr :: Ptr a -> Ptr b -> Int minusPtr (Ptr a1) (Ptr a2) = I# (minusAddr# a1 a2)
data FunPtr a = FunPtr Addr# deriving (Eq, Ord)
nullFunPtr :: FunPtr a nullFunPtr = FunPtr nullAddr#
castFunPtr :: FunPtr a -> FunPtr b castFunPtr (FunPtr addr) = FunPtr addr
castFunPtrToPtr :: FunPtr a -> Ptr b castFunPtrToPtr (FunPtr addr) = Ptr addr
castPtrToFunPtr :: Ptr a -> FunPtr b castPtrToFunPtr (Ptr addr) = FunPtr addr
instance Show (Ptr a) where showsPrec _ (Ptr a) rs = pad_out (showHex (wordToInteger(int2Word#(addr2Int# a))) "") where
pad_out ls =
'0':'x':(replicate (2*SIZEOF_HSPTR length ls) '0') ++ ls ++ rs
instance Show (FunPtr a) where showsPrec p = showsPrec p . castFunPtrToPtr
\end{code}