X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=6ad720f1dbfede2ef6398bf0e723a90de6421c86;hb=e3a4d6c36802d9395b40af1d9fb24cbd7ce2f720;hp=7e8b1ebedd4209fd4c0f8146666ce0bfa5950c06;hpb=0dacf4150a679bfff6c7e50d252e335ad9a10d17;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 7e8b1eb..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 @@ -205,8 +222,8 @@ installSignalHandlers = do interrupt = throwTo main_thread interrupt_exn -- #if !defined(mingw32_HOST_OS) - installHandler sigQUIT interrupt Nothing - installHandler sigINT interrupt Nothing + installHandler sigQUIT (Catch interrupt) Nothing + installHandler sigINT (Catch interrupt) Nothing return () #elif __GLASGOW_HASKELL__ >= 603 -- GHC 6.3+ has support for console events on Windows @@ -221,6 +238,6 @@ installSignalHandlers = do installHandler (Catch sig_handler) return () #else - -- nothing + return () -- nothing #endif \end{code}