diff options
Diffstat (limited to 'compiler/GHC/Iface/Ext')
-rw-r--r-- | compiler/GHC/Iface/Ext/Ast.hs | 2 | ||||
-rw-r--r-- | compiler/GHC/Iface/Ext/Binary.hs | 5 | ||||
-rw-r--r-- | compiler/GHC/Iface/Ext/Fields.hs | 24 | ||||
-rw-r--r-- | compiler/GHC/Iface/Ext/Types.hs | 2 |
4 files changed, 18 insertions, 15 deletions
diff --git a/compiler/GHC/Iface/Ext/Ast.hs b/compiler/GHC/Iface/Ext/Ast.hs index 24a68e63c4..5af938cbe7 100644 --- a/compiler/GHC/Iface/Ext/Ast.hs +++ b/compiler/GHC/Iface/Ext/Ast.hs @@ -303,7 +303,7 @@ mkHieFileWithSource src_file src ms ts rs = tcs = tcg_tcs ts (asts',arr) = getCompressedAsts tc_binds rs top_ev_binds insts tcs in HieFile - { hie_hs_file = src_file + { hie_hs_file = mkFastString src_file , hie_module = ms_mod ms , hie_types = arr , hie_asts = asts' diff --git a/compiler/GHC/Iface/Ext/Binary.hs b/compiler/GHC/Iface/Ext/Binary.hs index 6474fbeb8e..e537d2ecd8 100644 --- a/compiler/GHC/Iface/Ext/Binary.hs +++ b/compiler/GHC/Iface/Ext/Binary.hs @@ -32,6 +32,7 @@ import GHC.Types.SrcLoc as SrcLoc import GHC.Types.Unique import GHC.Types.Unique.FM +import Data.Bifunctor (first) import qualified Data.Array as A import qualified Data.Array.IO as A import qualified Data.Array.Unsafe as A @@ -344,7 +345,7 @@ putHieName bh (LocalName occName span) = do put_ bh (occName, BinSrcSpan span) putHieName bh (KnownKeyName uniq) = do putByte bh 2 - put_ bh $ unpkUnique uniq + put_ bh $ (first SerialisableChar $ unpkUnique uniq) getHieName :: BinHandle -> IO HieName getHieName bh = do @@ -358,5 +359,5 @@ getHieName bh = do return $ LocalName occ $ unBinSrcSpan span 2 -> do (c,i) <- get bh - return $ KnownKeyName $ mkUnique c i + return $ KnownKeyName $ mkUnique (getSerialisedChar c) i _ -> panic "GHC.Iface.Ext.Binary.getHieName: invalid tag" diff --git a/compiler/GHC/Iface/Ext/Fields.hs b/compiler/GHC/Iface/Ext/Fields.hs index 37322303d8..76cd936bdc 100644 --- a/compiler/GHC/Iface/Ext/Fields.hs +++ b/compiler/GHC/Iface/Ext/Fields.hs @@ -15,23 +15,25 @@ where import GHC.Prelude import GHC.Utils.Binary +import GHC.Data.FastString +import GHC.Types.Unique.Map +import Data.Function (on) +import Data.List (sortBy) import Control.Monad -import Data.Map ( Map ) -import qualified Data.Map as Map import Control.DeepSeq -type FieldName = String +type FieldName = FastString -newtype ExtensibleFields = ExtensibleFields { getExtensibleFields :: (Map FieldName BinData) } +newtype ExtensibleFields = ExtensibleFields { getExtensibleFields :: (UniqMap FastString BinData) } instance Binary ExtensibleFields where put_ bh (ExtensibleFields fs) = do - put_ bh (Map.size fs :: Int) + put_ bh (sizeUniqMap fs :: Int) -- Put the names of each field, and reserve a space -- for a payload pointer after each name: - header_entries <- forM (Map.toList fs) $ \(name, dat) -> do + header_entries <- forM (sortBy (lexicalCompareFS `on` fst) $ nonDetUniqMapToList fs) $ \(name, dat) -> do put_ bh name field_p_p <- tellBin bh put_ bh field_p_p @@ -58,13 +60,13 @@ instance Binary ExtensibleFields where dat <- get bh return (name, dat) - return . ExtensibleFields . Map.fromList $ fields + return . ExtensibleFields . listToUniqMap $ fields instance NFData ExtensibleFields where rnf (ExtensibleFields fs) = rnf fs emptyExtensibleFields :: ExtensibleFields -emptyExtensibleFields = ExtensibleFields Map.empty +emptyExtensibleFields = ExtensibleFields emptyUniqMap -------------------------------------------------------------------------------- -- | Reading @@ -74,7 +76,7 @@ readField name = readFieldWith name get readFieldWith :: FieldName -> (BinHandle -> IO a) -> ExtensibleFields -> IO (Maybe a) readFieldWith name read fields = sequence $ ((read =<<) . dataHandle) <$> - Map.lookup name (getExtensibleFields fields) + lookupUniqMap (getExtensibleFields fields) name -------------------------------------------------------------------------------- -- | Writing @@ -88,7 +90,7 @@ writeFieldWith name write fields = do write bh -- bd <- handleData bh - return $ ExtensibleFields (Map.insert name bd $ getExtensibleFields fields) + return $ ExtensibleFields (addToUniqMap (getExtensibleFields fields) name bd) deleteField :: FieldName -> ExtensibleFields -> ExtensibleFields -deleteField name (ExtensibleFields fs) = ExtensibleFields $ Map.delete name fs +deleteField name (ExtensibleFields fs) = ExtensibleFields $ delFromUniqMap fs name diff --git a/compiler/GHC/Iface/Ext/Types.hs b/compiler/GHC/Iface/Ext/Types.hs index b8a398465c..6fe5a9f7af 100644 --- a/compiler/GHC/Iface/Ext/Types.hs +++ b/compiler/GHC/Iface/Ext/Types.hs @@ -65,7 +65,7 @@ Besides saving compilation cycles, @.hie@ files also offer a more stable interface than the GHC API. -} data HieFile = HieFile - { hie_hs_file :: FilePath + { hie_hs_file :: FastString -- ^ Initial Haskell source file path , hie_module :: Module |