[project @ 2003-06-19 10:42:24 by simonmar]
authorsimonmar <unknown>
Thu, 19 Jun 2003 10:42:26 +0000 (10:42 +0000)
committersimonmar <unknown>
Thu, 19 Jun 2003 10:42:26 +0000 (10:42 +0000)
commitd89872a45b581ba3f086c636126a44d97ef45be6
tree36ded866fba3ea14dfacbf962c4c4a7ed721dd48
parent1f730da425bb17f8c80f0fb3d576a37823558565
[project @ 2003-06-19 10:42:24 by simonmar]
Add raiseIO# primop.

This is part of ensuring that exceptions are *precise* in the IO monad
(as opposed to imprecise exceptions in the pure world).  If we allow
the strictness analyser to see the definition of throwIO:

  throwIO e = IO $ \s -> throw e

then it might re-order evaluation in the IO monad, with the result
that we get _|_ instead of an exception, or one kind of exception when
we were expecting another.  We therefore must prevent the strictness
analyser from doing these reorderings in the IO monad.  Hiding the
definition of throwIO by making it a primop solves part of the problem
(there's more to come).

See SourceForge bug #752149.
ghc/compiler/prelude/primops.txt.pp
ghc/includes/PrimOps.h
ghc/rts/Exception.hc