X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FPtr.lhs;h=ab0e6e1604d1c5f99f19599039a551ccadffc4c0;hb=4c98224cdf6e5a1620721faea837656f429f4f27;hp=0bf1520a6bb9ad2b6837ae3173e7ef5f58aaa2ef;hpb=9fa9bc17072a58c0bae2cce4764d38677e96ac29;p=ghc-base.git diff --git a/GHC/Ptr.lhs b/GHC/Ptr.lhs index 0bf1520..ab0e6e1 100644 --- a/GHC/Ptr.lhs +++ b/GHC/Ptr.lhs @@ -1,12 +1,19 @@ +\begin{code} +{-# OPTIONS -fno-implicit-prelude #-} ----------------------------------------------------------------------------- --- $Id: Ptr.lhs,v 1.3 2002/04/24 16:31:45 simonmar Exp $ --- --- (c) The FFI Task Force, 2000 -- | --- Module GHC.Ptr +-- Module : GHC.Ptr +-- Copyright : (c) The FFI Task Force, 2000-2002 +-- License : see libraries/base/LICENSE +-- +-- Maintainer : ffi@haskell.org +-- Stability : internal +-- Portability : non-portable (GHC Extensions) +-- +-- The 'Ptr' and 'FunPtr' types and operations. +-- +----------------------------------------------------------------------------- -\begin{code} -{-# OPTIONS -fno-implicit-prelude #-} module GHC.Ptr where import GHC.Base @@ -15,22 +22,41 @@ import GHC.Base -- Data pointers. data Ptr a = Ptr Addr# deriving (Eq, Ord) +-- ^ A value of type @'Ptr' a@ represents a pointer to an object, or an +-- array of objects, which may be marshalled to or from Haskell values +-- of type @a@. +-- +-- The type @a@ will normally be an instance of class +-- 'Storable' which provides the marshalling operations. + +-- |The constant 'nullPtr' contains a distinguished value of 'Ptr' +-- that is not associated with a valid memory location. nullPtr :: Ptr a nullPtr = Ptr nullAddr# +-- |The 'castPtr' function casts a pointer from one type to another. castPtr :: Ptr a -> Ptr b castPtr (Ptr addr) = Ptr addr +-- |Advances the given address by the given offset in bytes. plusPtr :: Ptr a -> Int -> Ptr b plusPtr (Ptr addr) (I# d) = Ptr (plusAddr# addr d) +-- |Given an arbitrary address and an alignment constraint, +-- 'alignPtr' yields the next higher address that fulfills the +-- alignment constraint. An alignment constraint @x@ is fulfilled by +-- any address divisible by @x@. This operation is idempotent. 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)) } +-- |Computes the offset required to get from the first to the second +-- argument. We have +-- +-- > p2 == p1 \`'plusPtr'\` (p2 \`'minusPtr'\` p1) minusPtr :: Ptr a -> Ptr b -> Int minusPtr (Ptr a1) (Ptr a2) = I# (minusAddr# a1 a2) @@ -41,16 +67,30 @@ instance CReturnable (Ptr a) -- Function pointers for the default calling convention. data FunPtr a = FunPtr Addr# deriving (Eq, Ord) - +-- ^ A value of type @'FunPtr' a@ is a pointer to a piece of code. It +-- may be the pointer to a C function or to a Haskell function created +-- using @foreign export dynamic@. A @foreign export +-- dynamic@ should normally be declared to produce a +-- 'FunPtr' of the correct type. For example: +-- +-- > type Compare = 'Int' -> 'Int' -> 'Bool' +-- > foreign export dynamic mkCompare :: Compare -> 'IO' ('FunPtr' Compare) + +-- |The constant 'nullFunPtr' contains a +-- distinguished value of 'Ptr' that is not +-- associated with a valid memory location nullFunPtr :: FunPtr a nullFunPtr = FunPtr nullAddr# +-- |Casts a 'FunPtr' to a 'FunPtr' of a different type castFunPtr :: FunPtr a -> FunPtr b castFunPtr (FunPtr addr) = FunPtr addr +-- |Casts a 'FunPtr' to a 'Ptr' castFunPtrToPtr :: FunPtr a -> Ptr b castFunPtrToPtr (FunPtr addr) = Ptr addr +-- |Casts a 'Ptr' to a 'FunPtr' castPtrToFunPtr :: Ptr a -> FunPtr b castPtrToFunPtr (Ptr addr) = FunPtr addr