summaryrefslogtreecommitdiff
path: root/compiler/utils/FastStringEnv.hs
diff options
context:
space:
mode:
authorBartosz Nitka <niteria@gmail.com>2016-06-03 09:11:10 -0700
committerBartosz Nitka <niteria@gmail.com>2016-06-03 09:11:15 -0700
commit9cc6fac5c096eb4120173495faf2c948f7a28487 (patch)
treedbc1d85be007ce946df89f39b462801ca59a7303 /compiler/utils/FastStringEnv.hs
parent1d1987e088052eefd25dbc693846222499899749 (diff)
downloadhaskell-9cc6fac5c096eb4120173495faf2c948f7a28487.tar.gz
Make FieldLabelEnv a deterministic set
This lets us kill fsEnvElts function which is nondeterministic. We also get better guarantees than just comments. We don't do lookups, but I believe a set is needed for deduplication. Test Plan: ./validate Reviewers: bgamari, mpickering, austin, simonmar Reviewed By: simonmar Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D2297 GHC Trac Issues: #4012
Diffstat (limited to 'compiler/utils/FastStringEnv.hs')
-rw-r--r--compiler/utils/FastStringEnv.hs31
1 files changed, 28 insertions, 3 deletions
diff --git a/compiler/utils/FastStringEnv.hs b/compiler/utils/FastStringEnv.hs
index fea627e6ca..a3336aeebf 100644
--- a/compiler/utils/FastStringEnv.hs
+++ b/compiler/utils/FastStringEnv.hs
@@ -12,25 +12,36 @@ module FastStringEnv (
-- ** Manipulating these environments
mkFsEnv,
- emptyFsEnv, unitFsEnv, fsEnvElts,
+ emptyFsEnv, unitFsEnv,
extendFsEnv_C, extendFsEnv_Acc, extendFsEnv,
extendFsEnvList, extendFsEnvList_C,
filterFsEnv,
plusFsEnv, plusFsEnv_C, alterFsEnv,
lookupFsEnv, lookupFsEnv_NF, delFromFsEnv, delListFromFsEnv,
elemFsEnv, mapFsEnv,
+
+ -- * Deterministic FastString environments (maps)
+ DFastStringEnv,
+
+ -- ** Manipulating these environments
+ mkDFsEnv, emptyDFsEnv, dFsEnvElts,
) where
import UniqFM
+import UniqDFM
import Maybes
import FastString
+-- | A non-deterministic set of FastStrings.
+-- See Note [Deterministic UniqFM] in UniqDFM for explanation why it's not
+-- deterministic and why it matters. Use DFastStringEnv if the set eventually
+-- gets converted into a list or folded over in a way where the order
+-- changes the generated code.
type FastStringEnv a = UniqFM a -- Domain is FastString
emptyFsEnv :: FastStringEnv a
mkFsEnv :: [(FastString,a)] -> FastStringEnv a
-fsEnvElts :: FastStringEnv a -> [a]
alterFsEnv :: (Maybe a-> Maybe a) -> FastStringEnv a -> FastString -> FastStringEnv a
extendFsEnv_C :: (a->a->a) -> FastStringEnv a -> FastString -> a -> FastStringEnv a
extendFsEnv_Acc :: (a->b->b) -> (a->b) -> FastStringEnv b -> FastString -> a -> FastStringEnv b
@@ -48,7 +59,6 @@ lookupFsEnv_NF :: FastStringEnv a -> FastString -> a
filterFsEnv :: (elt -> Bool) -> FastStringEnv elt -> FastStringEnv elt
mapFsEnv :: (elt1 -> elt2) -> FastStringEnv elt1 -> FastStringEnv elt2
-fsEnvElts x = eltsUFM x
emptyFsEnv = emptyUFM
unitFsEnv x y = unitUFM x y
extendFsEnv x y z = addToUFM x y z
@@ -68,3 +78,18 @@ delListFromFsEnv x y = delListFromUFM x y
filterFsEnv x y = filterUFM x y
lookupFsEnv_NF env n = expectJust "lookupFsEnv_NF" (lookupFsEnv env n)
+
+-- Deterministic FastStringEnv
+-- See Note [Deterministic UniqFM] in UniqDFM for explanation why we need
+-- DFastStringEnv.
+
+type DFastStringEnv a = UniqDFM a -- Domain is FastString
+
+emptyDFsEnv :: DFastStringEnv a
+emptyDFsEnv = emptyUDFM
+
+dFsEnvElts :: DFastStringEnv a -> [a]
+dFsEnvElts = eltsUDFM
+
+mkDFsEnv :: [(FastString,a)] -> DFastStringEnv a
+mkDFsEnv l = listToUDFM l