diff options
Diffstat (limited to 'libraries/ghci/GHCi/CreateBCO.hs')
-rw-r--r-- | libraries/ghci/GHCi/CreateBCO.hs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/libraries/ghci/GHCi/CreateBCO.hs b/libraries/ghci/GHCi/CreateBCO.hs index 6a9b79ae62..9501b5f0a7 100644 --- a/libraries/ghci/GHCi/CreateBCO.hs +++ b/libraries/ghci/GHCi/CreateBCO.hs @@ -14,6 +14,7 @@ module GHCi.CreateBCO (createBCOs) where import GHCi.ResolvedBCO import GHCi.RemoteTypes +import GHCi.BreakArray import SizedSeq import System.IO (fixIO) @@ -31,7 +32,7 @@ createBCOs bcos = do hvals <- fixIO $ \hvs -> do let arr = listArray (0, n_bcos-1) hvs mapM (createBCO arr) bcos - mapM mkHValueRef hvals + mapM mkRemoteRef hvals createBCO :: Array Int HValue -> ResolvedBCO -> IO HValue createBCO arr bco @@ -85,15 +86,16 @@ mkPtrsArray arr n_ptrs ptrs = do fill (ResolvedBCORef n) i = writePtrsArrayHValue i (arr ! n) marr -- must be lazy! fill (ResolvedBCOPtr r) i = do - hv <- localHValueRef r + hv <- localRef r writePtrsArrayHValue i hv marr fill (ResolvedBCOStaticPtr r) i = do writePtrsArrayPtr i (fromRemotePtr r) marr fill (ResolvedBCOPtrBCO bco) i = do BCO bco# <- linkBCO' arr bco writePtrsArrayBCO i bco# marr - fill (ResolvedBCOPtrLocal hv) i = do - writePtrsArrayHValue i hv marr + fill (ResolvedBCOPtrBreakArray r) i = do + BA mba <- localRef r + writePtrsArrayMBA i mba marr zipWithM_ fill ptrs [0..] return marr @@ -123,6 +125,10 @@ writePtrsArrayBCO (I# i) bco (PtrsArr arr) = IO $ \s -> data BCO = BCO BCO# +writePtrsArrayMBA :: Int -> MutableByteArray# s -> PtrsArr -> IO () +writePtrsArrayMBA (I# i) mba (PtrsArr arr) = IO $ \s -> + case (unsafeCoerce# writeArray#) arr i mba s of s' -> (# s', () #) + newBCO :: ByteArray# -> ByteArray# -> Array# a -> Int# -> ByteArray# -> IO BCO newBCO instrs lits ptrs arity bitmap = IO $ \s -> case newBCO# instrs lits ptrs arity bitmap s of |