diff options
author | Simon Marlow <marlowsd@gmail.com> | 2008-08-27 10:24:14 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2008-08-27 10:24:14 +0000 |
commit | 3d73e45b0909b9669d4679cbda29fa2b17b98d2e (patch) | |
tree | 150276c4716f579ea87d7319d0bcf1a073867453 /compiler/ghci | |
parent | 50c50170891e91e1961ef67e2677e61c4d8f76e2 (diff) | |
download | haskell-3d73e45b0909b9669d4679cbda29fa2b17b98d2e.tar.gz |
re-fix of #1205, fix #2542
New form of :load in GHCi:
> :load *A
forces A to be loaded as byte-code. See the manual for details. The
previous behaviour for specifying filenames vs. module names on the
command line and in :load has been restored.
The Target datatype has a new Bool field, which is True if the target
is allowed to be loaded from compiled code, or False otherwise, so
this functionality is available via the GHC API. guessTarget
understands the *-prefix form for specifying targets.
Diffstat (limited to 'compiler/ghci')
-rw-r--r-- | compiler/ghci/InteractiveUI.hs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/compiler/ghci/InteractiveUI.hs b/compiler/ghci/InteractiveUI.hs index 48033ae709..f5debfe945 100644 --- a/compiler/ghci/InteractiveUI.hs +++ b/compiler/ghci/InteractiveUI.hs @@ -199,7 +199,7 @@ helpText = " <statement> evaluate/run <statement>\n" ++ " : repeat last command\n" ++ " :{\\n ..lines.. \\n:}\\n multiline command\n" ++ - " :add <filename> ... add module(s) to the current target set\n" ++ + " :add [*]<module> ... add module(s) to the current target set\n" ++ " :browse[!] [[*]<mod>] display the names defined by module <mod>\n" ++ " (!: more details; *: all top-level names)\n" ++ " :cd <dir> change directory to <dir>\n" ++ @@ -212,7 +212,7 @@ helpText = " :help, :? display this list of commands\n" ++ " :info [<name> ...] display information about the given names\n" ++ " :kind <type> show the kind of <type>\n" ++ - " :load <filename> ... load module(s) and their dependents\n" ++ + " :load [*]<module> ... load module(s) and their dependents\n" ++ " :main [<arguments> ...] run the main function with the given arguments\n" ++ " :module [+/-] [*]<mod> ... set the context for expression evaluation\n" ++ " :quit exit GHCi\n" ++ @@ -916,9 +916,11 @@ addModule files = do files <- mapM expandPath files targets <- mapM (\m -> io (GHC.guessTarget m Nothing)) files session <- getSession - io (mapM_ (GHC.addTarget session) targets) + -- remove old targets with the same id; e.g. for :add *M + io $ mapM_ (GHC.removeTarget session) [ tid | Target tid _ _ <- targets ] + io $ mapM_ (GHC.addTarget session) targets prev_context <- io $ GHC.getContext session - ok <- io (GHC.load session LoadAllTargets) + ok <- io $ GHC.load session LoadAllTargets afterLoad ok session False prev_context changeDirectory :: String -> GHCi () @@ -981,7 +983,7 @@ chooseEditFile = Just file -> return file Nothing -> ghcError (CmdLineError "No files to edit.") - where fromTarget (GHC.Target (GHC.TargetFile f _) _) = Just f + where fromTarget (GHC.Target (GHC.TargetFile f _) _ _) = Just f fromTarget _ = Nothing -- when would we get a module target? defineMacro :: Bool{-overwrite-} -> String -> GHCi () @@ -1141,9 +1143,9 @@ setContextAfterLoad session prev keep_ctxt ms = do [] -> Nothing (m:_) -> Just m - summary `matches` Target (TargetModule m) _ + summary `matches` Target (TargetModule m) _ _ = GHC.ms_mod_name summary == m - summary `matches` Target (TargetFile f _) _ + summary `matches` Target (TargetFile f _) _ _ | Just f' <- GHC.ml_hs_file (GHC.ms_location summary) = f == f' _ `matches` _ = False @@ -1890,9 +1892,12 @@ wantInterpretedModule :: String -> GHCi Module wantInterpretedModule str = do session <- getSession modl <- lookupModule str + dflags <- getDynFlags + when (GHC.modulePackageId modl /= thisPackage dflags) $ + ghcError (CmdLineError ("module '" ++ str ++ "' is from another package;\nthis command requires an interpreted module")) is_interpreted <- io (GHC.moduleIsInterpreted session modl) when (not is_interpreted) $ - ghcError (CmdLineError ("module '" ++ str ++ "' is not interpreted")) + ghcError (CmdLineError ("module '" ++ str ++ "' is not interpreted; try \':add *" ++ str ++ "' first")) return modl wantNameFromInterpretedModule :: (Name -> SDoc -> GHCi ()) -> String |