| ... |
... |
@@ -20,7 +20,7 @@ module GHC.ByteCode.Binary ( |
|
20
|
20
|
import GHC.Prelude
|
|
21
|
21
|
|
|
22
|
22
|
import GHC.ByteCode.Types
|
|
23
|
|
-import GHC.Data.FastString
|
|
|
23
|
+import qualified GHC.Data.Word64Map.Strict as Word64Map
|
|
24
|
24
|
import GHC.Types.Name
|
|
25
|
25
|
import GHC.Types.Name.Cache
|
|
26
|
26
|
import GHC.Types.Name.Env
|
| ... |
... |
@@ -269,9 +269,8 @@ addBinNameWriter bh' = do |
|
269
|
269
|
| otherwise -> do
|
|
270
|
270
|
putByte bh 1
|
|
271
|
271
|
key <- getBinNameKey env_ref nm
|
|
272
|
|
- -- Delimit the OccName from the deterministic counter to keep the
|
|
273
|
|
- -- encoding injective, avoiding collisions like "foo1" vs "foo#1".
|
|
274
|
|
- put_ bh (occNameFS (occName nm) `appendFS` mkFastString ('#' : show key))
|
|
|
272
|
+ put_ bh $ occNameFS $ occName nm
|
|
|
273
|
+ put_ bh key
|
|
275
|
274
|
where
|
|
276
|
275
|
-- Find a deterministic key for local names. This
|
|
277
|
276
|
getBinNameKey ref name = do
|
| ... |
... |
@@ -282,7 +281,7 @@ addBinNameWriter bh' = do |
|
282
|
281
|
|
|
283
|
282
|
addBinNameReader :: NameCache -> ReadBinHandle -> IO ReadBinHandle
|
|
284
|
283
|
addBinNameReader nc bh' = do
|
|
285
|
|
- env_ref <- newIORef emptyOccEnv
|
|
|
284
|
+ env_ref <- newIORef Word64Map.empty
|
|
286
|
285
|
pure $ flip addReaderToUserData bh' $ BinaryReader $ \bh -> do
|
|
287
|
286
|
t <- getByte bh
|
|
288
|
287
|
case t of
|
| ... |
... |
@@ -291,15 +290,16 @@ addBinNameReader nc bh' = do |
|
291
|
290
|
pure $ BinName nm
|
|
292
|
291
|
1 -> do
|
|
293
|
292
|
occ <- mkVarOccFS <$> get bh
|
|
|
293
|
+ key <- get bh
|
|
294
|
294
|
-- We don't want to get a new unique from the NameCache each time we
|
|
295
|
295
|
-- see a name.
|
|
296
|
296
|
nm' <- unsafeInterleaveIO $ do
|
|
297
|
297
|
u <- takeUniqFromNameCache nc
|
|
298
|
298
|
evaluate $ mkInternalName u occ noSrcSpan
|
|
299
|
299
|
fmap BinName $ atomicModifyIORef' env_ref $ \env ->
|
|
300
|
|
- case lookupOccEnv env occ of
|
|
|
300
|
+ case Word64Map.lookup key env of
|
|
301
|
301
|
Just nm -> (env, nm)
|
|
302
|
|
- _ -> nm' `seq` (extendOccEnv env occ nm', nm')
|
|
|
302
|
+ _ -> nm' `seq` (Word64Map.insert key nm' env, nm')
|
|
303
|
303
|
_ -> panic "Binary BinName: invalid byte"
|
|
304
|
304
|
|
|
305
|
305
|
-- Note [Serializing Names in bytecode]
|