diff options
author | Zejun Wu <watashi@fb.com> | 2018-12-17 01:16:00 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-12-17 01:16:01 -0500 |
commit | f99d898ba384b7d3ace7aae71b0125ba645e09cb (patch) | |
tree | e4330e3ab6c8d73063e25688bd73a45a339696cd /ghc | |
parent | c42eb2e67ae7f1e77c7bf365b7a41f808bc606cc (diff) | |
download | haskell-f99d898ba384b7d3ace7aae71b0125ba645e09cb.tar.gz |
Handle :cd in external interpreter in a more robust way
We used to enqueue another command to change directory in the external
interpreter subprocess, this is not as robust as:
* it can fail with -fno-implict-import-qualified;
* it doesn't work when we `setGHCiMonad` to something other than `IO`.
Neither of them works if `directory` package is hidden though.
Test Plan:
```
$ inplace/bin/ghc-stage2 --interactive # -fexternal-interpreter
GHCi, version 8.7.20181213: http://www.haskell.org/ghc/ :? for help
Prelude> :cd ..
Prelude> System.Directory.getCurrentDirectory
"/data/users/watashi"
Prelude> :!pwd
/data/users/watashi
Prelude>
Leaving GHCi.
```
./validate
Reviewers: simonmar, bgamari, RyanGlScott
Reviewed By: simonmar
Subscribers: rwbarton, carter
Differential Revision: https://phabricator.haskell.org/D5453
Diffstat (limited to 'ghc')
-rw-r--r-- | ghc/GHCi/UI.hs | 7 | ||||
-rw-r--r-- | ghc/GHCi/UI/Monad.hs | 2 |
2 files changed, 7 insertions, 2 deletions
diff --git a/ghc/GHCi/UI.hs b/ghc/GHCi/UI.hs index 13275f8d42..105324f629 100644 --- a/ghc/GHCi/UI.hs +++ b/ghc/GHCi/UI.hs @@ -1430,8 +1430,11 @@ changeDirectory dir = do dflags <- getDynFlags -- With -fexternal-interpreter, we have to change the directory of the subprocess too. -- (this gives consistent behaviour with and without -fexternal-interpreter) - when (gopt Opt_ExternalInterpreter dflags) $ - lift $ enqueueCommands ["System.Directory.setCurrentDirectory " ++ show dir'] + when (gopt Opt_ExternalInterpreter dflags) $ do + hsc_env <- GHC.getSession + fhv <- compileGHCiExpr $ + "System.Directory.setCurrentDirectory " ++ show dir' + liftIO $ evalIO hsc_env fhv trySuccess :: GHC.GhcMonad m => m SuccessFlag -> m SuccessFlag trySuccess act = diff --git a/ghc/GHCi/UI/Monad.hs b/ghc/GHCi/UI/Monad.hs index 45a52712da..a3c21d8c01 100644 --- a/ghc/GHCi/UI/Monad.hs +++ b/ghc/GHCi/UI/Monad.hs @@ -24,6 +24,8 @@ module GHCi.UI.Monad ( printForUserNeverQualify, printForUserModInfo, printForUser, printForUserPartWay, prettyLocations, + + compileGHCiExpr, initInterpBuffering, turnOffBuffering, turnOffBuffering_, flushInterpBuffers, |