ghci-8.10.2: GHCi/StaticPtrTable.hs
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module GHCi.StaticPtrTable ( sptAddEntry ) where
import Prelude -- See note [Why do we import Prelude here?]
import Data.Word
import Foreign
import GHC.Fingerprint
import GHCi.RemoteTypes
-- | Used by GHCi to add an SPT entry for a set of interactive bindings.
sptAddEntry :: Fingerprint -> HValue -> IO ()
sptAddEntry (Fingerprint a b) (HValue x) = do
-- We own the memory holding the key (fingerprint) which gets inserted into
-- the static pointer table and can't free it until the SPT entry is removed
-- (which is currently never).
fpr_ptr <- newArray [a,b]
sptr <- newStablePtr x
ent_ptr <- malloc
poke ent_ptr (castStablePtrToPtr sptr)
spt_insert_stableptr fpr_ptr ent_ptr
foreign import ccall "hs_spt_insert_stableptr"
spt_insert_stableptr :: Ptr Word64 -> Ptr (Ptr ()) -> IO ()