X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=2a5d3a417482f6b5aff0cadafc263ba0c4fd9ea2;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=c4499971ecf97a2d4a61ff8b6808142090a72ac9;hpb=fb1b5b0773c7efd0fba32e580afd91f99b9fcc89;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index c449997..2a5d3a4 100644 --- a/ghc/compiler/utils/Panic.lhs +++ b/ghc/compiler/utils/Panic.lhs @@ -13,20 +13,40 @@ module Panic ( GhcException(..), ghcError, progName, panic, panic#, assertPanic, trace, - showException, showGhcException, throwDyn, tryMost, + showException, showGhcException, tryMost, + installSignalHandlers, -#if __GLASGOW_HASKELL__ <= 408 - catchJust, ioErrors, throwTo, -#endif + catchJust, tryJust, ioErrors, throwTo, ) where #include "HsVersions.h" +#include "../includes/ghcconfig.h" import Config import FastTypes +#ifndef mingw32_HOST_OS +# if __GLASGOW_HASKELL__ > 504 +import System.Posix.Signals +# else +import Posix ( Handler(Catch), installHandler, sigINT, sigQUIT ) +# endif /* GHC > 504 */ + +import CONCURRENT ( myThreadId ) +#endif /* mingw32_HOST_OS */ + +# if __GLASGOW_HASKELL__ < 500 +import EXCEPTION ( raiseInThread ) +# else +import EXCEPTION ( throwTo ) +# endif /* GHC < 500 */ + +#if __GLASGOW_HASKELL__ > 408 +import EXCEPTION ( catchJust, tryJust, ioErrors ) +#endif + import DYNAMIC -import EXCEPTION as Exception +import qualified EXCEPTION as Exception import TRACE ( trace ) import UNSAFE_IO ( unsafePerformIO ) @@ -37,7 +57,7 @@ GHC's own exception type. \begin{code} ghcError :: GhcException -> a -ghcError e = throwDyn e +ghcError e = Exception.throwDyn e -- error messages all take the form -- @@ -64,11 +84,11 @@ progName = unsafePerformIO (getProgName) short_usage = "Usage: For basic information, try the `--help' option." -showException :: Exception -> String +showException :: Exception.Exception -> String -- Show expected dynamic exceptions specially -showException (DynException d) | Just e <- fromDynamic d - = show (e::GhcException) -showException other_exn = show other_exn +showException (Exception.DynException d) | Just e <- fromDynamic d + = show (e::GhcException) +showException other_exn = show other_exn instance Show GhcException where showsPrec _ e@(ProgramError _) = showGhcException e @@ -101,17 +121,23 @@ showGhcException (Panic s) ++ "to glasgow-haskell-bugs@haskell.org,\n" ++ "or http://sourceforge.net/projects/ghc/.\n\n") +#if __GLASGOW_HASKELL__ < 603 +myMkTyConApp = mkAppTy +#else +myMkTyConApp = mkTyConApp +#endif + ghcExceptionTc = mkTyCon "GhcException" {-# NOINLINE ghcExceptionTc #-} instance Typeable GhcException where - typeOf _ = mkAppTy ghcExceptionTc [] + typeOf _ = myMkTyConApp ghcExceptionTc [] \end{code} Panics and asserts. \begin{code} panic :: String -> a -panic x = throwDyn (Panic x) +panic x = Exception.throwDyn (Panic x) -- #-versions because panic can't return an unboxed int, and that's -- what TAG_ is with GHC at the moment. Ugh. (Simon) @@ -122,7 +148,7 @@ panic# s = case (panic s) of () -> _ILIT 0 assertPanic :: String -> Int -> a assertPanic file line = - throw (AssertionFailed + Exception.throw (Exception.AssertionFailed ("ASSERT failed! file " ++ file ++ ", line " ++ show line)) \end{code} @@ -131,20 +157,20 @@ assertPanic file line = -- exceptions. Used when we want soft failures when reading interface -- files, for example. -tryMost :: IO a -> IO (Either Exception a) +tryMost :: IO a -> IO (Either Exception.Exception a) tryMost action = do r <- myTry action; filter r where - filter (Left e@(DynException d)) + filter (Left e@(Exception.DynException d)) | Just ghc_ex <- fromDynamic d = case ghc_ex of - Interrupted -> throw e - Panic _ -> throw e + Interrupted -> Exception.throw e + Panic _ -> Exception.throw e _other -> return (Left e) filter other = return other #if __GLASGOW_HASKELL__ <= 408 -myTry = tryAllIO +myTry = Exception.tryAllIO #else myTry = Exception.try #endif @@ -154,8 +180,26 @@ Compatibility stuff: \begin{code} #if __GLASGOW_HASKELL__ <= 408 -catchJust = catchIO -ioErrors = justIoErrors -throwTo = raiseInThread +catchJust = Exception.catchIO +tryJust = Exception.tryIO +ioErrors = Exception.justIoErrors +throwTo = Exception.raiseInThread +#endif +\end{code} + +Standard signal handlers for catching ^C, which just throw an +exception in the main thread. NOTE: must be called from the main +thread. + +\begin{code} +installSignalHandlers :: IO () +installSignalHandlers = do +#ifndef mingw32_HOST_OS + main_thread <- myThreadId + let sig_handler = Catch (throwTo main_thread + (Exception.DynException (toDyn Interrupted))) + installHandler sigQUIT sig_handler Nothing + installHandler sigINT sig_handler Nothing #endif + return () \end{code}