Data marshal and stable pointers
The Haskell types Ptr a
and FunPtr a
represent pointers in foreign, raw memory (outside the Haskell heap). Relevant operations on foreign pointers are provided by the Storable
type class, which has instances for primitive marshallable data types. A third pointer type is StablePtr a
, which is a pointer to an object in the Haskell heap.
On top of passing primitive values and pointers through the FFI, almost arbitrary data can be marshalled between Haskell and C (and by extension other languages) relatively easily.
Allocating memory outside the heap
A centric type-class in marshalling is Foreign.Storable.Storable
. Storable types must provide a length, byte alignment, and the methods peek
and poke
:
class Storable a where sizeOf :: a ->Int alignment :: a ->Int peek :: Ptr a -> IO a poke :: Ptr a -> a -> IO () …
Primitive allocation routines are located in the Foreign.Marshal.Alloc
module. Normal dynamic allocations are provided for...