X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FPanic.lhs;h=6ad720f1dbfede2ef6398bf0e723a90de6421c86;hb=5971cecb8634e95278295c8c563bebd9700509e3;hp=72eefd497598c7afb52d1527520791d4328c4239;hpb=fa0d4eff529f5575a357b8361c96002d7f45e77f;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Panic.lhs b/ghc/compiler/utils/Panic.lhs index 72eefd4..6ad720f 100644 --- a/ghc/compiler/utils/Panic.lhs +++ b/ghc/compiler/utils/Panic.lhs @@ -11,16 +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 "config.h" import Config import FastTypes @@ -31,24 +33,28 @@ import System.Posix.Signals # else import Posix ( Handler(Catch), installHandler, sigINT, sigQUIT ) # endif /* GHC > 504 */ +#endif /* mingw32_HOST_OS */ -import CONCURRENT ( myThreadId ) +#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 */ -#endif /* mingw32_HOST_OS */ #if __GLASGOW_HASKELL__ > 408 import EXCEPTION ( catchJust, tryJust, ioErrors ) #endif +import CONCURRENT ( myThreadId ) import DYNAMIC import qualified EXCEPTION as Exception import TRACE ( trace ) import UNSAFE_IO ( unsafePerformIO ) +import IO ( isUserError ) import System \end{code} @@ -121,19 +127,26 @@ 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 +-- #-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) @@ -152,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 @@ -163,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 @@ -188,12 +216,28 @@ 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 + 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}