summaryrefslogtreecommitdiff
path: root/compiler/ghci/InteractiveUI.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/ghci/InteractiveUI.hs')
-rw-r--r--compiler/ghci/InteractiveUI.hs26
1 files changed, 21 insertions, 5 deletions
diff --git a/compiler/ghci/InteractiveUI.hs b/compiler/ghci/InteractiveUI.hs
index c2fb51dbfa..d2ed97662d 100644
--- a/compiler/ghci/InteractiveUI.hs
+++ b/compiler/ghci/InteractiveUI.hs
@@ -114,6 +114,11 @@ builtin_commands :: [Command]
builtin_commands = [
("add", tlC$ keepGoingPaths addModule, False, completeFilename),
("browse", keepGoing browseCmd, False, completeModule),
+#ifdef DEBUGGER
+ -- I think that :c should mean :continue rather than :cd, makes more sense
+ -- (pepe 01.11.07)
+ ("continue", const(bkptOptions "continue"), False, completeNone),
+#endif
("cd", tlC$ keepGoing changeDirectory, False, completeFilename),
("def", keepGoing defineMacro, False, completeIdentifier),
("e", keepGoing editFile, False, completeFilename),
@@ -136,7 +141,7 @@ builtin_commands = [
("print", keepGoing (pprintClosureCommand True False), False, completeIdentifier),
("sprint", keepGoing (pprintClosureCommand False False),False, completeIdentifier),
("force", keepGoing (pprintClosureCommand False True), False, completeIdentifier),
- ("breakpoint",keepGoing bkptOptions, False, completeBkpt),
+ ("breakpoint",bkptOptions, False, completeBkpt),
#endif
("kind", keepGoing kindOfType, False, completeIdentifier),
("unset", keepGoing unsetOptions, True, completeSetOptions),
@@ -169,6 +174,7 @@ helpText =
" :breakpoint <option> commands for the GHCi debugger\n" ++
" :browse [*]<module> display the names defined by <module>\n" ++
" :cd <dir> change directory to <dir>\n" ++
+ " :continue equivalent to ':breakpoint continue'\n" ++
" :def <cmd> <expr> define a command :<cmd>\n" ++
" :edit <file> edit file\n" ++
" :edit edit last module\n" ++
@@ -211,6 +217,7 @@ helpText =
" list list the current breakpoints\n" ++
" add Module line [col] add a new breakpoint\n" ++
" del (breakpoint# | Module line [col]) delete a breakpoint\n" ++
+ " continue continue execution\n" ++
" stop Stop a computation and return to the top level\n" ++
" step [count] Step by step execution (DISABLED)\n"
@@ -843,7 +850,11 @@ kindOfType str
io (putStrLn (str ++ " :: " ++ tystr))
quit :: String -> GHCi Bool
-quit _ = return True
+quit _ = do in_inferior_session <- liftM not isTopLevel
+ if in_inferior_session
+ then throwDyn StopParentSession
+ else return True
+
shellEscape :: String -> GHCi Bool
shellEscape str = io (system str >> return False)
@@ -1387,6 +1398,10 @@ handler (DynException dyn)
= do ASSERTM (liftM not isTopLevel)
throwDyn StopChildSession
+ | Just StopParentSession <- fromDynamic dyn
+ = do at_topLevel <- isTopLevel
+ if at_topLevel then return True else throwDyn StopParentSession
+
| Just (ChildSessionStopped msg) <- fromDynamic dyn
-- Reload modules and display some message
= do ASSERTM (isTopLevel)
@@ -1507,9 +1522,10 @@ doBreakpoint ref_bkptTable s@(Session ref) values _ locMsg b = do
bkptTable= ref_bkptTable,
prelude = prel_mod,
topLevel = False }
- `catchDyn` (
- \StopChildSession -> evaluate$
- throwDyn (ChildSessionStopped "")
+ `catchDyn` (\e -> case e of
+ StopChildSession -> evaluate$
+ throwDyn (ChildSessionStopped "")
+ StopParentSession -> throwDyn StopParentSession
) `finally` do
writeIORef ref hsc_env
putStrLn $ "Returning to normal execution..."