Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/89175e0e64e9326471066356009ea66de41560b5

>---------------------------------------------------------------

commit 89175e0e64e9326471066356009ea66de41560b5
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Sun Jul 31 22:18:43 2011 +0100

    Improve splitSubst hack to ensure we don't lose CoVar->CoVar and 
TyVar->TyVar renamings

>---------------------------------------------------------------

 .../supercompile/Supercompile/Core/Renaming.hs     |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Core/Renaming.hs 
b/compiler/supercompile/Supercompile/Core/Renaming.hs
index ab6a87a..c71ab33 100644
--- a/compiler/supercompile/Supercompile/Core/Renaming.hs
+++ b/compiler/supercompile/Supercompile/Core/Renaming.hs
@@ -92,14 +92,19 @@ joinSubst iss (id_subst, tv_subst, co_subst) = mkSubst iss 
tv_subst co_subst id_
 --  2) Ensure that we always extend the IdSubstEnv, regardless of whether the 
unique changed.
 --     This is the solution I've adopted, and it is implemented here in 
splitSubst:
 splitSubst :: Subst -> [(Var, Var)] -> (InScopeSet, Renaming)
-splitSubst (Subst iss id_subst tv_subst co_subst) xs_extend
-  = (iss, (id_subst `extendVarEnvList` [(x, varToCoreSyn x') | (x, x') <- 
xs_extend], tv_subst, co_subst))
+splitSubst (Subst iss id_subst tv_subst co_subst) extend
+  = (iss, (id_subst `extendVarEnvList` [(x, varToCoreSyn x') | (x, x') <- 
ids_extend],
+           tv_subst `extendVarEnvList` [(a, mkTyVarTy a')    | (a, a') <- 
tvs_extend],
+           co_subst `extendVarEnvList` [(q, mkCoVarCo q')    | (q, q') <- 
cos_extend]))
+  where (ids_extend, tvs_extend, cos_extend) = splitVarLikeList fst extend
 
+splitVarLikeList :: (a -> Var) -> [a] -> ([a], [a], [a])
+splitVarLikeList f xs = (id_list, tv_list, co_list)
+  where (tv_list, coid_list) = partition (isTyVar . f) xs
+        (co_list, id_list)   = partition (isCoVar . f) coid_list
 
 splitVarList :: [Var] -> ([Id], [TyVar], [CoVar])
-splitVarList xs = (id_list, tv_list, co_list)
-  where (tv_list, coid_list) = partition isTyVar xs
-        (co_list, id_list)   = partition isCoVar coid_list
+splitVarList = splitVarLikeList id
 
 emptyRenaming :: Renaming
 emptyRenaming = (emptyVarEnv, emptyVarEnv, emptyVarEnv)



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to