Commit 3b55659d authored by Zejun Wu's avatar Zejun Wu Committed by Austin Seipp
Browse files

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:

GHC Trac Issues: #10501
parent a48167ea
......@@ -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
......@@ -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
:cmd return $ head []
:cmd return ('1':'2':undefined)
*** Exception: Prelude.head: empty list
*** Exception: Prelude.undefined
......@@ -218,3 +218,4 @@ test('T10248', normal, ghci_script, ['T10248.script'])
test('T10110', normal, ghci_script, ['T10110.script'])
test('T10322', normal, ghci_script, ['T10322.script'])
test('T10466', normal, ghci_script, ['T10466.script'])
test('T10501', normal, ghci_script, ['T10501.script'])
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment