From 88c65644975cb552c8e42d0d998b382d3531cfb3 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 3 May 2007 12:52:24 +0000 Subject: [PATCH] cancel out some reverses by changing the order of ic_tmp_ids --- compiler/main/GHC.hs | 12 +++++++++--- compiler/main/HscTypes.lhs | 8 +++++--- compiler/typecheck/TcRnDriver.lhs | 7 +++---- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/compiler/main/GHC.hs b/compiler/main/GHC.hs index 35e4d9d..97d21fc 100644 --- a/compiler/main/GHC.hs +++ b/compiler/main/GHC.hs @@ -231,6 +231,8 @@ import SysTools ( initSysTools, cleanTempFiles, cleanTempFilesExcept, cleanTempDirs ) import Module import UniqFM +import UniqSet +import Unique import PackageConfig import FiniteMap import Panic @@ -1748,10 +1750,14 @@ getBindings s = withSession s $ \hsc_env -> -- we have to implement the shadowing behaviour of ic_tmp_ids here -- (see InteractiveContext) and the quickest way is to use an OccEnv. let - tmp_ids = reverse (ic_tmp_ids (hsc_IC hsc_env)) - env = mkOccEnv [ (nameOccName (idName id), id) | id <- tmp_ids ] + tmp_ids = ic_tmp_ids (hsc_IC hsc_env) + filtered = foldr f (const []) tmp_ids emptyUniqSet + f id rest set + | uniq `elementOfUniqSet` set = rest set + | otherwise = AnId id : rest (addOneToUniqSet set uniq) + where uniq = getUnique (nameOccName (idName id)) in - return (map AnId (occEnvElts env)) + return filtered getPrintUnqual :: Session -> IO PrintUnqualified getPrintUnqual s = withSession s (return . icPrintUnqual . hsc_IC) diff --git a/compiler/main/HscTypes.lhs b/compiler/main/HscTypes.lhs index f04615a..d385c5f 100644 --- a/compiler/main/HscTypes.lhs +++ b/compiler/main/HscTypes.lhs @@ -623,8 +623,8 @@ data InteractiveContext -- ic_toplev_scope and ic_exports ic_tmp_ids :: [Id], -- Names bound during interaction. - -- Earlier Ids shadow - -- later ones with the same OccName. + -- Later Ids shadow + -- earlier ones with the same OccName. ic_tyvars :: TyVarSet -- skolem type variables free in -- ic_tmp_ids. These arise at @@ -659,7 +659,9 @@ extendInteractiveContext -> TyVarSet -> InteractiveContext extendInteractiveContext ictxt ids tyvars - = ictxt { ic_tmp_ids = ids ++ ic_tmp_ids ictxt, + = ictxt { ic_tmp_ids = ic_tmp_ids ictxt ++ ids, + -- NB. must be this way around, because we want + -- new ids to shadow existing bindings. ic_tyvars = ic_tyvars ictxt `unionVarSet` tyvars } \end{code} diff --git a/compiler/typecheck/TcRnDriver.lhs b/compiler/typecheck/TcRnDriver.lhs index 15cda27..32dd862 100644 --- a/compiler/typecheck/TcRnDriver.lhs +++ b/compiler/typecheck/TcRnDriver.lhs @@ -832,7 +832,7 @@ setInteractiveContext hsc_env icxt thing_inside tcg_inst_env = extendInstEnvList (tcg_inst_env env) dfuns }) $ - tcExtendIdEnv (reverse (ic_tmp_ids icxt)) $ + tcExtendIdEnv (ic_tmp_ids icxt) $ -- tcExtendIdEnv does lots: -- - it extends the local type env (tcl_env) with the given Ids, -- - it extends the local rdr env (tcl_rdr) with the Names from @@ -840,9 +840,8 @@ setInteractiveContext hsc_env icxt thing_inside -- - it adds the free tyvars of the Ids to the tcl_tyvars -- set. -- - -- earlier ids in ic_tmp_ids must shadow later ones with the same - -- OccName, but tcExtendIdEnv has the opposite behaviour, hence the - -- reverse above. + -- later ids in ic_tmp_ids must shadow earlier ones with the same + -- OccName, and tcExtendIdEnv implements this behaviour. do { traceTc (text "setIC" <+> ppr (ic_tmp_ids icxt)) ; thing_inside } -- 1.7.10.4