X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Flib%2Fghc%2FUnsafe.lhs;fp=ghc%2Flib%2Fghc%2FUnsafe.lhs;h=1a145af090d033227daf947d944c9c5209100f79;hb=4e2bf823d13edfcd3e76e2b4754f83021adb13ce;hp=1da8e25c4ea02027836c4be2f2a57bc44b0aa91a;hpb=94a3714fc95e7502d333135be2a8bfc6cd3e12bf;p=ghc-hetmet.git diff --git a/ghc/lib/ghc/Unsafe.lhs b/ghc/lib/ghc/Unsafe.lhs index 1da8e25..1a145af 100644 --- a/ghc/lib/ghc/Unsafe.lhs +++ b/ghc/lib/ghc/Unsafe.lhs @@ -13,16 +13,13 @@ them to be inlined. module Unsafe ( unsafePerformIO, unsafeInterleaveIO, - unsafeInterleaveST, trace, - runST ) where \end{code} \begin{code} import PrelBase import IOBase -import STBase import Addr import {-# SOURCE #-} Error ( error ) \end{code} @@ -59,52 +56,3 @@ trace string expr sTDERR = (``stderr'' :: Addr) \end{code} -\begin{code} -unsafeInterleaveST :: ST s a -> ST s a -unsafeInterleaveST (ST m) = ST ( \ s -> - let - STret _ r = m s - in - STret s r) - -\end{code} - -Definition of runST -~~~~~~~~~~~~~~~~~~~ - -SLPJ 95/04: Why @runST@ must not have an unfolding; consider: -\begin{verbatim} -f x = - runST ( \ s -> let - (a, s') = newArray# 100 [] s - (_, s'') = fill_in_array_or_something a x s' - in - freezeArray# a s'' ) -\end{verbatim} -If we inline @runST@, we'll get: -\begin{verbatim} -f x = let - (a, s') = newArray# 100 [] realWorld#{-NB-} - (_, s'') = fill_in_array_or_something a x s' - in - freezeArray# a s'' -\end{verbatim} -And now the @newArray#@ binding can be floated to become a CAF, which -is totally and utterly wrong: -\begin{verbatim} -f = let - (a, s') = newArray# 100 [] realWorld#{-NB-} -- YIKES!!! - in - \ x -> - let (_, s'') = fill_in_array_or_something a x s' in - freezeArray# a s'' -\end{verbatim} -All calls to @f@ will share a {\em single} array! End SLPJ 95/04. - -\begin{code} -runST :: (All s => ST s a) -> a -runST st = - case st of - ST m -> case m realWorld# of - STret _ r -> r -\end{code}