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),
("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),
keepGoing :: (String -> GHCi ()) -> (String -> GHCi Bool)
keepGoing a str = a str >> return False
--- tlC: Top Level Command
+-- tlC: Top Level Command, not allowed in inferior sessions
tlC :: (String -> GHCi Bool) -> (String -> GHCi Bool)
tlC a str = do
top_level <- isTopLevel
" :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" ++
"\n" ++
" Options for ':breakpoint':\n" ++
" list list the current breakpoints\n" ++
- " add Module line [col] add a new breakpoint\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"
graph <- io (GHC.getModuleGraph session)
graph' <- filterM (io . GHC.isLoaded session . GHC.ms_mod_name) graph
setContextAfterLoad session graph'
- refreshBkptTable graph'
+ do
+ bt <- getBkptTable
+ bt' <- io$ refreshBkptTable session bt graph'
+ setBkptTable bt'
modulesLoadedMsg ok (map GHC.ms_mod_name graph')
setContextAfterLoad session [] = do
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)
getCommonPrefix :: [String] -> String
getCommonPrefix [] = ""
getCommonPrefix (s:ss) = foldl common s ss
- where common s "" = s
+ where common s "" = ""
common "" s = ""
common (c:cs) (d:ds)
| c == d = c : common cs ds
= do ASSERTM (liftM not isTopLevel)
throwDyn StopChildSession
- | Just (ChildSessionStopped msg) <- fromDynamic dyn
- -- Reload modules and display some message
- = do ASSERTM (isTopLevel)
- io(putStrLn msg) >> return False
+ | Just StopParentSession <- fromDynamic dyn
+ = do at_topLevel <- isTopLevel
+ if at_topLevel then return True else throwDyn StopParentSession
+
+ | Just (ChildSessionStopped msg) <- fromDynamic dyn
+ = io(putStrLn msg) >> return False
handler exception = do
flushInterpBuffers
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..."