[project @ 1998-02-02 17:27:26 by simonm]
[ghc-hetmet.git] / ghc / lib / std / PrelUnsafe.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1996
3 %
4
5 \section[PrelUnsafe]{Module @PrelUnsafe@}
6
7 These functions have their own module because we definitely don't want
8 them to be inlined.
9
10 \begin{code}
11 {-# OPTIONS -fno-implicit-prelude #-}
12
13 module PrelUnsafe
14         ( unsafePerformIO, 
15           unsafeInterleaveIO, 
16           trace,
17         ) where
18 \end{code}
19
20 \begin{code}
21 import PrelBase
22 import PrelIOBase
23 import PrelAddr
24 import {-# SOURCE #-} PrelErr ( error )
25 \end{code}
26
27 %*********************************************************
28 %*                                                      *
29 \subsection{Unsafe @IO@ operations}
30 %*                                                      *
31 %*********************************************************
32
33 \begin{code}
34 unsafePerformIO :: IO a -> a
35 unsafePerformIO (IO m)
36   = case m realWorld# of
37       IOok _ r   -> r
38       IOfail _ e -> error ("unsafePerformIO: I/O error: " ++ show e ++ "\n")
39
40 unsafeInterleaveIO :: IO a -> IO a
41 unsafeInterleaveIO (IO m) = IO ( \ s ->
42         let
43             IOok _ r = m s
44         in
45         IOok s r)
46
47 {-# GENERATE_SPECS _trace a #-}
48 trace :: String -> a -> a
49 trace string expr
50   = unsafePerformIO (
51         ((_ccall_ PreTraceHook sTDERR{-msg-}):: IO ())  >>
52         fputs sTDERR string                             >>
53         ((_ccall_ PostTraceHook sTDERR{-msg-}):: IO ()) >>
54         return expr )
55   where
56     sTDERR = (``stderr'' :: Addr)
57 \end{code}
58