X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FRtClosureInspect.hs;h=e7c85c922545d697f8751e722fbb74650726034a;hb=0a183bd0d5d9952699295fa9506de0df97392ef5;hp=0624169178befafdf9cae8c42e9c341fa883823f;hpb=bd657baa7768442553f769721effe98a3c7e58a3;p=ghc-hetmet.git diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs index 0624169..e7c85c9 100644 --- a/compiler/ghci/RtClosureInspect.hs +++ b/compiler/ghci/RtClosureInspect.hs @@ -22,6 +22,8 @@ module RtClosureInspect( isFullyEvaluated, isPointed, isFullyEvaluatedTerm, + mapTermType, + termTyVars -- unsafeDeepSeq, ) where @@ -66,7 +68,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 @@ -168,6 +170,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) @@ -179,6 +182,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 @@ -278,6 +286,18 @@ idTermFoldM = TermFold { fSuspension = (((return.).).). Suspension } +mapTermType f = foldTerm idTermFold { + fTerm = \ty dc hval tt -> Term (f ty) dc hval tt, + fSuspension = \ct mb_ty hval n -> + Suspension ct (fmap f mb_ty) hval n } + +termTyVars = foldTerm TermFold { + fTerm = \ty _ _ tt -> + tyVarsOfType ty `plusVarEnv` concatVarEnv tt, + fSuspension = \_ mb_ty _ _ -> + maybe emptyVarEnv tyVarsOfType mb_ty, + fPrim = \ _ _ -> emptyVarEnv } + where concatVarEnv = foldr plusVarEnv emptyVarEnv ---------------------------------- -- Pretty printing of terms ---------------------------------- @@ -368,7 +388,7 @@ type TR a = TcM a runTR :: HscEnv -> TR Term -> IO Term runTR hsc_env c = do - mb_term <- initTcPrintErrors hsc_env iNTERACTIVE (c >>= zonkTerm) + mb_term <- initTcPrintErrors hsc_env iNTERACTIVE c case mb_term of Nothing -> panic "Can't unify" Just term -> return term @@ -466,37 +486,17 @@ 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 + Nothing -> go tv tv hval >>= zonkTerm + Just ty | isMonomorphic ty -> go ty ty hval >>= zonkTerm 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 + term <- go tv tv hval >>= zonkTerm --restore original Tyvars - return$ flip foldTerm term idTermFold { - fTerm = \ty dc hval tt -> Term (substTy rev_subst ty) dc hval tt, - fSuspension = \ct mb_ty hval n -> - Suspension ct (substTy rev_subst `fmap` mb_ty) hval n} + return$ mapTermType (substTy rev_subst) term where go tv ty a = do let monomorphic = not(isTyVarTy tv) -- This is a convention. The ancestor tests for @@ -504,7 +504,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 @@ -559,7 +559,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 {