(original) (raw)

{-# LANGUAGE Unsafe #-} {-# LANGUAGE NoImplicitPrelude #-} {-# OPTIONS_HADDOCK hide #-}

module Foreign.ForeignPtr.Imp (

      [ForeignPtr](GHC.ForeignPtr.html#ForeignPtr)
    , [FinalizerPtr](GHC.ForeignPtr.html#FinalizerPtr)
    , [FinalizerEnvPtr](GHC.ForeignPtr.html#FinalizerEnvPtr)

    
    , [newForeignPtr](Foreign.ForeignPtr.Imp.html#newForeignPtr)
    , [newForeignPtr_](GHC.ForeignPtr.html#newForeignPtr%5F)
    , [addForeignPtrFinalizer](GHC.ForeignPtr.html#addForeignPtrFinalizer)
    , [newForeignPtrEnv](Foreign.ForeignPtr.Imp.html#newForeignPtrEnv)
    , [addForeignPtrFinalizerEnv](GHC.ForeignPtr.html#addForeignPtrFinalizerEnv)
    , [withForeignPtr](Foreign.ForeignPtr.Imp.html#withForeignPtr)
    , [finalizeForeignPtr](GHC.ForeignPtr.html#finalizeForeignPtr)

    
    , [unsafeForeignPtrToPtr](GHC.ForeignPtr.html#unsafeForeignPtrToPtr)
    , [touchForeignPtr](GHC.ForeignPtr.html#touchForeignPtr)
    , [castForeignPtr](GHC.ForeignPtr.html#castForeignPtr)
    , [plusForeignPtr](GHC.ForeignPtr.html#plusForeignPtr)

    
    , [mallocForeignPtr](GHC.ForeignPtr.html#mallocForeignPtr)
    , [mallocForeignPtrBytes](GHC.ForeignPtr.html#mallocForeignPtrBytes)
    , [mallocForeignPtrArray](Foreign.ForeignPtr.Imp.html#mallocForeignPtrArray)
    , [mallocForeignPtrArray0](Foreign.ForeignPtr.Imp.html#mallocForeignPtrArray0)
    )
    where

import Foreign.Ptr import Foreign.Storable ( Storable(sizeOf) )

import GHC.Base import GHC.Num import GHC.ForeignPtr

newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)

newForeignPtr finalizer p = do fObj <- newForeignPtr_ p addForeignPtrFinalizer finalizer fObj return fObj

withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b

withForeignPtr fo io = do r <- io (unsafeForeignPtrToPtr fo) touchForeignPtr fo return r

newForeignPtrEnv :: FinalizerEnvPtr env a -> Ptr env -> Ptr a -> IO (ForeignPtr a) newForeignPtrEnv finalizer env p = do fObj <- newForeignPtr_ p addForeignPtrFinalizerEnv finalizer env fObj return fObj

mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a) mallocForeignPtrArray = doMalloc undefined where doMalloc :: Storable b => b -> Int -> IO (ForeignPtr b) doMalloc dummy size = mallocForeignPtrBytes (size * sizeOf dummy)

mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a) mallocForeignPtrArray0 size = mallocForeignPtrArray (size + 1)