X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=compiler%2Fghci%2FRtClosureInspect.hs;h=597a9a72f83c8f926c9023bb8fe7dbcbf06440b7;hb=8415c28b4ff37abf52d35af87e3435769b2ef6d8;hp=b281695985faa37a53510c3ee91118cdc7bef1ce;hpb=a40f2735958055f7ff94e5df73e710044aa63b2c;p=ghc-hetmet.git diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs index b281695..597a9a7 100644 --- a/compiler/ghci/RtClosureInspect.hs +++ b/compiler/ghci/RtClosureInspect.hs @@ -59,12 +59,7 @@ import Constants ( wORD_SIZE ) import GHC.Arr ( Array(..) ) import GHC.Exts - -#if __GLASGOW_HASKELL__ >= 611 import GHC.IO ( IO(..) ) -#else -import GHC.IOBase ( IO(..) ) -#endif import Control.Monad import Data.Maybe @@ -571,17 +566,24 @@ liftTcM = id newVar :: Kind -> TR TcType newVar = liftTcM . newFlexiTyVarTy -type RttiInstantiation = [(TyVar, TcTyVar)] - -- Assoicates the debugger-world type variables (which are skolems) - -- to typechecker-world meta type variables (which are mutable, - -- and may be refined) +type RttiInstantiation = [(TcTyVar, TyVar)] + -- Associates the typechecker-world meta type variables + -- (which are mutable and may be refined), to their + -- debugger-world RuntimeUnkSkol counterparts. + -- If the TcTyVar has not been refined by the runtime type + -- elaboration, then we want to turn it back into the + -- original RuntimeUnkSkol -- | Returns the instantiated type scheme ty', and the --- mapping from old to new (instantiated) type variables +-- mapping from new (instantiated) -to- old (skolem) type variables +-- We want this mapping just for old RuntimeUnkSkols, to avoid +-- gratuitously changing their unique on every trip instScheme :: QuantifiedType -> TR (TcType, RttiInstantiation) instScheme (tvs, ty) = liftTcM $ do { (tvs', _, subst) <- tcInstTyVars tvs - ; return (substTy subst ty, tvs `zip` tvs') } + ; let rtti_inst = [(tv',tv) | (tv',tv) <- tvs' `zip` tvs + , isRuntimeUnkSkol tv] + ; return (substTy subst ty, rtti_inst) } applyRevSubst :: RttiInstantiation -> TR () -- Apply the *reverse* substitution in-place to any un-filled-in @@ -589,7 +591,7 @@ applyRevSubst :: RttiInstantiation -> TR () -- unless it has been refined by new information from the heap applyRevSubst pairs = liftTcM (mapM_ do_pair pairs) where - do_pair (rtti_tv, tc_tv) + do_pair (tc_tv, rtti_tv) = do { tc_ty <- zonkTcTyVar tc_tv ; case tcGetTyVar_maybe tc_ty of Just tv | isMetaTyVar tv -> writeMetaTyVar tv (mkTyVarTy rtti_tv) @@ -1131,6 +1133,10 @@ zonkRttiType = zonkType (mkZonkTcTyVar zonk_unbound_meta) zonk_unbound_meta tv = ASSERT( isTcTyVar tv ) do { tv' <- skolemiseUnboundMetaTyVar RuntimeUnkSkol tv + -- This is where RuntimeUnkSkols are born: + -- otherwise-unconstrained unification variables are + -- turned into RuntimeUnkSkols as they leave the + -- typechecker's monad ; return (mkTyVarTy tv') } --------------------------------------------------------------------------------