packages feed

lhc-0.6.20081210.1: lib/base/src/Foreign/StablePtr.hs

{-# OPTIONS_LHC -N -fffi #-}
module Foreign.StablePtr(
    StablePtr(),
    castStablePtrToPtr,
    castPtrToStablePtr,
    newStablePtr,
    deRefStablePtr,
    freeStablePtr
    ) where

import Lhc.Addr
import Lhc.Basics
import Lhc.IO
import Lhc.Monad

newtype StablePtr a = StablePtr (Ptr ())
data PlaceHolder

castPtrToStablePtr :: Ptr () -> StablePtr a
castPtrToStablePtr p = StablePtr p

castStablePtrToPtr :: StablePtr a -> Ptr ()
castStablePtrToPtr (StablePtr p) = p


freeStablePtr :: StablePtr a -> IO ()
freeStablePtr _ = return ()

newStablePtr :: a -> IO (StablePtr a)
newStablePtr x = do
    ptr <- ref_ptr (unsafeCoerce x)
    return (StablePtr ptr)

deRefStablePtr :: StablePtr a -> IO a
deRefStablePtr (StablePtr x) = do
    v <- deref_ptr x
    return (unsafeCoerce v)

deref_ptr = undefined
ref_ptr = undefined
unsafeCoerce = undefined

{-

foreign import primitive deref_ptr :: Ptr () -> IO PlaceHolder
foreign import primitive ref_ptr   :: PlaceHolder -> IO (Ptr ())

foreign import primitive unsafeCoerce :: a -> b
-}