summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/main/Packages.hs53
-rw-r--r--compiler/utils/UniqDFM.hs7
2 files changed, 33 insertions, 27 deletions
diff --git a/compiler/main/Packages.hs b/compiler/main/Packages.hs
index 2655c451d8..4710de1a20 100644
--- a/compiler/main/Packages.hs
+++ b/compiler/main/Packages.hs
@@ -57,6 +57,7 @@ import PackageConfig
import DynFlags
import Name ( Name, nameModule_maybe )
import UniqFM
+import UniqDFM
import Module
import Util
import Panic
@@ -230,7 +231,7 @@ originEmpty (ModOrigin Nothing [] [] False) = True
originEmpty _ = False
-- | 'UniqFM' map from 'UnitId'
-type UnitIdMap = UniqFM
+type UnitIdMap = UniqDFM
-- | 'UniqFM' map from 'UnitId' to 'PackageConfig'
type PackageConfigMap = UnitIdMap PackageConfig
@@ -276,7 +277,7 @@ data PackageState = PackageState {
emptyPackageState :: PackageState
emptyPackageState = PackageState {
- pkgIdMap = emptyUFM,
+ pkgIdMap = emptyPackageConfigMap,
preloadPackages = [],
explicitPackages = [],
moduleToPkgConfAll = Map.empty,
@@ -287,14 +288,14 @@ type InstalledPackageIndex = Map UnitId PackageConfig
-- | Empty package configuration map
emptyPackageConfigMap :: PackageConfigMap
-emptyPackageConfigMap = emptyUFM
+emptyPackageConfigMap = emptyUDFM
-- | Find the package we know about with the given key (e.g. @foo_HASH@), if any
lookupPackage :: DynFlags -> UnitId -> Maybe PackageConfig
lookupPackage dflags = lookupPackage' (pkgIdMap (pkgState dflags))
lookupPackage' :: PackageConfigMap -> UnitId -> Maybe PackageConfig
-lookupPackage' = lookupUFM
+lookupPackage' = lookupUDFM
-- | Search for packages with a given package ID (e.g. \"foo-0.1\")
searchPackageId :: DynFlags -> SourcePackageId -> [PackageConfig]
@@ -306,7 +307,7 @@ extendPackageConfigMap
:: PackageConfigMap -> [PackageConfig] -> PackageConfigMap
extendPackageConfigMap pkg_map new_pkgs
= foldl add pkg_map new_pkgs
- where add pkg_map p = addToUFM pkg_map (packageConfigId p) p
+ where add pkg_map p = addToUDFM pkg_map (packageConfigId p) p
-- | Looks up the package with the given id in the package state, panicing if it is
-- not found
@@ -319,7 +320,7 @@ getPackageDetails dflags pid =
-- does not imply that the exposed-modules of the package are available
-- (they may have been thinned or renamed).
listPackageConfigMap :: DynFlags -> [PackageConfig]
-listPackageConfigMap dflags = eltsUFM (pkgIdMap (pkgState dflags))
+listPackageConfigMap dflags = eltsUDFM (pkgIdMap (pkgState dflags))
-- ----------------------------------------------------------------------------
-- Loading the package db files and building up the package state
@@ -549,7 +550,7 @@ applyPackageFlag dflags unusable no_hide_others pkgs vm flag =
Right (p:_,_) -> return vm'
where
n = fsPackageName p
- vm' = addToUFM_C edit vm_cleared (packageConfigId p) (b, rns, n)
+ vm' = addToUDFM_C edit vm_cleared (packageConfigId p) (b, rns, n)
edit (b, rns, n) (b', rns', _) = (b || b', rns ++ rns', n)
-- In the old days, if you said `ghc -package p-0.1 -package p-0.2`
-- (or if p-0.1 was registered in the pkgdb as exposed: True),
@@ -572,7 +573,7 @@ applyPackageFlag dflags unusable no_hide_others pkgs vm flag =
-- -hide-all-packages/-hide-all-plugin-packages depending on what
-- flag is in question.
vm_cleared | no_hide_others = vm
- | otherwise = filterUFM_Directly
+ | otherwise = filterUDFM_Directly
(\k (_,_,n') -> k == getUnique (packageConfigId p)
|| n /= n') vm
_ -> panic "applyPackageFlag"
@@ -581,7 +582,7 @@ applyPackageFlag dflags unusable no_hide_others pkgs vm flag =
case selectPackages (matchingStr str) pkgs unusable of
Left ps -> packageFlagErr dflags flag ps
Right (ps,_) -> return vm'
- where vm' = delListFromUFM vm (map packageConfigId ps)
+ where vm' = delListFromUDFM vm (map packageConfigId ps)
selectPackages :: (PackageConfig -> Bool) -> [PackageConfig]
-> UnusablePackages
@@ -710,7 +711,7 @@ findWiredInPackages dflags pkgs vis_map = do
let all_ps = [ p | p <- pkgs, p `matches` wired_pkg ]
all_exposed_ps =
[ p | p <- all_ps
- , elemUFM (packageConfigId p) vis_map ] in
+ , elemUDFM (packageConfigId p) vis_map ] in
case all_exposed_ps of
[] -> case all_ps of
[] -> notfound
@@ -784,9 +785,9 @@ findWiredInPackages dflags pkgs vis_map = do
updateVisibilityMap :: WiredPackagesMap -> VisibilityMap -> VisibilityMap
updateVisibilityMap wiredInMap vis_map = foldl' f vis_map (Map.toList wiredInMap)
- where f vm (from, to) = case lookupUFM vis_map from of
+ where f vm (from, to) = case lookupUDFM vis_map from of
Nothing -> vm
- Just r -> addToUFM vm to r
+ Just r -> addToUDFM vm to r
-- ----------------------------------------------------------------------------
@@ -1014,16 +1015,16 @@ mkPackageState dflags0 dbs preload0 = do
case comparing packageVersion pkg pkg' of
GT -> pkg
_ -> pkg'
- calcInitial m pkg = addToUFM_C preferLater m (fsPackageName pkg) pkg
+ calcInitial m pkg = addToUDFM_C preferLater m (fsPackageName pkg) pkg
initial = if gopt Opt_HideAllPackages dflags
- then emptyUFM
- else foldl' calcInitial emptyUFM pkgs1
- vis_map1 = foldUFM (\p vm ->
+ then emptyUDFM
+ else foldl' calcInitial emptyUDFM pkgs1
+ vis_map1 = foldUDFM (\p vm ->
if exposed p
- then addToUFM vm (packageConfigId p)
- (True, [], fsPackageName p)
+ then addToUDFM vm (packageConfigId p)
+ (True, [], fsPackageName p)
else vm)
- emptyUFM initial
+ emptyUDFM initial
--
-- Compute a visibility map according to the command-line flags (-package,
@@ -1049,9 +1050,9 @@ mkPackageState dflags0 dbs preload0 = do
case pluginPackageFlags dflags of
-- common case; try to share the old vis_map
[] | not hide_plugin_pkgs -> return vis_map
- | otherwise -> return emptyUFM
+ | otherwise -> return emptyUDFM
_ -> do let plugin_vis_map1
- | hide_plugin_pkgs = emptyUFM
+ | hide_plugin_pkgs = emptyUDFM
-- Use the vis_map PRIOR to wired in,
-- because otherwise applyPackageFlag
-- won't work.
@@ -1095,7 +1096,7 @@ mkPackageState dflags0 dbs preload0 = do
-- add base & rts to the preload packages
basicLinkedPackages
| gopt Opt_AutoLinkPackages dflags
- = filter (flip elemUFM pkg_db)
+ = filter (flip elemUDFM pkg_db)
[baseUnitId, rtsUnitId]
| otherwise = []
-- but in any case remove the current package from the set of
@@ -1111,8 +1112,8 @@ mkPackageState dflags0 dbs preload0 = do
-- Force pstate to avoid leaking the dflags0 passed to mkPackageState
let !pstate = PackageState{
preloadPackages = dep_preload,
- explicitPackages = foldUFM (\pkg xs ->
- if elemUFM (packageConfigId pkg) vis_map
+ explicitPackages = foldUDFM (\pkg xs ->
+ if elemUDFM (packageConfigId pkg) vis_map
then packageConfigId pkg : xs
else xs) [] pkg_db,
pkgIdMap = pkg_db,
@@ -1131,7 +1132,7 @@ mkModuleToPkgConfAll
-> VisibilityMap
-> ModuleToPkgConfAll
mkModuleToPkgConfAll dflags pkg_db vis_map =
- foldl' extend_modmap emptyMap (eltsUFM pkg_db)
+ foldl' extend_modmap emptyMap (eltsUDFM pkg_db)
where
emptyMap = Map.empty
sing pk m _ = Map.singleton (mkModule pk m)
@@ -1141,7 +1142,7 @@ mkModuleToPkgConfAll dflags pkg_db vis_map =
extend_modmap modmap pkg = addListTo modmap theBindings
where
theBindings :: [(ModuleName, Map Module ModuleOrigin)]
- theBindings | Just (b,rns,_) <- lookupUFM vis_map (packageConfigId pkg)
+ theBindings | Just (b,rns,_) <- lookupUDFM vis_map (packageConfigId pkg)
= newBindings b rns
| otherwise = newBindings False []
diff --git a/compiler/utils/UniqDFM.hs b/compiler/utils/UniqDFM.hs
index 6e6292ec3c..8ed1451eea 100644
--- a/compiler/utils/UniqDFM.hs
+++ b/compiler/utils/UniqDFM.hs
@@ -40,7 +40,7 @@ module UniqDFM (
elemUDFM,
foldUDFM,
eltsUDFM,
- filterUDFM,
+ filterUDFM, filterUDFM_Directly,
isNullUDFM,
sizeUDFM,
intersectUDFM, udfmIntersectUFM,
@@ -265,6 +265,11 @@ eltsUDFM (UDFM m _i) =
filterUDFM :: (elt -> Bool) -> UniqDFM elt -> UniqDFM elt
filterUDFM p (UDFM m i) = UDFM (M.filter (\(TaggedVal v _) -> p v) m) i
+filterUDFM_Directly :: (Unique -> elt -> Bool) -> UniqDFM elt -> UniqDFM elt
+filterUDFM_Directly p (UDFM m i) = UDFM (M.filterWithKey p' m) i
+ where
+ p' k (TaggedVal v _) = p (getUnique k) v
+
-- | Converts `UniqDFM` to a list, with elements in deterministic order.
-- It's O(n log n) while the corresponding function on `UniqFM` is O(n).
udfmToList :: UniqDFM elt -> [(Unique, elt)]