, substFiltered <- filter (not.isTyVarTy) . varEnvElts . getTvSubstEnv $ subst
, not . null $ substFiltered
, all (flip notElemTvSubst subst) ty_vars
--- , pprTrace "subst" (ppr subst) True
= True
| otherwise = False
where bindOnlyTy1 tyv | tyv `elem` ty_vars = AvoidMe
-----------------------------
-- | The :breakpoint command
-----------------------------
-bkptOptions :: String -> GHCi ()
+bkptOptions :: String -> GHCi Bool
+bkptOptions "continue" = -- We want to quit if in an inferior session
+ liftM not isTopLevel
+bkptOptions "stop" = do
+ inside_break <- liftM not isTopLevel
+ when inside_break $ throwDyn StopChildSession
+ return False
+
bkptOptions cmd = do
dflags <- getDynFlags
bt <- getBkptTable
- bkptOptions' (words cmd) bt
+ sess <- getSession
+ bkptOptions' sess (words cmd) bt
+ return False
where
- bkptOptions' ["list"] bt = do
+ bkptOptions' _ ["list"] bt = do
let msgs = [ ppr mod <+> colon <+> ppr coords
| (mod,site) <- btList bt
, let coords = getSiteCoords bt mod site]
else vcat num_msgs
io$ putStrLn msg
- bkptOptions' ["stop"] bt = do
- inside_break <- liftM not isTopLevel
- when inside_break $ throwDyn StopChildSession
-
- bkptOptions' ("add":cmds) bt
+ bkptOptions' s ("add":cmds) bt
| [mod_name,line]<- cmds
, [(lineNum,[])] <- reads line
= handleAdd mod_name $ (\mod->addBkptByLine mod lineNum)
"syntax: :breakpoint add Module line [col]"
where
handleAdd mod_name f = do
- sess <- getSession
- dflags <- getDynFlags
- mod <- io$ GHC.findModule sess (GHC.mkModuleName mod_name) Nothing
- ghciHandleDyn (handleBkptEx mod) $
+ mod <- io$ GHC.findModule s (GHC.mkModuleName mod_name) Nothing
+ ghciHandleDyn (handleBkptEx s mod) $
case f mod bt of
(newTable, site) -> do
setBkptTable newTable
io (putStrLn ("Breakpoint set at " ++
show (getSiteCoords newTable mod site)))
- bkptOptions' ("del":cmds) bt
+ bkptOptions' s ("del":cmds) bt
| [i'] <- cmds
, [(i,[])] <- reads i'
, bkpts <- btList bt
"syntax: :breakpoint del (breakpoint # | Module line [col])"
where delMsg = "Breakpoint deleted"
- handleDel mod f = ghciHandleDyn (handleBkptEx mod) $ do
- modifyBkptTable f
- newTable <- getBkptTable
- sess <- getSession
- dflags <- getDynFlags
- io$ putStrLn delMsg
-
- bkptOptions' _ _ = throwDyn $ CmdLineError $
- "syntax: :breakpoint (list|stop|add|del)"
-
- handleBkptEx :: Module -> Debugger.BkptException -> a
- handleBkptEx _ NoBkptFound = error "No suitable breakpoint site found" --TODO Automatically add to the next suitable line
- handleBkptEx _ NotNeeded = error "Nothing to do"
- handleBkptEx m NotHandled = error$ "Module " ++ showSDoc (ppr m) ++ " was not loaded under debugging mode. Enable debugging mode and reload it"
+ handleDel mod f = ghciHandleDyn (handleBkptEx s mod)
+ (modifyBkptTable f >> io (putStrLn delMsg))
+
+ bkptOptions' _ _ _ = throwDyn $ CmdLineError $
+ "syntax: :breakpoint (list|continue|stop|add|del)"
+
+-- Error messages
+-- handleBkptEx :: Session -> Module -> Debugger.BkptException -> a
+ handleBkptEx _ _ NoBkptFound = error "No suitable breakpoint site found"
+ -- ^ TODO Instead of complaining, set a bkpt in the next suitable line
+ handleBkptEx _ _ NotNeeded = error "Nothing to do"
+ handleBkptEx s m NotHandled = io$
+ findModSummary m >>= \mod_summary ->
+ isModuleInterpreted s mod_summary >>= \it ->
+ if it
+ then error$ "Module " ++ showSDoc (ppr m) ++ " was not loaded under debugging mode.\n"
+ ++ "Enable debugging mode with -fdebugging (and reload your module)"
+ else error$ "Module " ++ showSDoc (ppr m) ++ " was loaded in compiled (.o) mode.\n"
+ ++ "You must load a module in interpreted mode and with -fdebugging on to debug it."
+ where findModSummary m = getModuleGraph s >>= \mod_graph ->
+ case [ modsum | modsum <- mod_graph
+ , ms_mod modsum == m ] of
+ [modsum] -> return modsum
-------------------------
-- Breakpoint Tables
, s == site ]
-- addModule is dumb and inefficient, but it does the job
---addModule fn siteCoords _ | trace ("addModule: " ++ moduleString (unsafeCoerce# fn) ++ " - " ++ show siteCoords) False = undefined
addModule a [] bt = bt {sites = Map.insert a [] (sites bt)}
addModule a siteCoords bt
| nrows <- maximum$ [i | (_,(i,j)) <- siteCoords ]
| Just bkpts <- bkptsOf bt a
, inRange (bounds bkpts) site
= bkpts ! site
- | otherwise = throwDyn NotHandled -- This is an error
+ | otherwise = panic "unexpected condition: I don't know that breakpoint site"
-----------------
-- Other stuff
refreshBkptTable :: [ModSummary] -> GHCi ()
refreshBkptTable [] = return ()
refreshBkptTable (ms:mod_sums) = do
- sess <- getSession
+ sess <- getSession
+ isDebugging <- io(isDebuggingM sess)
when isDebugging $ do
old_table <- getBkptTable
new_table <- addModuleGHC sess old_table (GHC.ms_mod ms)
text " breakpoints")
return$ addModule mod sites bt
#if defined(GHCI) && defined(DEBUGGER)
- isDebugging = Opt_Debugging `elem` flags (GHC.ms_hspp_opts ms)
+ isDebuggingM sess = isModuleInterpreted sess ms >>= \isInterpreted ->
+ return (Opt_Debugging `elem` dflags && target == HscInterpreted && isInterpreted)
+ dflags = flags (GHC.ms_hspp_opts ms)
+ target = hscTarget (GHC.ms_hspp_opts ms)
#else
- isDebugging = False
+ isDebuggingM _ = return False
#endif