| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
Foreign.Ptr
Description
The module Foreign.Ptr provides typed pointers to foreign entities. We distinguish two kinds of pointers:
pointers to data and pointers to functions. It is understood that these two kinds of pointers may be represented
differently as they may be references to data and text segments, respectively.
Synopsis
- data Ptr a
- nullPtr :: Ptr a
- castPtr :: Ptr a -> Ptr b
- plusPtr :: Ptr a -> Int -> Ptr b
- alignPtr :: Ptr a -> Int -> Ptr a
- minusPtr :: Ptr a -> Ptr b -> Int
- data FunPtr a
- nullFunPtr :: FunPtr a
- castFunPtr :: FunPtr a -> FunPtr b
- castFunPtrToPtr :: FunPtr a -> Ptr b
- castPtrToFunPtr :: Ptr a -> FunPtr b
- freeHaskellFunPtr :: FunPtr a -> IO ()
- data IntPtr
- ptrToIntPtr :: Ptr a -> IntPtr
- intPtrToPtr :: IntPtr -> Ptr a
- data WordPtr
- ptrToWordPtr :: Ptr a -> WordPtr
- wordPtrToPtr :: WordPtr -> Ptr a
Data pointers
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 often be an instance of class Storable which provides the
marshalling operations. However this is not essential, and you can provide your own operations to
access the pointer. For example you might write small foreign functions to get or set the fields of a C
struct.
Instances
| Eq (Ptr a) # | |
| Ord (Ptr a) # | |
| Storable (Ptr a) # | |
| Show (Ptr a) # | |
alignPtr :: Ptr a -> Int -> Ptr a #
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.
minusPtr :: Ptr a -> Ptr b -> Int #
Computes the offset required to get from the second to the first argument. We have
p2 == p1 ‘plusPtr‘ (p2 ‘minusPtr‘ p1)
Function pointers
A value of type FunPtr a is a pointer to a function callable from foreign code. The type a will
normally be a foreign type, a function type with zero or more arguments where
- the argument types are marshallable foreign types, i.e.
Char,Int,Double,Float,Bool,Int8,Int16,Int32,Int64,Word8,Word16,Word32,Word64,Ptr a,FunPtr a,Foreign.StablePtr.StablePtr aor a renaming of any of these usingnewtype. - the return type is either a marshallable foreign type or has the form
IO twheretis a marshallable foreign type or().
A value of type FunPtr a may be a pointer to a foreign function, either returned by another foreign
function or imported with a a static address import like
foreign import ccall "stdlib.h &free" p_free :: FunPtr (Ptr a -> IO ())
or a pointer to a Haskell function created using a wrapper stub declared to produce a FunPtr of the
correct type. For example:
type Compare = Int -> Int -> Bool foreign import ccall "wrapper" mkCompare :: Compare -> IO (FunPtr Compare)
Calls to wrapper stubs like mkCompare allocate storage, which should be released with
freeHaskellFunPtr when no longer required.
To convert FunPtr values to corresponding Haskell functions, one can define a dynamic stub for the
specific foreign type, e.g.
type IntFunction = CInt -> IO () foreign import ccall "dynamic" mkFun :: FunPtr IntFunction -> IntFunction
Instances
| Eq (FunPtr a) # | |
| Ord (FunPtr a) # | |
Defined in Foreign.Ptr | |
| Storable (FunPtr a) # | |
Defined in Foreign.Storable | |
| Show (FunPtr a) # | |
nullFunPtr :: FunPtr a #
The constant nullFunPtr contains a distinguished value of FunPtr that is not associated with a valid
memory location
castFunPtrToPtr :: FunPtr a -> Ptr b #
castPtrToFunPtr :: Ptr a -> FunPtr b #
freeHaskellFunPtr :: FunPtr a -> IO () #
Release the storage associated with the given FunPtr, which must have been obtained from a wrapper
stub. This should be called whenever the return value from a foreign import wrapper function is no
longer required; otherwise, the storage it uses will leak.
Integral types with lossless conversion to and from pointers
A signed integral type that can be losslessly converted to and from Ptr. This type is also compatible
with the C99 type intptr_t, and can be marshalled to and from that type safely.
Instances
| Bits IntPtr # | |
Defined in Foreign.Ptr Methods (.&.) :: IntPtr -> IntPtr -> IntPtr # (.|.) :: IntPtr -> IntPtr -> IntPtr # xor :: IntPtr -> IntPtr -> IntPtr # complement :: IntPtr -> IntPtr # shift :: IntPtr -> Int -> IntPtr # rotate :: IntPtr -> Int -> IntPtr # setBit :: IntPtr -> Int -> IntPtr # clearBit :: IntPtr -> Int -> IntPtr # complementBit :: IntPtr -> Int -> IntPtr # testBit :: IntPtr -> Int -> Bool # shiftL :: IntPtr -> Int -> IntPtr # shiftR :: IntPtr -> Int -> IntPtr # | |
| Bounded IntPtr # | |
| Enum IntPtr # | |
Defined in Foreign.Ptr | |
| Eq IntPtr # | |
| Ord IntPtr # | |
| Storable IntPtr # | |
| Integral IntPtr # | |
Defined in Foreign.Ptr | |
| Num IntPtr # | |
| Real IntPtr # | |
Defined in Foreign.Ptr Methods toRational :: IntPtr -> Rational # | |
| Read IntPtr # | |
| Show IntPtr # | |
An unsigned integral type that can be losslessly converted to and from Ptr. This type is also compatible
with the C99 type uintptr_t, and can be marshalled to and from that type safely.
Instances
| Bits WordPtr # | |
Defined in Foreign.Ptr Methods (.&.) :: WordPtr -> WordPtr -> WordPtr # (.|.) :: WordPtr -> WordPtr -> WordPtr # xor :: WordPtr -> WordPtr -> WordPtr # complement :: WordPtr -> WordPtr # shift :: WordPtr -> Int -> WordPtr # rotate :: WordPtr -> Int -> WordPtr # setBit :: WordPtr -> Int -> WordPtr # clearBit :: WordPtr -> Int -> WordPtr # complementBit :: WordPtr -> Int -> WordPtr # testBit :: WordPtr -> Int -> Bool # shiftL :: WordPtr -> Int -> WordPtr # shiftR :: WordPtr -> Int -> WordPtr # | |
| Bounded WordPtr # | |
| Enum WordPtr # | |
| Eq WordPtr # | |
| Ord WordPtr # | |
| Storable WordPtr # | |
| Integral WordPtr # | |
Defined in Foreign.Ptr | |
| Num WordPtr # | |
| Real WordPtr # | |
Defined in Foreign.Ptr Methods toRational :: WordPtr -> Rational # | |
| Read WordPtr # | |
| Show WordPtr # | |