diff options
author | Flaviu Andrei Csernik (archblob) <fcsernik@gmail.com> | 2015-06-01 02:13:36 -0500 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2015-06-01 02:13:36 -0500 |
commit | 4756438962a76d2dcedf63b90ec789cb054f9556 (patch) | |
tree | 684cf8063cb78910c934f7729e59c34521853051 /ghc | |
parent | 94fff17963af2292504d02ead819bc4340878786 (diff) | |
download | haskell-4756438962a76d2dcedf63b90ec789cb054f9556.tar.gz |
Catch canonicalizePath exceptions, fix #10101
Summary:
Introduce by #95 'canonicalizePath' throws and exception when given
an invalid file in a call to 'sameFile'.
There are two cases when this can happen when using ghci:
1) If there is an error at the interactive prompt, "<interactive>"
file is searched for and not found.
2) If there is an error in any loaded file and editing an inexistent/new
file with 'e: foo'.
Both cases are now tested.
Test Plan: validate
Reviewers: austin, #ghc
Reviewed By: austin, #ghc
Subscribers: bgamari, thomie
Differential Revision: https://phabricator.haskell.org/D930
GHC Trac Issues: #10101
Diffstat (limited to 'ghc')
-rw-r--r-- | ghc/InteractiveUI.hs | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs index 0adc0cd521..d3b4368478 100644 --- a/ghc/InteractiveUI.hs +++ b/ghc/InteractiveUI.hs @@ -1245,6 +1245,9 @@ editFile str = when (null cmd) $ throwGhcException (CmdLineError "editor not set, use :set editor") lineOpt <- liftIO $ do + let sameFile p1 p2 = liftA2 (==) (canonicalizePath p1) (canonicalizePath p2) + `catchIO` (\_ -> return False) + curFileErrs <- filterM (\(f, _) -> unpackFS f `sameFile` file) errs return $ case curFileErrs of (_, line):_ -> " +" ++ show line @@ -3222,12 +3225,6 @@ expandPathIO p = other -> return other -sameFile :: FilePath -> FilePath -> IO Bool -sameFile path1 path2 = do - absPath1 <- canonicalizePath path1 - absPath2 <- canonicalizePath path2 - return $ absPath1 == absPath2 - wantInterpretedModule :: GHC.GhcMonad m => String -> m Module wantInterpretedModule str = wantInterpretedModuleName (GHC.mkModuleName str) |