{-# LANGUAGE CPP, StandaloneDeriving, GeneralizedNewtypeDeriving #-}
module GHCi.RemoteTypes
(
RemotePtr(..)
, toRemotePtr
, fromRemotePtr
, castRemotePtr
, RemoteRef (..)
, mkRemoteRef
, localRef
, freeRemoteRef
, castRemoteRef
, ForeignRef
, mkForeignRef
, withForeignRef
, finalizeForeignRef
, castForeignRef
, unsafeForeignRefToRemoteRef
, HValue(..)
, HValueRef
, ForeignHValue
) where
import Prelude
import Control.DeepSeq
import Data.Word
import Foreign hiding (newForeignPtr)
import Foreign.Concurrent
import Data.Binary
import GHC.Exts
import GHC.ForeignPtr
newtype RemotePtr a = RemotePtr Word64
toRemotePtr :: Ptr a -> RemotePtr a
toRemotePtr :: forall a. Ptr a -> RemotePtr a
toRemotePtr Ptr a
p = Word64 -> RemotePtr a
forall a. Word64 -> RemotePtr a
RemotePtr (WordPtr -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Ptr a -> WordPtr
forall a. Ptr a -> WordPtr
ptrToWordPtr Ptr a
p))
fromRemotePtr :: RemotePtr a -> Ptr a
fromRemotePtr :: forall a. RemotePtr a -> Ptr a
fromRemotePtr (RemotePtr Word64
p) = WordPtr -> Ptr a
forall a. WordPtr -> Ptr a
wordPtrToPtr (Word64 -> WordPtr
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
p)
castRemotePtr :: RemotePtr a -> RemotePtr b
castRemotePtr :: forall a b. RemotePtr a -> RemotePtr b
castRemotePtr (RemotePtr Word64
a) = Word64 -> RemotePtr b
forall a. Word64 -> RemotePtr a
RemotePtr Word64
a
deriving instance Show (RemotePtr a)
deriving instance Binary (RemotePtr a)
deriving instance NFData (RemotePtr a)
newtype HValue = HValue Any
instance Show HValue where
show :: HValue -> String
show HValue
_ = String
"<HValue>"
type HValueRef = RemoteRef HValue
type ForeignHValue = ForeignRef HValue
newtype RemoteRef a = RemoteRef (RemotePtr ())
deriving (, )
castRemoteRef :: RemoteRef a -> RemoteRef b
castRemoteRef :: forall a b. RemoteRef a -> RemoteRef b
castRemoteRef = RemoteRef a -> RemoteRef b
forall a b. Coercible a b => a -> b
coerce
mkRemoteRef :: a -> IO (RemoteRef a)
mkRemoteRef :: forall a. a -> IO (RemoteRef a)
mkRemoteRef = do
<- a -> IO (StablePtr a)
forall a. a -> IO (StablePtr a)
newStablePtr a
a
return $! RemoteRef (toRemotePtr (castStablePtrToPtr sp))
localRef :: RemoteRef a -> IO a
localRef :: forall a. RemoteRef a -> IO a
localRef (RemoteRef ) =
StablePtr a -> IO a
forall a. StablePtr a -> IO a
deRefStablePtr (Ptr () -> StablePtr a
forall a. Ptr () -> StablePtr a
castPtrToStablePtr (RemotePtr () -> Ptr ()
forall a. RemotePtr a -> Ptr a
fromRemotePtr RemotePtr ()
w))
freeRemoteRef :: RemoteRef a -> IO ()
freeRemoteRef :: forall a. RemoteRef a -> IO ()
freeRemoteRef (RemoteRef ) =
StablePtr (ZonkAny 0) -> IO ()
forall a. StablePtr a -> IO ()
freeStablePtr (Ptr () -> StablePtr (ZonkAny 0)
forall a. Ptr () -> StablePtr a
castPtrToStablePtr (RemotePtr () -> Ptr ()
forall a. RemotePtr a -> Ptr a
fromRemotePtr RemotePtr ()
w))
newtype ForeignRef a = ForeignRef (ForeignPtr ())
instance NFData (ForeignRef a) where
= ForeignRef a
x ForeignRef a -> () -> ()
forall a b. a -> b -> b
`seq` ()
mkForeignRef :: RemoteRef a -> IO () -> IO (ForeignRef a)
mkForeignRef :: forall a. RemoteRef a -> IO () -> IO (ForeignRef a)
mkForeignRef (RemoteRef ) =
ForeignPtr () -> ForeignRef a
forall a. ForeignPtr () -> ForeignRef a
ForeignRef (ForeignPtr () -> ForeignRef a)
-> IO (ForeignPtr ()) -> IO (ForeignRef a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr () -> IO () -> IO (ForeignPtr ())
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr (RemotePtr () -> Ptr ()
forall a. RemotePtr a -> Ptr a
fromRemotePtr RemotePtr ()
hvref) IO ()
finalizer
withForeignRef :: ForeignRef a -> (RemoteRef a -> IO b) -> IO b
withForeignRef :: forall a b. ForeignRef a -> (RemoteRef a -> IO b) -> IO b
withForeignRef (ForeignRef ) =
ForeignPtr () -> (Ptr () -> IO b) -> IO b
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr ()
fp (RemoteRef a -> IO b
f (RemoteRef a -> IO b) -> (Ptr () -> RemoteRef a) -> Ptr () -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RemotePtr () -> RemoteRef a
forall a. RemotePtr () -> RemoteRef a
RemoteRef (RemotePtr () -> RemoteRef a)
-> (Ptr () -> RemotePtr ()) -> Ptr () -> RemoteRef a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr () -> RemotePtr ()
forall a. Ptr a -> RemotePtr a
toRemotePtr)
unsafeForeignRefToRemoteRef :: ForeignRef a -> RemoteRef a
unsafeForeignRefToRemoteRef :: forall a. ForeignRef a -> RemoteRef a
unsafeForeignRefToRemoteRef (ForeignRef ) =
RemotePtr () -> RemoteRef a
forall a. RemotePtr () -> RemoteRef a
RemoteRef (Ptr () -> RemotePtr ()
forall a. Ptr a -> RemotePtr a
toRemotePtr (ForeignPtr () -> Ptr ()
forall a. ForeignPtr a -> Ptr a
unsafeForeignPtrToPtr ForeignPtr ()
fp))
finalizeForeignRef :: ForeignRef a -> IO ()
finalizeForeignRef :: forall a. ForeignRef a -> IO ()
finalizeForeignRef (ForeignRef ) = ForeignPtr () -> IO ()
forall a. ForeignPtr a -> IO ()
finalizeForeignPtr ForeignPtr ()
fp
castForeignRef :: ForeignRef a -> ForeignRef b
castForeignRef :: forall a b. ForeignRef a -> ForeignRef b
castForeignRef = ForeignRef a -> ForeignRef b
forall a b. Coercible a b => a -> b
coerce