summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-10-31 13:58:04 -0400
committerBen Gamari <ben@smart-cactus.org>2019-10-31 17:02:16 -0400
commit4cbebdc7059ce868d1e3792d5c7bfd339a27992e (patch)
treea87bf0c6e78210126f0ed7a11a6ab9eeb6ca6584
parent4898df1cc25132dc9e2599d4fa4e1bbc9423cda5 (diff)
downloadhaskell-wip/T17424.tar.gz
ghci: Shuffle unsafeCoerce# in CreateBCOwip/T17424
Previously
-rw-r--r--libraries/ghci/GHCi/CreateBCO.hs25
1 files changed, 18 insertions, 7 deletions
diff --git a/libraries/ghci/GHCi/CreateBCO.hs b/libraries/ghci/GHCi/CreateBCO.hs
index 96fc4418ff..28835ea311 100644
--- a/libraries/ghci/GHCi/CreateBCO.hs
+++ b/libraries/ghci/GHCi/CreateBCO.hs
@@ -34,9 +34,16 @@ createBCOs bcos = do
hvals <- fixIO $ \hvs -> do
let arr = listArray (0, n_bcos-1) hvs
mapM (createBCO arr) bcos
- mapM mkRemoteRef hvals
+ mapM valueToRemoteRef hvals
-createBCO :: Array Int HValue -> ResolvedBCO -> IO HValue
+data Value = ValueBCO !BCO
+ | ValueOther HValue
+
+valueToRemoteRef :: Value -> IO HValueRef
+valueToRemoteRef (ValueBCO bco) = mkRemoteRef (unsafeCoerce# bco)
+valueToRemoteRef (ValueOther val) = mkRemoteRef val
+
+createBCO :: Array Int Value -> ResolvedBCO -> IO Value
createBCO _ ResolvedBCO{..} | resolvedBCOIsLE /= isLittleEndian
= throwIO (ErrorCall $
unlines [ "The endianness of the ResolvedBCO does not match"
@@ -58,15 +65,15 @@ createBCO arr bco
-- non-zero arity BCOs in an AP thunk.
--
if (resolvedBCOArity bco > 0)
- then return (HValue (unsafeCoerce# bco#))
+ then return (ValueBCO (BCO bco#))
else case mkApUpd0# bco# of { (# final_bco #) ->
- return (HValue final_bco) }
+ return (ValueOther final_bco) }
toWordArray :: UArray Int Word64 -> UArray Int Word
toWordArray = amap fromIntegral
-linkBCO' :: Array Int HValue -> ResolvedBCO -> IO BCO
+linkBCO' :: Array Int Value -> ResolvedBCO -> IO BCO
linkBCO' arr ResolvedBCO{..} = do
let
ptrs = ssElts resolvedBCOPtrs
@@ -90,12 +97,14 @@ linkBCO' arr ResolvedBCO{..} = do
-- we recursively link any sub-BCOs while making the ptrs array
-mkPtrsArray :: Array Int HValue -> Word -> [ResolvedBCOPtr] -> IO PtrsArr
+mkPtrsArray :: Array Int Value -> Word -> [ResolvedBCOPtr] -> IO PtrsArr
mkPtrsArray arr n_ptrs ptrs = do
marr <- newPtrsArray (fromIntegral n_ptrs)
let
fill (ResolvedBCORef n) i =
- writePtrsArrayHValue i (arr ! n) marr -- must be lazy!
+ case arr ! n of
+ ValueBCO (BCO bco) -> writePtrsArrayBCO i bco marr
+ ValueOther ptr -> writePtrsArrayHValue i ptr marr -- must be lazy!
fill (ResolvedBCOPtr r) i = do
hv <- localRef r
writePtrsArrayHValue i hv marr
@@ -110,6 +119,8 @@ mkPtrsArray arr n_ptrs ptrs = do
zipWithM_ fill ptrs [0..]
return marr
+-- | An array of pointers to unlifted closures. This is rather delicate; we use
+-- 'ArrayArray#' since we don't have an @UnliftedArray#@ yet.
data PtrsArr = PtrsArr (MutableArray# RealWorld HValue)
newPtrsArray :: Int -> IO PtrsArr