X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=6ad720f1dbfede2ef6398bf0e723a90de6421c86;hb=2c6f7109e521e906fda9e3ed7c78b85b7bffcea1;hp=89976d3dae179684a01756b688a1933227efa145;hpb=2a373c29480d3e99d30dc3b7d07991c58df6d2de;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 89976d3..6ad720f 100644 --- a/ghc/compiler/utils/Panic.lhs +++ b/ghc/compiler/utils/Panic.lhs @@ -11,17 +11,18 @@ some unnecessary loops in the module dependency graph. \begin{code} module Panic ( - GhcException(..), ghcError, progName, + GhcException(..), showGhcException, ghcError, progName, pgmError, + panic, panic#, assertPanic, trace, - showException, showGhcException, tryMost, - installSignalHandlers, + + Exception.Exception(..), showException, try, tryJust, tryMost, tryUser, + catchJust, ioErrors, throwTo, - catchJust, tryJust, ioErrors, throwTo, + installSignalHandlers, ) where #include "HsVersions.h" -#include "../includes/ghcconfig.h" import Config import FastTypes @@ -53,6 +54,7 @@ import DYNAMIC import qualified EXCEPTION as Exception import TRACE ( trace ) import UNSAFE_IO ( unsafePerformIO ) +import IO ( isUserError ) import System \end{code} @@ -144,7 +146,7 @@ panic, pgmError :: String -> a panic x = Exception.throwDyn (Panic x) pgmError x = Exception.throwDyn (ProgramError x) --- #-versions because panic can't return an unboxed int, and that's +-- #-versions because panic can't return an unboxed int, and that's -- what TAG_ is with GHC at the moment. Ugh. (Simon) -- No, man -- Too Beautiful! (Will) @@ -163,7 +165,7 @@ assertPanic file line = -- files, for example. tryMost :: IO a -> IO (Either Exception.Exception a) -tryMost action = do r <- myTry action; filter r +tryMost action = do r <- try action; filter r where filter (Left e@(Exception.DynException d)) | Just ghc_ex <- fromDynamic d @@ -174,17 +176,32 @@ tryMost action = do r <- myTry action; filter r filter other = return other -#if __GLASGOW_HASKELL__ <= 408 -myTry = Exception.tryAllIO -#else -myTry = Exception.try +-- | tryUser is like try, but catches only UserErrors. +-- These are the ones that are thrown by the TcRn monad +-- to signal an error in the program being compiled +tryUser :: IO a -> IO (Either Exception.Exception a) +tryUser action = tryJust tc_errors action + where +#if __GLASGOW_HASKELL__ > 504 || __GLASGOW_HASKELL__ < 500 + tc_errors e@(Exception.IOException ioe) | isUserError ioe = Just e +#elif __GLASGOW_HASKELL__ == 502 + tc_errors e@(UserError _) = Just e +#else + tc_errors e@(Exception.IOException ioe) | isUserError e = Just e #endif + tc_errors _other = Nothing \end{code} Compatibility stuff: \begin{code} #if __GLASGOW_HASKELL__ <= 408 +try = Exception.tryAllIO +#else +try = Exception.try +#endif + +#if __GLASGOW_HASKELL__ <= 408 catchJust = Exception.catchIO tryJust = Exception.tryIO ioErrors = Exception.justIoErrors