diff options
author | Zejun Wu <watashi@watashi.ws> | 2015-06-09 05:42:38 -0500 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2015-06-09 05:43:30 -0500 |
commit | 3b55659d4f54e503f4e550d762bc55a2650ed13d (patch) | |
tree | 6cec07bcb69d0d81da24ca5f4717f408f625a375 /ghc | |
parent | a48167eaaa984fbdc1ad31c2c674058ba3669ac6 (diff) | |
download | haskell-3b55659d4f54e503f4e550d762bc55a2650ed13d.tar.gz |
Always force the exception in enqueued commands
`enqueueCommands` should always force exception in commands. Otherwise
the exception thrown in `:cmd` (e.g. `:cmd return $ head []`) will cause
GHCi to terminate with panic.
Test Plan: `cd testsuite/tests/ghci/ && make`
Reviewed By: austin
Differential Revision: https://phabricator.haskell.org/D967
GHC Trac Issues: #10501
Diffstat (limited to 'ghc')
-rw-r--r-- | ghc/InteractiveUI.hs | 16 | ||||
-rw-r--r-- | ghc/ghc-bin.cabal.in | 1 |
2 files changed, 9 insertions, 8 deletions
diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs index d2940fa88a..6e4880b987 100644 --- a/ghc/InteractiveUI.hs +++ b/ghc/InteractiveUI.hs @@ -64,11 +64,11 @@ import Util -- Haskell Libraries import System.Console.Haskeline as Haskeline -import Control.Monad as Monad - import Control.Applicative hiding (empty) -import Control.Monad.Trans.Class +import Control.DeepSeq (deepseq) +import Control.Monad as Monad import Control.Monad.IO.Class +import Control.Monad.Trans.Class import Data.Array import qualified Data.ByteString.Char8 as BS @@ -881,8 +881,11 @@ checkInputForLayout stmt getStmt = do enqueueCommands :: [String] -> GHCi () enqueueCommands cmds = do - st <- getGHCiState - setGHCiState st{ cmdqueue = cmds ++ cmdqueue st } + -- make sure we force any exceptions in the commands while we're + -- still inside the exception handler, otherwise bad things will + -- happen (see #10501) + cmds `deepseq` return () + modifyGHCiState $ \st -> st{ cmdqueue = cmds ++ cmdqueue st } -- | If we one of these strings prefixes a command, then we treat it as a decl -- rather than a stmt. NB that the appropriate decl prefixes depends on the @@ -1328,9 +1331,6 @@ defineMacro overwrite s = do runMacro :: GHC.HValue{-String -> IO String-} -> String -> GHCi Bool runMacro fun s = do str <- liftIO ((unsafeCoerce# fun :: String -> IO String) s) - -- make sure we force any exceptions in the result, while we are still - -- inside the exception handler for commands: - seqList str (return ()) enqueueCommands (lines str) return False diff --git a/ghc/ghc-bin.cabal.in b/ghc/ghc-bin.cabal.in index b4fdf1022a..30eb7a758d 100644 --- a/ghc/ghc-bin.cabal.in +++ b/ghc/ghc-bin.cabal.in @@ -43,6 +43,7 @@ Executable ghc GHC-Options: -Wall if flag(ghci) + Build-depends: deepseq >= 1.4 && < 1.5 CPP-Options: -DGHCI GHC-Options: -fno-warn-name-shadowing Other-Modules: |