Skip to content
Snippets Groups Projects
Commit e478f27b authored by batterseapower's avatar batterseapower
Browse files

Follow changes to BinIface Name serialization

parent ebb07175
No related branches found
No related tags found
No related merge requests found
{-# LANGUAGE RankNTypes #-}
{-# OPTIONS_GHC -fno-warn-orphans #-} {-# OPTIONS_GHC -fno-warn-orphans #-}
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- | -- |
...@@ -30,6 +31,7 @@ import Data.Map (Map) ...@@ -30,6 +31,7 @@ import Data.Map (Map)
import GHC hiding (NoLink) import GHC hiding (NoLink)
import Binary import Binary
import BinIface (getSymtabName, getDictFastString)
import Name import Name
import UniqSupply import UniqSupply
import UniqFM import UniqFM
...@@ -42,6 +44,8 @@ import FastMutInt ...@@ -42,6 +44,8 @@ import FastMutInt
import FastString import FastString
import Unique import Unique
import Control.Monad.Fix
data InterfaceFile = InterfaceFile { data InterfaceFile = InterfaceFile {
ifLinkEnv :: LinkEnv, ifLinkEnv :: LinkEnv,
...@@ -170,9 +174,11 @@ freshNameCache = ( create_fresh_nc , \_ -> return () ) ...@@ -170,9 +174,11 @@ freshNameCache = ( create_fresh_nc , \_ -> return () )
-- monad being used. The exact monad is whichever monad the first -- monad being used. The exact monad is whichever monad the first
-- argument, the getter and setter of the name cache, requires. -- argument, the getter and setter of the name cache, requires.
-- --
readInterfaceFile :: MonadIO m => readInterfaceFile :: forall m.
NameCacheAccessor m (MonadFix m, MonadIO m)
-> FilePath -> m (Either String InterfaceFile) => NameCacheAccessor m
-> FilePath
-> m (Either String InterfaceFile)
readInterfaceFile (get_name_cache, set_name_cache) filename = do readInterfaceFile (get_name_cache, set_name_cache) filename = do
bh0 <- liftIO $ readBinMem filename bh0 <- liftIO $ readBinMem filename
...@@ -184,23 +190,35 @@ readInterfaceFile (get_name_cache, set_name_cache) filename = do ...@@ -184,23 +190,35 @@ readInterfaceFile (get_name_cache, set_name_cache) filename = do
"Magic number mismatch: couldn't load interface file: " ++ filename "Magic number mismatch: couldn't load interface file: " ++ filename
| version /= binaryInterfaceVersion -> return . Left $ | version /= binaryInterfaceVersion -> return . Left $
"Interface file is of wrong version: " ++ filename "Interface file is of wrong version: " ++ filename
| otherwise -> do | otherwise -> with_name_cache $ \update_nc -> do
dict <- get_dictionary bh0 dict <- get_dictionary bh0
bh1 <- init_handle_user_data bh0 dict
(bh1, _) <- mfix $ \(~(_, rec_symtab)) -> do
theNC <- get_name_cache bh1 <- init_handle_user_data update_nc bh0 rec_symtab dict
(nc', symtab) <- get_symbol_table bh1 theNC symtab <- update_nc (get_symbol_table bh1)
set_name_cache nc' return (bh1, symtab)
-- set the symbol table
let ud' = getUserData bh1
bh2 <- return $! setUserData bh1 ud'{ud_symtab = symtab}
-- load the actual data -- load the actual data
iface <- liftIO $ get bh2 iface <- liftIO $ get bh1
return (Right iface) return (Right iface)
where where
with_name_cache :: forall a.
((forall n b. MonadIO n
=> (NameCache -> n (NameCache, b))
-> n b)
-> m a)
-> m a
with_name_cache act = do
nc_var <- get_name_cache >>= (liftIO . newIORef)
x <- act $ \f -> do
nc <- liftIO $ readIORef nc_var
(nc', x) <- f nc
liftIO $ writeIORef nc_var nc'
return x
liftIO (readIORef nc_var) >>= set_name_cache
return x
get_dictionary bin_handle = liftIO $ do get_dictionary bin_handle = liftIO $ do
dict_p <- get bin_handle dict_p <- get bin_handle
data_p <- tellBin bin_handle data_p <- tellBin bin_handle
...@@ -209,8 +227,13 @@ readInterfaceFile (get_name_cache, set_name_cache) filename = do ...@@ -209,8 +227,13 @@ readInterfaceFile (get_name_cache, set_name_cache) filename = do
seekBin bin_handle data_p seekBin bin_handle data_p
return dict return dict
init_handle_user_data bin_handle dict = liftIO $ do init_handle_user_data :: (forall n b. MonadIO n
ud <- newReadState dict => (NameCache -> n (NameCache, b))
-> n b)
-> BinHandle -> SymbolTable -> Dictionary
-> m BinHandle
init_handle_user_data update_nc bin_handle symtab dict = do
ud <- liftIO $ newReadState (getSymtabName (NCU (\f -> update_nc (return . f))) dict symtab) (getDictFastString dict)
return (setUserData bin_handle ud) return (setUserData bin_handle ud)
get_symbol_table bh1 theNC = liftIO $ do get_symbol_table bh1 theNC = liftIO $ do
......
...@@ -60,6 +60,8 @@ import DynFlags hiding (flags, verbosity) ...@@ -60,6 +60,8 @@ import DynFlags hiding (flags, verbosity)
import Panic (panic, handleGhcException) import Panic (panic, handleGhcException)
import Module import Module
import Control.Monad.Fix (MonadFix)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- * Exception handling -- * Exception handling
...@@ -251,7 +253,7 @@ render flags ifaces installedIfaces srcMap = do ...@@ -251,7 +253,7 @@ render flags ifaces installedIfaces srcMap = do
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
readInterfaceFiles :: MonadIO m => readInterfaceFiles :: (MonadFix m, MonadIO m) =>
NameCacheAccessor m NameCacheAccessor m
-> [(DocPaths, FilePath)] -> -> [(DocPaths, FilePath)] ->
m [(DocPaths, InterfaceFile)] m [(DocPaths, InterfaceFile)]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment