From f540ac1cab55f5d4a61e5b1e22ef48d92a7b1cfe Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Tue, 23 Jun 2009 14:26:23 +0000 Subject: [PATCH] Fix buffering problem when GHCi is using the new IO library Behind the scenes, the new IO library always does buffering for read Handles regardless of NoBuffering. Normally this isn't visible, but it causes a problem in GHCi where there are two stdin Handles. This should fix those ghci test failures that sprung up in full testsuite runs recently. --- ghc/InteractiveUI.hs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs index 82c9aab..0e9efb6 100644 --- a/ghc/InteractiveUI.hs +++ b/ghc/InteractiveUI.hs @@ -96,6 +96,7 @@ import GHC.Exts ( unsafeCoerce# ) #if __GLASGOW_HASKELL__ >= 611 import GHC.IO.Exception ( IOErrorType(InvalidArgument) ) +import GHC.IO.Handle ( hFlushAll ) #else import GHC.IOBase ( IOErrorType(InvalidArgument) ) #endif @@ -636,7 +637,16 @@ runStmt stmt step | null (filter (not.isSpace) stmt) = return False | ["import", mod] <- words stmt = keepGoing' setContext ('+':mod) | otherwise - = do result <- GhciMonad.runStmt stmt step + = do +#if __GLASGOW_HASKELL__ >= 611 + -- In the new IO library, read handles buffer data even if the Handle + -- is set to NoBuffering. This causes problems for GHCi where there + -- are really two stdin Handles. So we flush any bufferred data in + -- GHCi's stdin Handle here (only relevant if stdin is attached to + -- a file, otherwise the read buffer can't be flushed). + liftIO $ IO.try $ hFlushAll stdin +#endif + result <- GhciMonad.runStmt stmt step afterRunStmt (const True) result --afterRunStmt :: GHC.RunResult -> GHCi Bool -- 1.7.10.4