diff options
author | Ben Gamari <ben@smart-cactus.org> | 2021-01-13 12:28:33 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2021-01-13 12:43:22 -0500 |
commit | 88fa0bcaa3da78fece7f521229e5ae99fd834832 (patch) | |
tree | 6d302448fb649efabebaf47bc2408ca3f336aaf4 | |
parent | 0dba78410887ffc3d219639081e284ef7b67560a (diff) | |
download | haskell-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.hs | 18 | ||||
-rw-r--r-- | compiler/GHC/Types/Name/Cache.hs | 3 |
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 |