summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-01-13 12:28:33 -0500
committerBen Gamari <ben@smart-cactus.org>2021-01-13 12:43:22 -0500
commit88fa0bcaa3da78fece7f521229e5ae99fd834832 (patch)
tree6d302448fb649efabebaf47bc2408ca3f336aaf4
parent0dba78410887ffc3d219639081e284ef7b67560a (diff)
downloadhaskell-88fa0bcaa3da78fece7f521229e5ae99fd834832.tar.gz
Avoid thunk leaks via NameCache
Previously, extending the `NameCache` would result in the leakage of both `UniqueSupply`s and `NameCache`s since we would fail to force the Name when extending the `NameCache`. Fixes #19214
-rw-r--r--compiler/GHC/Iface/Env.hs18
-rw-r--r--compiler/GHC/Types/Name/Cache.hs3
2 files changed, 11 insertions, 10 deletions
diff --git a/compiler/GHC/Iface/Env.hs b/compiler/GHC/Iface/Env.hs
index 4b4567289c..8ab3ce3da5 100644
--- a/compiler/GHC/Iface/Env.hs
+++ b/compiler/GHC/Iface/Env.hs
@@ -110,20 +110,20 @@ allocateGlobalBinder name_supply mod occ loc
| otherwise
-> (new_name_supply, name')
where
- uniq = nameUnique name
- name' = mkExternalName uniq mod occ loc
- -- name' is like name, but with the right SrcSpan
- new_cache = extendNameCache (nsNames name_supply) mod occ name'
- new_name_supply = name_supply {nsNames = new_cache}
+ uniq = nameUnique name
+ name' = mkExternalName uniq mod occ loc
+ -- name' is like name, but with the right SrcSpan
+ new_cache = extendNameCache (nsNames name_supply) mod occ name'
+ !new_name_supply = name_supply {nsNames = new_cache}
-- Miss in the cache!
-- Build a completely new Name, and put it in the cache
_ -> (new_name_supply, name)
where
- (uniq, us') = takeUniqFromSupply (nsUniqs name_supply)
- name = mkExternalName uniq mod occ loc
- new_cache = extendNameCache (nsNames name_supply) mod occ name
- new_name_supply = name_supply {nsUniqs = us', nsNames = new_cache}
+ (uniq, us') = takeUniqFromSupply (nsUniqs name_supply)
+ name = mkExternalName uniq mod occ loc
+ new_cache = extendNameCache (nsNames name_supply) mod occ name
+ !new_name_supply = name_supply {nsUniqs = us', nsNames = new_cache}
ifaceExportNames :: [IfaceExport] -> TcRnIf gbl lcl [AvailInfo]
ifaceExportNames exports = return exports
diff --git a/compiler/GHC/Types/Name/Cache.hs b/compiler/GHC/Types/Name/Cache.hs
index b33e5c2ddf..f69eeb9e2f 100644
--- a/compiler/GHC/Types/Name/Cache.hs
+++ b/compiler/GHC/Types/Name/Cache.hs
@@ -97,7 +97,8 @@ extendOrigNameCache nc name
extendNameCache nc (nameModule name) (nameOccName name) name
extendNameCache :: OrigNameCache -> Module -> OccName -> Name -> OrigNameCache
-extendNameCache nc mod occ name
+extendNameCache nc mod occ !name
+ -- Avoid Name thunks in the name cache via explicit bang (#19124)
= extendModuleEnvWith combine nc mod (unitOccEnv occ name)
where
combine _ occ_env = extendOccEnv occ_env occ name