[GHC] #14998: Sort out the strictness mess for exceptions

GHC ghc-devs at haskell.org
Fri Apr 6 13:41:42 UTC 2018


#14998: Sort out the strictness mess for exceptions
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.4.3
       Component:  Compiler          |              Version:  8.2.2
      Resolution:                    |             Keywords:  Exceptions
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by sgraf):

 Item 2 no longer regresses in performance and passes `./validate` with
 this diff:

 {{{
 diff --git a/libraries/base/GHC/IO.hs b/libraries/base/GHC/IO.hs
 index 05ad277127..f9dbfef71b 100644
 --- a/libraries/base/GHC/IO.hs
 +++ b/libraries/base/GHC/IO.hs
 @@ -142,7 +142,7 @@ have to work around that in the definition of catch
 below).
  -- @catchException undefined b == _|_ at . See #exceptions_and_strictness#
  -- for details.
  catchException :: Exception e => IO a -> (e -> IO a) -> IO a
 -catchException !io handler = catch io handler
 +catchException io handler = catch io handler

  -- | This is the simplest of the exception-catching functions.  It
  -- takes a single argument, runs it, and if an exception is raised
 @@ -194,7 +194,7 @@ catch (IO io) handler = IO $ catch# io handler'
  -- @catchAny undefined b == _|_ at . See #exceptions_and_strictness# for
  -- details.
  catchAny :: IO a -> (forall e . Exception e => e -> IO a) -> IO a
 -catchAny !(IO io) handler = IO $ catch# io handler'
 +catchAny (IO io) handler = IO $ catch# io handler'
      where handler' (SomeException e) = unIO (handler e)

  -- Using catchException here means that if `m` throws an
 diff --git a/libraries/base/GHC/IO/Handle/Internals.hs
 b/libraries/base/GHC/IO/Handle/Internals.hs
 index 48ece1dc5e..3d58f3d3bc 100644
 --- a/libraries/base/GHC/IO/Handle/Internals.hs
 +++ b/libraries/base/GHC/IO/Handle/Internals.hs
 @@ -163,7 +163,8 @@ do_operation :: String -> Handle -> (Handle__ -> IO a)
 -> MVar Handle__ -> IO a
  do_operation fun h act m = do
    h_ <- takeMVar m
    checkHandleInvariants h_
 -  act h_ `catchException` handler h_
 +  let !io = act h_
 +  io `catchException` handler h_
    where
      handler h_ e = do
        putMVar m h_
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14998#comment:12>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list