X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fghci%2FGhciMonad.hs;h=2c5a0a53a44a38a1f17306ece17c2d7f0adb4a45;hp=7720b84d59e336ecfe566e5f94d735101501ad6d;hb=c148796dad1a36849a62ad8f3838b428e65c9310;hpb=b47555c3c6e7d9b6cbe17714fee9fd22d1779928 diff --git a/compiler/ghci/GhciMonad.hs b/compiler/ghci/GhciMonad.hs index 7720b84..2c5a0a5 100644 --- a/compiler/ghci/GhciMonad.hs +++ b/compiler/ghci/GhciMonad.hs @@ -6,13 +6,6 @@ -- ----------------------------------------------------------------------------- -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module GhciMonad where #include "HsVersions.h" @@ -27,6 +20,7 @@ import HscTypes import SrcLoc import Module import ObjLink +import Linker import StaticFlags import Data.Maybe @@ -138,7 +132,7 @@ startGHCi g state = do ref <- newIORef state; unGHCi g ref instance Monad GHCi where (GHCi m) >>= k = GHCi $ \s -> m s >>= \a -> unGHCi (k a) s - return a = GHCi $ \s -> return a + return a = GHCi $ \_ -> return a instance Functor GHCi where fmap f m = m >>= return . f @@ -147,22 +141,36 @@ ghciHandleDyn :: Typeable t => (t -> GHCi a) -> GHCi a -> GHCi a ghciHandleDyn h (GHCi m) = GHCi $ \s -> Exception.catchDyn (m s) (\e -> unGHCi (h e) s) +getGHCiState :: GHCi GHCiState getGHCiState = GHCi $ \r -> readIORef r +setGHCiState :: GHCiState -> GHCi () setGHCiState s = GHCi $ \r -> writeIORef r s -- for convenience... +getSession :: GHCi Session getSession = getGHCiState >>= return . session +getPrelude :: GHCi Module getPrelude = getGHCiState >>= return . prelude GLOBAL_VAR(saved_sess, no_saved_sess, GHC.Session) + +no_saved_sess :: Session no_saved_sess = error "no saved_ses" + +saveSession :: GHCi () saveSession = getSession >>= io . writeIORef saved_sess + +splatSavedSession :: GHCi () splatSavedSession = io (writeIORef saved_sess no_saved_sess) + +restoreSession :: IO Session restoreSession = readIORef saved_sess +getDynFlags :: GHCi DynFlags getDynFlags = do s <- getSession io (GHC.getSessionDynFlags s) +setDynFlags :: DynFlags -> GHCi [PackageId] setDynFlags dflags = do s <- getSession io (GHC.setSessionDynFlags s dflags) @@ -183,7 +191,7 @@ unsetOption opt setGHCiState (st{ options = filter (/= opt) (options st) }) io :: IO a -> GHCi a -io m = GHCi { unGHCi = \s -> m >>= return } +io m = GHCi (\_ -> m) printForUser :: SDoc -> GHCi () printForUser doc = do @@ -288,11 +296,8 @@ GLOBAL_VAR(stderr_ptr, error "no stderr_ptr", Ptr ()) initInterpBuffering :: GHC.Session -> IO () initInterpBuffering session = do -- make sure these are linked - mb_hval1 <- GHC.compileExpr session "System.IO.stdout" - mb_hval2 <- GHC.compileExpr session "System.IO.stderr" - mb_hval3 <- GHC.compileExpr session "System.IO.stdin" - when (any isNothing [mb_hval1,mb_hval2,mb_hval3]) $ - panic "interactiveUI:setBuffering" + dflags <- GHC.getSessionDynFlags session + initDynLinker dflags -- ToDo: we should really look up these names properly, but -- it's a fiddle and not all the bits are exposed via the GHC @@ -302,7 +307,7 @@ initInterpBuffering session mb_stderr_ptr <- ObjLink.lookupSymbol "base_GHCziHandle_stderr_closure" let f ref (Just ptr) = writeIORef ref ptr - f ref Nothing = panic "interactiveUI:setBuffering2" + f _ Nothing = panic "interactiveUI:setBuffering2" zipWithM f [stdin_ptr,stdout_ptr,stderr_ptr] [mb_stdin_ptr,mb_stdout_ptr,mb_stderr_ptr] return ()