80740d3ea65f6eeeaa943bd62508bfb6a192c5af
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1998
3 %
4
5 \section[PrelAddr]{Module @PrelAddr@}
6
7 \begin{code}
8 {-# OPTIONS -fno-implicit-prelude #-}
9
10 module PrelAddr (
11           Addr(..)
12         , nullAddr                      -- :: Addr
13         , plusAddr                      -- :: Addr -> Int -> Addr
14         , indexAddrOffAddr              -- :: Addr -> Int -> Addr
15
16         , Word(..)
17         , wordToInt
18
19         , Word64(..)
20         , Int64(..)
21    ) where
22
23 import PrelGHC
24 import PrelBase
25 import PrelShow
26 import PrelCCall
27 \end{code}
28
29 \begin{code}
30 data Addr = A# Addr#    deriving (Eq, Ord)
31 data Word = W# Word#    deriving (Eq, Ord)
32
33 instance Show Addr where
34    showsPrec p (A# a) = showsPrec p (I# (addr2Int# a))
35
36 nullAddr :: Addr
37 nullAddr = ``(W_)NULL''
38
39 plusAddr :: Addr -> Int -> Addr
40 plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
41
42 instance CCallable Addr
43 instance CCallable Addr#
44 instance CReturnable Addr
45
46 instance CCallable Word
47 instance CCallable Word#
48 instance CReturnable Word
49
50 wordToInt :: Word -> Int
51 wordToInt (W# w#) = I# (word2Int# w#)
52
53 #if WORD_SIZE_IN_BYTES == 8
54 data Word64 = W64# Word#
55 data Int64  = I64# Int#
56 #else
57 data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
58 data Int64  = I64# Int64#  --deriving (Eq, Ord) -- Glasgow extension
59
60 instance CCallable   Word64#
61 instance CCallable   Int64#
62 #endif
63
64 instance CCallable   Word64
65 instance CReturnable Word64
66
67 instance CCallable   Int64
68 instance CReturnable Int64
69
70 indexAddrOffAddr   :: Addr -> Int -> Addr
71 indexAddrOffAddr (A# addr#) n
72   = case n                              of { I# n# ->
73     case indexAddrOffAddr# addr# n#     of { r# ->
74     (A# r#)}}
75
76 \end{code}
77