<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!--Rendered using the Haskell Html Library v0.2--> <HTML ><HEAD ><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8" ><TITLE >Foreign.Ptr</TITLE ><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css" ><SCRIPT SRC="haddock-util.js" TYPE="text/javascript" ></SCRIPT ><SCRIPT TYPE="text/javascript" >window.onload = function () {setSynopsis("mini_Foreign-Ptr.html")};</SCRIPT ></HEAD ><BODY ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="topbar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" " ></TD ><TD CLASS="title" >base-4.1.0.0: Basic libraries</TD ><TD CLASS="topbut" ><A HREF="index.html" >Contents</A ></TD ><TD CLASS="topbut" ><A HREF="doc-index.html" >Index</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="modulebar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><FONT SIZE="6" >Foreign.Ptr</FONT ></TD ><TD ALIGN="right" ><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="infohead" >Portability</TD ><TD CLASS="infoval" >portable</TD ></TR ><TR ><TD CLASS="infohead" >Stability</TD ><TD CLASS="infoval" >provisional</TD ></TR ><TR ><TD CLASS="infohead" >Maintainer</TD ><TD CLASS="infoval" >ffi@haskell.org</TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="section4" ><B >Contents</B ></TD ></TR ><TR ><TD ><DL ><DT ><A HREF="#1" >Data pointers </A ></DT ><DT ><A HREF="#2" >Function pointers </A ></DT ><DT ><A HREF="#3" >Integral types with lossless conversion to and from pointers </A ></DT ></DL ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Description</TD ></TR ><TR ><TD CLASS="doc" >This module provides typed pointers to foreign data. It is part of the Foreign Function Interface (FFI) and will normally be imported via the <A HREF="Foreign.html" >Foreign</A > module. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Synopsis</TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AnullPtr" >nullPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AcastPtr" >castPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AplusPtr" >plusPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AalignPtr" >alignPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AminusPtr" >minusPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b -> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3AFunPtr" >FunPtr</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AnullFunPtr" >nullFunPtr</A > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AcastFunPtr" >castFunPtr</A > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a -> <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AcastFunPtrToPtr" >castFunPtrToPtr</A > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AcastPtrToFunPtr" >castPtrToFunPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AfreeHaskellFunPtr" >freeHaskellFunPtr</A > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a -> <A HREF="System-IO.html#t%3AIO" >IO</A > <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29" >()</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3AIntPtr" >IntPtr</A > </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AptrToIntPtr" >ptrToIntPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AintPtrToPtr" >intPtrToPtr</A > :: <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3AWordPtr" >WordPtr</A > </TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AptrToWordPtr" >ptrToWordPtr</A > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AwordPtrToPtr" >wordPtrToPtr</A > :: <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="1" ><A NAME="1" >Data pointers </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:Ptr" ><A NAME="t%3APtr" ></A ></A ><B >Ptr</B > a </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" ><P >A value of type <TT ><TT ><A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A ></TT > a</TT > represents a pointer to an object, or an array of objects, which may be marshalled to or from Haskell values of type <TT >a</TT >. </P ><P >The type <TT >a</TT > will often be an instance of class Foreign.Storable.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 <TT >struct</TT >. </P ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Ptr')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:Ptr" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Data-Typeable.html#t%3ATypeable1" >Typeable1</A > <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Eq.html#t%3AEq" >Eq</A > (<A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Typeable.html#t%3ATypeable" >Typeable</A > a => <A HREF="Data-Data.html#t%3AData" >Data</A > (<A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Ord.html#t%3AOrd" >Ord</A > (<A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Text-Show.html#t%3AShow" >Show</A > (<A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Foreign-Storable.html#t%3AStorable" >Storable</A > (<A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:nullPtr" ><A NAME="v%3AnullPtr" ></A ></A ><B >nullPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="doc" >The constant <TT ><A HREF="Foreign-Ptr.html#v%3AnullPtr" >nullPtr</A ></TT > contains a distinguished value of <TT ><A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A ></TT > that is not associated with a valid memory location. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:castPtr" ><A NAME="v%3AcastPtr" ></A ></A ><B >castPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b</TD ></TR ><TR ><TD CLASS="doc" >The <TT ><A HREF="Foreign-Ptr.html#v%3AcastPtr" >castPtr</A ></TT > function casts a pointer from one type to another. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:plusPtr" ><A NAME="v%3AplusPtr" ></A ></A ><B >plusPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b</TD ></TR ><TR ><TD CLASS="doc" >Advances the given address by the given offset in bytes. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:alignPtr" ><A NAME="v%3AalignPtr" ></A ></A ><B >alignPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="doc" >Given an arbitrary address and an alignment constraint, <TT ><A HREF="Foreign-Ptr.html#v%3AalignPtr" >alignPtr</A ></TT > yields the next higher address that fulfills the alignment constraint. An alignment constraint <TT >x</TT > is fulfilled by any address divisible by <TT >x</TT >. This operation is idempotent. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:minusPtr" ><A NAME="v%3AminusPtr" ></A ></A ><B >minusPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b -> <A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A ></TD ></TR ><TR ><TD CLASS="doc" ><P >Computes the offset required to get from the second to the first argument. We have </P ><PRE > p2 == p1 `plusPtr` (p2 `minusPtr` p1) </PRE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="2" ><A NAME="2" >Function pointers </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:FunPtr" ><A NAME="t%3AFunPtr" ></A ></A ><B >FunPtr</B > a </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" ><P >A value of type <TT ><TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > a</TT > is a pointer to a function callable from foreign code. The type <TT >a</TT > will normally be a <EM >foreign type</EM >, a function type with zero or more arguments where </P ><UL ><LI > the argument types are <EM >marshallable foreign types</EM >, i.e. <TT ><A HREF="../ghc-prim/GHC-Types.html#t%3AChar" >Char</A ></TT >, <TT ><A HREF="../ghc-prim/GHC-Types.html#t%3AInt" >Int</A ></TT >, Prelude.Double, Prelude.Float, <TT ><A HREF="../ghc-prim/GHC-Bool.html#t%3ABool" >Bool</A ></TT >, Data.Int.Int8, Data.Int.Int16, Data.Int.Int32, Data.Int.Int64, Data.Word.Word8, Data.Word.Word16, Data.Word.Word32, Data.Word.Word64, <TT ><TT ><A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A ></TT > a</TT >, <TT ><TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > a</TT >, <TT >Foreign.StablePtr.StablePtr a</TT > or a renaming of any of these using <TT >newtype</TT >. </LI ><LI > the return type is either a marshallable foreign type or has the form <TT >Prelude.IO t</TT > where <TT >t</TT > is a marshallable foreign type or <TT >()</TT >. </LI ></UL ><P >A value of type <TT ><TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > a</TT > may be a pointer to a foreign function, either returned by another foreign function or imported with a a static address import like </P ><PRE > foreign import ccall "stdlib.h &free" p_free :: FunPtr (Ptr a -> IO ()) </PRE ><P >or a pointer to a Haskell function created using a <EM >wrapper</EM > stub declared to produce a <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > of the correct type. For example: </P ><PRE > type Compare = Int -> Int -> Bool foreign import ccall "wrapper" mkCompare :: Compare -> IO (FunPtr Compare) </PRE ><P >Calls to wrapper stubs like <TT >mkCompare</TT > allocate storage, which should be released with Foreign.Ptr.freeHaskellFunPtr when no longer required. </P ><P >To convert <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > values to corresponding Haskell functions, one can define a <EM >dynamic</EM > stub for the specific foreign type, e.g. </P ><PRE > type IntFunction = CInt -> IO () foreign import ccall "dynamic" mkFun :: FunPtr IntFunction -> IntFunction </PRE ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:FunPtr')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:FunPtr" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Data-Typeable.html#t%3ATypeable1" >Typeable1</A > <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Eq.html#t%3AEq" >Eq</A > (<A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Ord.html#t%3AOrd" >Ord</A > (<A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Text-Show.html#t%3AShow" >Show</A > (<A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Foreign-Storable.html#t%3AStorable" >Storable</A > (<A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:nullFunPtr" ><A NAME="v%3AnullFunPtr" ></A ></A ><B >nullFunPtr</B > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a</TD ></TR ><TR ><TD CLASS="doc" >The constant <TT ><A HREF="Foreign-Ptr.html#v%3AnullFunPtr" >nullFunPtr</A ></TT > contains a distinguished value of <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > that is not associated with a valid memory location. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:castFunPtr" ><A NAME="v%3AcastFunPtr" ></A ></A ><B >castFunPtr</B > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a -> <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > b</TD ></TR ><TR ><TD CLASS="doc" >Casts a <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > to a <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > of a different type. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:castFunPtrToPtr" ><A NAME="v%3AcastFunPtrToPtr" ></A ></A ><B >castFunPtrToPtr</B > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > b</TD ></TR ><TR ><TD CLASS="doc" ><P >Casts a <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT > to a <TT ><A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A ></TT >. </P ><P ><EM >Note:</EM > this is valid only on architectures where data and function pointers range over the same set of addresses, and should only be used for bindings to external libraries whose interface already relies on this assumption. </P ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:castPtrToFunPtr" ><A NAME="v%3AcastPtrToFunPtr" ></A ></A ><B >castPtrToFunPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > b</TD ></TR ><TR ><TD CLASS="doc" ><P >Casts a <TT ><A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A ></TT > to a <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT >. </P ><P ><EM >Note:</EM > this is valid only on architectures where data and function pointers range over the same set of addresses, and should only be used for bindings to external libraries whose interface already relies on this assumption. </P ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:freeHaskellFunPtr" ><A NAME="v%3AfreeHaskellFunPtr" ></A ></A ><B >freeHaskellFunPtr</B > :: <A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A > a -> <A HREF="System-IO.html#t%3AIO" >IO</A > <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29" >()</A ></TD ></TR ><TR ><TD CLASS="doc" >Release the storage associated with the given <TT ><A HREF="Foreign-Ptr.html#t%3AFunPtr" >FunPtr</A ></TT >, 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. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="3" ><A NAME="3" >Integral types with lossless conversion to and from pointers </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:IntPtr" ><A NAME="t%3AIntPtr" ></A ></A ><B >IntPtr</B > </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >A signed integral type that can be losslessly converted to and from <TT >Ptr</TT >. </TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:IntPtr')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:IntPtr" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3ABounded" >Bounded</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3AEnum" >Enum</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Eq.html#t%3AEq" >Eq</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3AIntegral" >Integral</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3ANum" >Num</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Ord.html#t%3AOrd" >Ord</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Text-Read.html#t%3ARead" >Read</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3AReal" >Real</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Text-Show.html#t%3AShow" >Show</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Typeable.html#t%3ATypeable" >Typeable</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Bits.html#t%3ABits" >Bits</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Foreign-Storable.html#t%3AStorable" >Storable</A > <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:ptrToIntPtr" ><A NAME="v%3AptrToIntPtr" ></A ></A ><B >ptrToIntPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A ></TD ></TR ><TR ><TD CLASS="doc" >casts a <TT >Ptr</TT > to an <TT >IntPtr</TT > </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:intPtrToPtr" ><A NAME="v%3AintPtrToPtr" ></A ></A ><B >intPtrToPtr</B > :: <A HREF="Foreign-Ptr.html#t%3AIntPtr" >IntPtr</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="doc" >casts an <TT >IntPtr</TT > to a <TT >Ptr</TT > </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:WordPtr" ><A NAME="t%3AWordPtr" ></A ></A ><B >WordPtr</B > </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >An unsigned integral type that can be losslessly converted to and from <TT >Ptr</TT >. </TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:WordPtr')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:WordPtr" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3ABounded" >Bounded</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3AEnum" >Enum</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Eq.html#t%3AEq" >Eq</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3AIntegral" >Integral</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3ANum" >Num</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Ord.html#t%3AOrd" >Ord</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Text-Read.html#t%3ARead" >Read</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Prelude.html#t%3AReal" >Real</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Text-Show.html#t%3AShow" >Show</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Typeable.html#t%3ATypeable" >Typeable</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Data-Bits.html#t%3ABits" >Bits</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="Foreign-Storable.html#t%3AStorable" >Storable</A > <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:ptrToWordPtr" ><A NAME="v%3AptrToWordPtr" ></A ></A ><B >ptrToWordPtr</B > :: <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a -> <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A ></TD ></TR ><TR ><TD CLASS="doc" >casts a <TT >Ptr</TT > to a <TT >WordPtr</TT > </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:wordPtrToPtr" ><A NAME="v%3AwordPtrToPtr" ></A ></A ><B >wordPtrToPtr</B > :: <A HREF="Foreign-Ptr.html#t%3AWordPtr" >WordPtr</A > -> <A HREF="Foreign-Ptr.html#t%3APtr" >Ptr</A > a</TD ></TR ><TR ><TD CLASS="doc" >casts a <TT >WordPtr</TT > to a <TT >Ptr</TT > </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="botbar" >Produced by <A HREF="http://www.haskell.org/haddock/" >Haddock</A > version 2.4.2</TD ></TR ></TABLE ></BODY ></HTML >