summaryrefslogtreecommitdiff
path: root/compiler/ghci/RtClosureInspect.hs
diff options
context:
space:
mode:
authorsimonpj@microsoft.com <unknown>2010-10-21 10:06:40 +0000
committersimonpj@microsoft.com <unknown>2010-10-21 10:06:40 +0000
commit0dc2b9de4dd4681aa11dfa5419c931a51b274fa6 (patch)
treedc9e2334f1ec768e75eecfa4be37a51b4ad767b6 /compiler/ghci/RtClosureInspect.hs
parent97a4aaa04e2b42ecf5f582779286fa184c5e61ad (diff)
downloadhaskell-0dc2b9de4dd4681aa11dfa5419c931a51b274fa6.tar.gz
Tidy up RuntimeUnkSkols a bit more
Diffstat (limited to 'compiler/ghci/RtClosureInspect.hs')
-rw-r--r--compiler/ghci/RtClosureInspect.hs25
1 files changed, 18 insertions, 7 deletions
diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs
index b281695985..5d74dc92c2 100644
--- a/compiler/ghci/RtClosureInspect.hs
+++ b/compiler/ghci/RtClosureInspect.hs
@@ -571,17 +571,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 +596,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 +1138,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') }
--------------------------------------------------------------------------------