cancel out some reverses by changing the order of ic_tmp_ids
authorSimon Marlow <simonmar@microsoft.com>
Thu, 3 May 2007 12:52:24 +0000 (12:52 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Thu, 3 May 2007 12:52:24 +0000 (12:52 +0000)
compiler/main/GHC.hs
compiler/main/HscTypes.lhs
compiler/typecheck/TcRnDriver.lhs

index 35e4d9d..97d21fc 100644 (file)
@@ -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)
index f04615a..d385c5f 100644 (file)
@@ -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}
 
index 15cda27..32dd862 100644 (file)
@@ -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 }