X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FPtr.hs;h=ad20da4a5a6fa294a70e81122532dc5a6f1e5b72;hb=b1f2e321ceac8fcfc1f0756e2f5c2585fbd00b3c;hp=d7f9cb0cde2867a8f5e6bf3464ec4836071d707d;hpb=7f1f4e7a695c402ddd3a1dc2cc7114e649a78ebc;p=ghc-base.git diff --git a/Foreign/Ptr.hs b/Foreign/Ptr.hs index d7f9cb0..ad20da4 100644 --- a/Foreign/Ptr.hs +++ b/Foreign/Ptr.hs @@ -1,35 +1,34 @@ -{-# OPTIONS -fno-implicit-prelude #-} +{-# OPTIONS_GHC -fno-implicit-prelude #-} ----------------------------------------------------------------------------- --- +-- | -- Module : Foreign.Ptr -- Copyright : (c) The FFI task force 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : ffi@haskell.org --- Stability : experimental --- Portability : non-portable --- --- $Id: Ptr.hs,v 1.1 2001/06/28 14:15:03 simonmar Exp $ +-- Stability : provisional +-- Portability : portable -- --- Pointer types. +-- This module provides typed pointers to foreign data. It is part +-- of the Foreign Function Interface (FFI) and will normally be +-- imported via the "Foreign" module. -- ----------------------------------------------------------------------------- module Foreign.Ptr ( - -------------------------------------------------------------------- - -- Data pointers. + + -- * Data pointers - Ptr(..), -- data Ptr a + Ptr, -- 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 - -------------------------------------------------------------------- - -- Function pointers. + -- * Function pointers - FunPtr(..), -- data FunPtr a + FunPtr, -- data FunPtr a nullFunPtr, -- :: FunPtr a castFunPtr, -- :: FunPtr a -> FunPtr b castFunPtrToPtr, -- :: FunPtr a -> Ptr b @@ -40,16 +39,59 @@ module Foreign.Ptr ( ) where -import Data.Dynamic - #ifdef __GLASGOW_HASKELL__ import GHC.Ptr import GHC.IOBase -import GHC.Err +import GHC.Base +import GHC.Num +import GHC.List +import GHC.Show +import Numeric #endif -foreign import "freeHaskellFunctionPtr" unsafe - freeHaskellFunPtr :: FunPtr a -> IO () +#ifdef __NHC__ +import NHC.FFI + ( Ptr + , nullPtr + , castPtr + , plusPtr + , alignPtr + , minusPtr + , FunPtr + , nullFunPtr + , castFunPtr + , castFunPtrToPtr + , castPtrToFunPtr + , freeHaskellFunPtr + ) +#endif + +#ifdef __HUGS__ +import Hugs.Ptr +#endif -#include "Dynamic.h" -INSTANCE_TYPEABLE1(Ptr,ptrTc,"Ptr") +#ifdef __GLASGOW_HASKELL__ +#include "MachDeps.h" + +#if (WORD_SIZE_IN_BITS == 32 || WORD_SIZE_IN_BITS == 64) +instance Show (Ptr a) where + showsPrec p (Ptr a) rs = pad_out (showHex (word2Integer(int2Word#(addr2Int# a))) "") rs + where + -- want 0s prefixed to pad it out to a fixed length. + pad_out ls rs = + '0':'x':(replicate (2*SIZEOF_HSPTR - length ls) '0') ++ ls ++ rs + -- word2Integer :: Word# -> Integer (stolen from Word.lhs) + word2Integer w = case word2Integer# w of + (# s, d #) -> J# s d + +instance Show (FunPtr a) where + showsPrec p = showsPrec p . castFunPtrToPtr +#endif + +-- | 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. +foreign import ccall unsafe "freeHaskellFunctionPtr" + freeHaskellFunPtr :: FunPtr a -> IO () +#endif