X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FMarshal%2FAlloc.hs;h=1687c82f6fe8ebcc6c67dccd933ed028a2ce9633;hb=1ded2c9515562bbe3a231f7cb66a931cf7513718;hp=706b4b0cdbff00093c545cea9b47ccb3dbab1470;hpb=7de50399a42ee49b0473b7b6eea2b44a2f941a12;p=ghc-base.git diff --git a/Foreign/Marshal/Alloc.hs b/Foreign/Marshal/Alloc.hs index 706b4b0..1687c82 100644 --- a/Foreign/Marshal/Alloc.hs +++ b/Foreign/Marshal/Alloc.hs @@ -1,28 +1,28 @@ {-# OPTIONS -fno-implicit-prelude #-} ----------------------------------------------------------------------------- --- +-- | -- Module : Foreign.Marshal.Alloc -- 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 : provisional -- Portability : portable -- --- $Id: Alloc.hs,v 1.5 2002/02/05 17:32:25 simonmar Exp $ --- -- Marshalling support: basic routines for memory allocation -- ----------------------------------------------------------------------------- module Foreign.Marshal.Alloc ( + -- * Allocation malloc, -- :: Storable a => IO (Ptr a) mallocBytes, -- :: Int -> IO (Ptr a) alloca, -- :: Storable a => (Ptr a -> IO b) -> IO b allocaBytes, -- :: Int -> (Ptr a -> IO b) -> IO b - reallocBytes, -- :: Ptr a -> Int -> IO (Ptr a) + realloc, -- :: Storable b => Ptr a -> IO (Ptr b) + reallocBytes, -- :: Ptr a -> Int -> IO (Ptr a) free -- :: Ptr a -> IO () ) where @@ -45,7 +45,9 @@ import GHC.Base -- exported functions -- ------------------ --- allocate space for storable type +-- |Allocate space for storable type. The size of the area allocated +-- is determined by the 'sizeOf' method from the instance of +-- 'Storable' for the appropriate type. -- malloc :: Storable a => IO (Ptr a) malloc = doMalloc undefined @@ -53,16 +55,16 @@ malloc = doMalloc undefined doMalloc :: Storable a => a -> IO (Ptr a) doMalloc dummy = mallocBytes (sizeOf dummy) --- allocate given number of bytes of storage +-- |Allocate given number of bytes of storage, equivalent to C\'s @malloc()@. -- mallocBytes :: Int -> IO (Ptr a) mallocBytes size = failWhenNULL "malloc" (_malloc (fromIntegral size)) --- temporarily allocate space for a storable type +-- |Temporarily allocate space for a storable type. -- --- * the pointer passed as an argument to the function must *not* escape from --- this function; in other words, in `alloca f' the allocated storage must --- not be used after `f' returns +-- * the pointer passed as an argument to the function must /not/ escape from +-- this function; in other words, in @alloca f@ the allocated storage must +-- not be used after @f@ returns -- alloca :: Storable a => (Ptr a -> IO b) -> IO b alloca = doAlloca undefined @@ -70,11 +72,11 @@ alloca = doAlloca undefined doAlloca :: Storable a => a -> (Ptr a -> IO b) -> IO b doAlloca dummy = allocaBytes (sizeOf dummy) --- temporarily allocate the given number of bytes of storage +-- |Temporarily allocate the given number of bytes of storage. -- --- * the pointer passed as an argument to the function must *not* escape from --- this function; in other words, in `allocaBytes n f' the allocated storage --- must not be used after `f' returns +-- * the pointer passed as an argument to the function must /not/ escape from +-- this function; in other words, in @allocaBytes n f@ the allocated storage +-- must not be used after @f@ returns -- #ifdef __GLASGOW_HASKELL__ allocaBytes :: Int -> (Ptr a -> IO b) -> IO b @@ -92,13 +94,27 @@ allocaBytes :: Int -> (Ptr a -> IO b) -> IO b allocaBytes size = bracket (mallocBytes size) free #endif --- adjust a malloc'ed storage area to the given size +-- |Adjust a malloc\'ed storage area to the given size of the required type +-- (corresponds to C\'s @realloc()@). +-- +realloc :: Storable b => Ptr a -> IO (Ptr b) +realloc = doRealloc undefined + where + doRealloc :: Storable b => b -> Ptr a -> IO (Ptr b) + doRealloc dummy ptr = let + size = fromIntegral (sizeOf dummy) + in + failWhenNULL "realloc" (_realloc ptr size) + +-- |Adjust a malloc\'ed storage area to the given size (equivalent to +-- C\'s @realloc()@). -- reallocBytes :: Ptr a -> Int -> IO (Ptr a) reallocBytes ptr size = failWhenNULL "realloc" (_realloc ptr (fromIntegral size)) --- free malloc'ed storage +-- |Free malloc\'ed storage (equivalent to +-- C\'s @free()@) -- free :: Ptr a -> IO () free = _free @@ -125,5 +141,5 @@ failWhenNULL name f = do -- basic C routines needed for memory allocation -- foreign import ccall unsafe "malloc" _malloc :: CSize -> IO (Ptr a) -foreign import ccall unsafe "realloc" _realloc :: Ptr a -> CSize -> IO (Ptr a) +foreign import ccall unsafe "realloc" _realloc :: Ptr a -> CSize -> IO (Ptr b) foreign import ccall unsafe "free" _free :: Ptr a -> IO ()