Delete all /* ! __GLASGOW_HASKELL__ */ code
[ghc.git] / compiler / utils / FastFunctions.lhs
1 Z%
2 % (c) The University of Glasgow, 2000-2006
3 %
4 \section{Fast functions}
5
6 \begin{code}
7 {-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}
8
9 module FastFunctions (
10     unsafeChr, inlinePerformIO, unsafeDupableInterleaveIO,
11     indexWord8OffFastPtr,
12     indexWord8OffFastPtrAsFastChar, indexWord8OffFastPtrAsFastInt,
13     global, Global
14   ) where
15
16 #include "HsVersions.h"
17
18 import FastTypes
19 import Data.IORef
20 import System.IO.Unsafe
21
22 import GHC.Exts
23 import GHC.Word
24 import GHC.Base (unsafeChr)
25
26 import GHC.IO   (IO(..), unsafeDupableInterleaveIO)
27
28 -- Just like unsafePerformIO, but we inline it.
29 {-# INLINE inlinePerformIO #-}
30 inlinePerformIO :: IO a -> a
31 inlinePerformIO (IO m) = case m realWorld# of (# _, r #)   -> r
32
33 indexWord8OffFastPtr p i = W8# (indexWord8OffAddr# p i)
34 indexWord8OffFastPtrAsFastChar p i = indexCharOffAddr# p i
35 indexWord8OffFastPtrAsFastInt p i = word2Int# (indexWord8OffAddr# p i)
36 -- or ord# (indexCharOffAddr# p i)
37
38 --just so we can refer to the type clearly in a macro
39 type Global a = IORef a
40 global :: a -> Global a
41 global a = unsafePerformIO (newIORef a)
42
43 indexWord8OffFastPtr :: FastPtr Word8 -> FastInt -> Word8
44 indexWord8OffFastPtrAsFastChar :: FastPtr Word8 -> FastInt -> FastChar
45 indexWord8OffFastPtrAsFastInt :: FastPtr Word8 -> FastInt -> FastInt
46
47 \end{code}