builtin_commands = [
("add", tlC$ keepGoingPaths addModule, False, completeFilename),
("browse", keepGoing browseCmd, False, completeModule),
- ("cd", keepGoing changeDirectory, False, completeFilename),
+#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),
-- Hugs users are accustomed to :e, so make sure it doesn't overlap
("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" ++
" :help, :? display this list of commands\n" ++
" :info [<name> ...] display information about the given names\n" ++
" :print [<name> ...] prints a value without forcing its computation\n" ++
- " :sprint [<name> ...] prints a value without forcing its computation(simpler)\n" ++
+ " :sprint [<name> ...] simplified version of :print\n" ++
" :load <filename> ... load module(s) and their dependents\n" ++
" :module [+/-] [*]<mod> ... set the context for expression evaluation\n" ++
" :main [<arguments> ...] run the main function with the given arguments\n" ++
" 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"
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
handler (DynException dyn)
| Just StopChildSession <- fromDynamic dyn
-- propagate to the parent session
- = ASSERTM (liftM not isTopLevel) >> throwDyn StopChildSession
+ = do ASSERTM (liftM not isTopLevel)
+ throwDyn StopChildSession
- | Just (ChildSessionStopped msg) <- fromDynamic dyn
- -- Reload modules and display some message
- = 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..."