X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FRtClosureInspect.hs;h=7c144c09bdefa54d5069db6fd985992c63b03226;hb=870e7853d2fdd3253646ee1dd78335f71f39fc7a;hp=e8157ac734606ea1bb7111dbd1bc81429d82b500;hpb=cb429c8ac482f3b294f709b5ba50423fdf1f35b0;p=ghc-hetmet.git diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs index e8157ac..7c144c0 100644 --- a/compiler/ghci/RtClosureInspect.hs +++ b/compiler/ghci/RtClosureInspect.hs @@ -10,13 +10,7 @@ module RtClosureInspect( cvObtainTerm, -- :: HscEnv -> Bool -> Maybe Type -> HValue -> IO Term - ClosureType(..), - getClosureData, -- :: a -> IO Closure - Closure ( tipe, infoPtr, ptrs, nonPtrs ), - isConstr, -- :: ClosureType -> Bool - isIndirection, -- :: ClosureType -> Bool - - Term(..), + Term(..), pprTerm, cPprTerm, cPprTermBase, @@ -72,7 +66,7 @@ import GHC.Word ( Word32(..), Word64(..) ) import Control.Monad import Data.Maybe import Data.Array.Base -import Data.List ( partition ) +import Data.List ( partition, nub ) import Foreign.Storable import IO @@ -174,6 +168,7 @@ readCType i | i == BLACKHOLE = Blackhole | i >= IND && i <= IND_STATIC = Indirection (fromIntegral i) | fromIntegral i == aP_CODE = AP + | i == AP_STACK = AP | fromIntegral i == pAP_CODE = PAP | otherwise = Other (fromIntegral i) @@ -185,6 +180,11 @@ isIndirection (Indirection _) = True --isIndirection ThunkSelector = True isIndirection _ = False +isThunk (Thunk _) = True +isThunk ThunkSelector = True +isThunk AP = True +isThunk _ = False + isFullyEvaluated :: a -> IO Bool isFullyEvaluated a = do closure <- getClosureData a @@ -472,30 +472,13 @@ instScheme ty | (tvs, rho) <- tcSplitForAllTys ty = liftTcM$ do return (ty', zipTopTvSubst tvs' (mkTyVarTys tvs)) cvObtainTerm :: HscEnv -> Bool -> Maybe Type -> HValue -> IO Term -cvObtainTerm hsc_env force mb_ty a = do - -- Obtain the term and tidy the type before returning it - term <- cvObtainTerm1 hsc_env force mb_ty a - return $ tidyTypes term - where - tidyTypes = foldTerm idTermFold { - fTerm = \ty dc hval tt -> Term (tidy ty) dc hval tt, - fSuspension = \ct mb_ty hval n -> - Suspension ct (fmap tidy mb_ty) hval n - } - tidy ty = tidyType (emptyTidyOccEnv, tidyVarEnv ty) ty - tidyVarEnv ty = mkVarEnv$ - [ (v, setTyVarName v (tyVarName tv)) - | (tv,v) <- zip alphaTyVars vars] - where vars = varSetElems$ tyVarsOfType ty - -cvObtainTerm1 :: HscEnv -> Bool -> Maybe Type -> HValue -> IO Term -cvObtainTerm1 hsc_env force mb_ty hval = runTR hsc_env $ do +cvObtainTerm hsc_env force mb_ty hval = runTR hsc_env $ do tv <- liftM mkTyVarTy (newVar argTypeKind) case mb_ty of Nothing -> go tv tv hval Just ty | isMonomorphic ty -> go ty ty hval Just ty -> do - (ty',rev_subst) <- instScheme (sigmaType$ fromJust mb_ty) + (ty',rev_subst) <- instScheme (sigmaType ty) addConstraint tv ty' term <- go tv tv hval --restore original Tyvars @@ -510,7 +493,7 @@ cvObtainTerm1 hsc_env force mb_ty hval = runTR hsc_env $ do clos <- trIO $ getClosureData a case tipe clos of -- Thunks we may want to force - Thunk _ | force -> seq a $ go tv ty a + t | isThunk t && force -> seq a $ go tv ty a -- We always follow indirections Indirection _ -> go tv ty $! (ptrs clos ! 0) -- The interesting case @@ -565,7 +548,8 @@ cvObtainTerm1 hsc_env force mb_ty hval = runTR hsc_env $ do , ptext SLIT("reOrderTerms") $$ (ppr pointed $$ ppr unpointed)) head unpointed : reOrderTerms pointed (tail unpointed) tys -isMonomorphic = isEmptyVarSet . tyVarsOfType +isMonomorphic ty | isForAllTy ty = False +isMonomorphic ty = (isEmptyVarSet . tyVarsOfType) ty zonkTerm :: Term -> TcM Term zonkTerm = foldTerm idTermFoldM {