X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=6251d1baf414bc81b0ca6bc8af5f478b10a1de88;hb=153b9cb9b11e05c4edb1b6bc0a7b972660e41f70;hp=1af8ed2d253680a599a2fafee3cea6638aa43abe;hpb=fe9000d86cba2bd11834345bba16370f8b13d670;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 1af8ed2..6251d1b 100644 --- a/ghc/compiler/utils/Panic.lhs +++ b/ghc/compiler/utils/Panic.lhs @@ -12,18 +12,12 @@ some unnecessary loops in the module dependency graph. module Panic ( GhcException(..), ghcError, progName, + pgmError, panic, panic#, assertPanic, trace, - showException, showGhcException, Exception.throwDyn, tryMost, + showException, showGhcException, tryMost, + installSignalHandlers, - Exception.Exception, - Panic.try, -- try :: IO a -> IO (Either Exception a) - -- This is Control.Exception.try in the new library story - -- Exception.tryAllIO in GHC 4.08 - -- So it usefully hides the difference - -#if __GLASGOW_HASKELL__ <= 408 - catchJust, ioErrors, throwTo, -#endif + catchJust, tryJust, ioErrors, throwTo, ) where #include "HsVersions.h" @@ -31,6 +25,29 @@ module Panic 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 */ +#endif /* mingw32_HOST_OS */ + +#if defined(mingw32_HOST_OS) && __GLASGOW_HASKELL__ >= 603 +import GHC.ConsoleHandler +#endif + +# 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 CONCURRENT ( myThreadId ) import DYNAMIC import qualified EXCEPTION as Exception import TRACE ( trace ) @@ -107,17 +124,24 @@ 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 = Exception.throwDyn (Panic x) +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 -- what TAG_ is with GHC at the moment. Ugh. (Simon) @@ -138,7 +162,7 @@ assertPanic file line = -- files, for example. tryMost :: IO a -> IO (Either Exception.Exception a) -tryMost action = do r <- try action; filter r +tryMost action = do r <- myTry action; filter r where filter (Left e@(Exception.DynException d)) | Just ghc_ex <- fromDynamic d @@ -150,9 +174,9 @@ tryMost action = do r <- try action; filter r = return other #if __GLASGOW_HASKELL__ <= 408 -try = Exception.tryAllIO +myTry = Exception.tryAllIO #else -try = Exception.try +myTry = Exception.try #endif \end{code} @@ -160,8 +184,42 @@ 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 + main_thread <- myThreadId + let + interrupt_exn = Exception.DynException (toDyn Interrupted) + interrupt = throwTo main_thread interrupt_exn + -- +#if !defined(mingw32_HOST_OS) + 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 + -- NOTE: running GHCi under a bash shell for some reason requires + -- you to press Ctrl-Break rather than Ctrl-C to provoke + -- an interrupt. Ctrl-C is getting blocked somewhere, I don't know + -- why --SDM 17/12/2004 + let sig_handler ControlC = interrupt + sig_handler Break = interrupt + sig_handler _ = return () + + installHandler (Catch sig_handler) + return () +#else + return () -- nothing #endif \end{code}