X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FInteractiveEval.hs;h=6e6580e2487cd727e74099180a3d15c33e9fabca;hb=0c45d82423fcff64b43b95ab4882b26e7de560bf;hp=eb96ca89bc7839a028355e9e997a5f369a777cf7;hpb=241306953f42fa067a9b503ea1f418e75c32c484;p=ghc-hetmet.git diff --git a/compiler/main/InteractiveEval.hs b/compiler/main/InteractiveEval.hs index eb96ca8..6e6580e 100644 --- a/compiler/main/InteractiveEval.hs +++ b/compiler/main/InteractiveEval.hs @@ -211,7 +211,7 @@ runStmt (Session ref) expr step withBreakAction (isStep step) dflags' breakMVar statusMVar $ do let thing_to_run = unsafeCoerce# hval :: IO [HValue] - status <- sandboxIO statusMVar thing_to_run + status <- sandboxIO dflags' statusMVar thing_to_run let ic = hsc_IC hsc_env bindings = (ic_tmp_ids ic, ic_tyvars ic) @@ -315,10 +315,10 @@ foreign import ccall "&rts_breakpoint_io_action" -- thread. ToDo: we might want a way to continue even if the target -- thread doesn't die when it receives the exception... "this thread -- is not responding". -sandboxIO :: MVar Status -> IO [HValue] -> IO Status -sandboxIO statusMVar thing = +-- sandboxIO :: MVar Status -> IO [HValue] -> IO Status +sandboxIO dflags statusMVar thing = withInterruptsSentTo - (forkIO (do res <- Exception.try (rethrow thing) + (forkIO (do res <- Exception.try (rethrow dflags thing) putMVar statusMVar (Complete res))) (takeMVar statusMVar) @@ -330,12 +330,24 @@ sandboxIO statusMVar thing = -- to :continue twice, which looks strange). So if the exception is -- not "Interrupted", we unset the exception flag before throwing. -- -rethrow :: IO a -> IO a -rethrow io = Exception.catch io $ \e -> -- NB. not catchDyn +-- rethrow :: IO a -> IO a +rethrow dflags io = Exception.catch io $ \e -> do -- NB. not catchDyn case e of + -- If -fbreak-on-error, we break unconditionally, + -- but with care of not breaking twice + _ | dopt Opt_BreakOnError dflags && + not(dopt Opt_BreakOnException dflags) + -> poke exceptionFlag 1 + + -- If it is an "Interrupted" exception, we allow + -- a possible break by way of -fbreak-on-exception DynException d | Just Interrupted <- fromDynamic d - -> Exception.throwIO e - _ -> do poke exceptionFlag 0; Exception.throwIO e + -> return () + + -- In any other case, we don't want to break + _ -> poke exceptionFlag 0 + + Exception.throwIO e withInterruptsSentTo :: IO ThreadId -> IO r -> IO r