summaryrefslogtreecommitdiff
path: root/compiler/ghci
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-08-20 11:09:20 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-08-20 11:09:20 +0000
commit72547264724117d689a7fa400104185557fb2a0c (patch)
treec57b694c7ce7b0997df2595de5695230c7f9869e /compiler/ghci
parent21c5c9c09a8d36b4ae8a83b17b543c332bc9cb0c (diff)
downloadhaskell-72547264724117d689a7fa400104185557fb2a0c.tar.gz
Add unique package identifiers (InstalledPackageId) in the package DB
See commentary at http://hackage.haskell.org/trac/ghc/wiki/Commentary/Packages
Diffstat (limited to 'compiler/ghci')
-rw-r--r--compiler/ghci/Linker.lhs21
1 files changed, 12 insertions, 9 deletions
diff --git a/compiler/ghci/Linker.lhs b/compiler/ghci/Linker.lhs
index 419cb4f968..4c85ac6940 100644
--- a/compiler/ghci/Linker.lhs
+++ b/compiler/ghci/Linker.lhs
@@ -51,6 +51,7 @@ import ErrUtils
import SrcLoc
import qualified Maybes
import UniqSet
+import FiniteMap
import Constants
import FastString
import Config ( cProjectVersion )
@@ -973,23 +974,25 @@ linkPackages dflags new_pkgs = do
linkPackages' :: DynFlags -> [PackageId] -> PersistentLinkerState
-> IO PersistentLinkerState
linkPackages' dflags new_pks pls = do
- let pkg_map = pkgIdMap (pkgState dflags)
-
- pkgs' <- link pkg_map (pkgs_loaded pls) new_pks
-
+ pkgs' <- link (pkgs_loaded pls) new_pks
return $! pls { pkgs_loaded = pkgs' }
where
- link :: PackageConfigMap -> [PackageId] -> [PackageId] -> IO [PackageId]
- link pkg_map pkgs new_pkgs =
- foldM (link_one pkg_map) pkgs new_pkgs
+ pkg_map = pkgIdMap (pkgState dflags)
+ ipid_map = installedPackageIdMap (pkgState dflags)
+
+ link :: [PackageId] -> [PackageId] -> IO [PackageId]
+ link pkgs new_pkgs =
+ foldM link_one pkgs new_pkgs
- link_one pkg_map pkgs new_pkg
+ link_one pkgs new_pkg
| new_pkg `elem` pkgs -- Already linked
= return pkgs
| Just pkg_cfg <- lookupPackage pkg_map new_pkg
= do { -- Link dependents first
- pkgs' <- link pkg_map pkgs (map mkPackageId (depends pkg_cfg))
+ pkgs' <- link pkgs [ Maybes.expectJust "link_one" $
+ lookupFM ipid_map ipid
+ | ipid <- depends pkg_cfg ]
-- Now link the package itself
; linkPackage dflags pkg_cfg
; return (new_pkg : pkgs') }