From 8d180b0dd5b3796c96b162464b93ab1cacc3b789 Mon Sep 17 00:00:00 2001 From: simonmar Date: Tue, 3 Jan 2006 16:15:37 +0000 Subject: [PATCH] [project @ 2006-01-03 16:15:37 by simonmar] setContextAfterLoad: try to load a target if possible, otherwise load the topmost module in the graph. Previously we were loading the first module in the list, which happened to be right a lot of the time, but not always. Fixes ticket #642 --- ghc/compiler/ghci/InteractiveUI.hs | 48 ++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/ghc/compiler/ghci/InteractiveUI.hs b/ghc/compiler/ghci/InteractiveUI.hs index 3469421..0bf37dc 100644 --- a/ghc/compiler/ghci/InteractiveUI.hs +++ b/ghc/compiler/ghci/InteractiveUI.hs @@ -15,7 +15,8 @@ module InteractiveUI ( -- The GHC interface import qualified GHC -import GHC ( Session, verbosity, dopt, DynFlag(..), +import GHC ( Session, verbosity, dopt, DynFlag(..), Target(..), + TargetId(..), mkModule, pprModule, Type, Module, SuccessFlag(..), TyThing(..), Name, LoadHowMuch(..), Phase, GhcException(..), showGhcException, @@ -30,6 +31,7 @@ import OccName( pprOccName ) import SrcLoc( isGoodSrcLoc, srcLocFile, srcLocLine, srcLocCol ) -- Other random utilities +import Digraph ( flattenSCCs ) import BasicTypes ( failed, successIf ) import Panic ( panic, installSignalHandlers ) import Config @@ -592,7 +594,7 @@ changeDirectory dir = do io $ putStr "Warning: changing directory causes all loaded modules to be unloaded,\nbecause the search path has changed.\n" io (GHC.setTargets session []) io (GHC.load session LoadAllTargets) - setContextAfterLoad [] + setContextAfterLoad session [] io (GHC.workingDirectoryChanged session) dir <- expandPath dir io (setCurrentDirectory dir) @@ -703,19 +705,39 @@ reloadModule m = do afterLoad ok session = do io (revertCAFs) -- always revert CAFs on load. graph <- io (GHC.getModuleGraph session) - let mods = map GHC.ms_mod graph - mods' <- filterM (io . GHC.isLoaded session) mods - setContextAfterLoad mods' - modulesLoadedMsg ok mods' + graph' <- filterM (io . GHC.isLoaded session . GHC.ms_mod) graph + setContextAfterLoad session graph' + modulesLoadedMsg ok (map GHC.ms_mod graph') -setContextAfterLoad [] = do - session <- getSession +setContextAfterLoad session [] = do io (GHC.setContext session [] [prelude_mod]) -setContextAfterLoad (m:_) = do - session <- getSession - b <- io (GHC.moduleIsInterpreted session m) - if b then io (GHC.setContext session [m] []) - else io (GHC.setContext session [] [prelude_mod,m]) +setContextAfterLoad session ms = do + -- load a target if one is available, otherwise load the topmost module. + targets <- io (GHC.getTargets session) + case [ m | Just m <- map (findTarget ms) targets ] of + [] -> + let graph' = flattenSCCs (GHC.topSortModuleGraph True ms Nothing) in + load_this (last graph') + (m:_) -> + load_this m + where + findTarget ms t + = case filter (`matches` t) ms of + [] -> Nothing + (m:_) -> Just m + + summary `matches` Target (TargetModule m) _ + = GHC.ms_mod summary == m + summary `matches` Target (TargetFile f _) _ + | Just f' <- GHC.ml_hs_file (GHC.ms_location summary) = f == f' + summary `matches` target + = False + + load_this summary | m <- GHC.ms_mod summary = do + b <- io (GHC.moduleIsInterpreted session m) + if b then io (GHC.setContext session [m] []) + else io (GHC.setContext session [] [prelude_mod,m]) + modulesLoadedMsg :: SuccessFlag -> [Module] -> GHCi () modulesLoadedMsg ok mods = do -- 1.7.10.4