summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2011-11-22 16:23:48 +0000
committerSimon Marlow <marlowsd@gmail.com>2011-11-23 09:13:13 +0000
commit128078e0dcfea03c3306f57a4ae7303ca8ff055b (patch)
treedbe94f1968e2c3b940be047d8b63eda70db6f3e8 /compiler
parent122629e88fb00003f98d1e581c4150800d476131 (diff)
downloadhaskell-128078e0dcfea03c3306f57a4ae7303ca8ff055b.tar.gz
Keep the flag lists as IntSets rather than lists
This improves compile times slightly.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/iface/FlagChecker.hs4
-rw-r--r--compiler/main/DynFlags.hs44
2 files changed, 25 insertions, 23 deletions
diff --git a/compiler/iface/FlagChecker.hs b/compiler/iface/FlagChecker.hs
index f670437ffe..0ea1f3b0fc 100644
--- a/compiler/iface/FlagChecker.hs
+++ b/compiler/iface/FlagChecker.hs
@@ -14,7 +14,7 @@ import Name
import Fingerprint
-- import Outputable
-import Data.List (sort)
+import qualified Data.IntSet as IntSet
import System.FilePath (normalise)
-- | Produce a fingerprint of a @DynFlags@ value. We only base
@@ -31,7 +31,7 @@ fingerprintDynFlags DynFlags{..} nameio =
-- *all* the extension flags and the language
lang = (fmap fromEnum language,
- sort $ map fromEnum $ extensionFlags)
+ IntSet.toList $ extensionFlags)
-- -I, -D and -U flags affect CPP
cpp = (map normalise includePaths, sOpt_P settings)
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 4eb6dc9bcb..fce75b0bff 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -129,6 +129,9 @@ import qualified Data.Set as Set
import System.FilePath
import System.IO ( stderr, hPutChar )
+import Data.IntSet (IntSet)
+import qualified Data.IntSet as IntSet
+
-- -----------------------------------------------------------------------------
-- DynFlags
@@ -304,7 +307,7 @@ data DynFlag
| Opt_DistrustAllPackages
| Opt_PackageTrust
- deriving (Eq, Show)
+ deriving (Eq, Show, Enum)
data WarningFlag =
Opt_WarnDuplicateExports
@@ -341,7 +344,7 @@ data WarningFlag =
| Opt_WarnAlternativeLayoutRuleTransitional
| Opt_WarnUnsafe
| Opt_WarnSafe
- deriving (Eq, Show)
+ deriving (Eq, Show, Enum)
data Language = Haskell98 | Haskell2010
deriving Enum
@@ -552,8 +555,8 @@ data DynFlags = DynFlags {
generatedDumps :: IORef (Set FilePath),
-- hsc dynamic flags
- flags :: [DynFlag],
- warningFlags :: [WarningFlag],
+ flags :: IntSet,
+ warningFlags :: IntSet,
-- Don't change this without updating extensionFlags:
language :: Maybe Language,
-- | Safe Haskell mode
@@ -569,7 +572,7 @@ data DynFlags = DynFlags {
extensions :: [OnOff ExtensionFlag],
-- extensionFlags should always be equal to
-- flattenExtensionFlags language extensions
- extensionFlags :: [ExtensionFlag],
+ extensionFlags :: IntSet,
-- | Message output action: use "ErrUtils" instead of this if you can
log_action :: LogAction,
@@ -894,8 +897,8 @@ defaultDynFlags mySettings =
dirsToClean = panic "defaultDynFlags: No dirsToClean",
generatedDumps = panic "defaultDynFlags: No generatedDumps",
haddockOptions = Nothing,
- flags = defaultFlags,
- warningFlags = standardWarnings,
+ flags = IntSet.fromList (map fromEnum defaultFlags),
+ warningFlags = IntSet.fromList (map fromEnum standardWarnings),
language = Nothing,
safeHaskell = Sf_SafeInfered,
thOnLoc = noSrcSpan,
@@ -938,12 +941,11 @@ data OnOff a = On a
-- OnOffs accumulate in reverse order, so we use foldr in order to
-- process them in the right order
-flattenExtensionFlags :: Maybe Language -> [OnOff ExtensionFlag]
- -> [ExtensionFlag]
+flattenExtensionFlags :: Maybe Language -> [OnOff ExtensionFlag] -> IntSet
flattenExtensionFlags ml = foldr f defaultExtensionFlags
- where f (On f) flags = f : delete f flags
- f (Off f) flags = delete f flags
- defaultExtensionFlags = languageExtensions ml
+ where f (On f) flags = IntSet.insert (fromEnum f) flags
+ f (Off f) flags = IntSet.delete (fromEnum f) flags
+ defaultExtensionFlags = IntSet.fromList (map fromEnum (languageExtensions ml))
languageExtensions :: Maybe Language -> [ExtensionFlag]
@@ -985,31 +987,31 @@ languageExtensions (Just Haskell2010)
-- | Test whether a 'DynFlag' is set
dopt :: DynFlag -> DynFlags -> Bool
-dopt f dflags = f `elem` (flags dflags)
+dopt f dflags = fromEnum f `IntSet.member` flags dflags
-- | Set a 'DynFlag'
dopt_set :: DynFlags -> DynFlag -> DynFlags
-dopt_set dfs f = dfs{ flags = f : flags dfs }
+dopt_set dfs f = dfs{ flags = IntSet.insert (fromEnum f) (flags dfs) }
-- | Unset a 'DynFlag'
dopt_unset :: DynFlags -> DynFlag -> DynFlags
-dopt_unset dfs f = dfs{ flags = filter (/= f) (flags dfs) }
+dopt_unset dfs f = dfs{ flags = IntSet.delete (fromEnum f) (flags dfs) }
-- | Test whether a 'WarningFlag' is set
wopt :: WarningFlag -> DynFlags -> Bool
-wopt f dflags = f `elem` (warningFlags dflags)
+wopt f dflags = fromEnum f `IntSet.member` warningFlags dflags
-- | Set a 'WarningFlag'
wopt_set :: DynFlags -> WarningFlag -> DynFlags
-wopt_set dfs f = dfs{ warningFlags = f : warningFlags dfs }
+wopt_set dfs f = dfs{ warningFlags = IntSet.insert (fromEnum f) (warningFlags dfs) }
-- | Unset a 'WarningFlag'
wopt_unset :: DynFlags -> WarningFlag -> DynFlags
-wopt_unset dfs f = dfs{ warningFlags = filter (/= f) (warningFlags dfs) }
+wopt_unset dfs f = dfs{ warningFlags = IntSet.delete (fromEnum f) (warningFlags dfs) }
-- | Test whether a 'ExtensionFlag' is set
xopt :: ExtensionFlag -> DynFlags -> Bool
-xopt f dflags = f `elem` extensionFlags dflags
+xopt f dflags = fromEnum f `IntSet.member` extensionFlags dflags
-- | Set a 'ExtensionFlag'
xopt_set :: DynFlags -> ExtensionFlag -> DynFlags
@@ -1589,9 +1591,9 @@ dynamic_flags = [
, Flag "Werror" (NoArg (setDynFlag Opt_WarnIsError))
, Flag "Wwarn" (NoArg (unSetDynFlag Opt_WarnIsError))
, Flag "Wall" (NoArg (mapM_ setWarningFlag minusWallOpts))
- , Flag "Wnot" (NoArg (do upd (\dfs -> dfs {warningFlags = []})
+ , Flag "Wnot" (NoArg (do upd (\dfs -> dfs {warningFlags = IntSet.empty})
deprecate "Use -w instead"))
- , Flag "w" (NoArg (upd (\dfs -> dfs {warningFlags = []})))
+ , Flag "w" (NoArg (upd (\dfs -> dfs {warningFlags = IntSet.empty})))
------ Plugin flags ------------------------------------------------
, Flag "fplugin-opt" (hasArg addPluginModuleNameOption)