2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Addr]{Module @Addr@}
18 -- (non-standard) coercions
19 , addrToInt -- :: Addr -> Int
20 , intToAddr -- :: Int -> Addr
31 import PrelIOBase ( IO(..) )
32 import Word ( indexWord8OffAddr, indexWord16OffAddr
33 , indexWord32OffAddr, indexWord64OffAddr
34 , readWord8OffAddr, readWord16OffAddr
35 , readWord32OffAddr, readWord64OffAddr
36 , writeWord8OffAddr, writeWord16OffAddr
37 , writeWord32OffAddr, writeWord64OffAddr
40 import Int ( indexInt8OffAddr, indexInt16OffAddr
41 , indexInt32OffAddr, indexInt64OffAddr
42 , readInt8OffAddr, readInt16OffAddr
43 , readInt32OffAddr, readInt64OffAddr
44 , writeInt8OffAddr, writeInt16OffAddr
45 , writeInt32OffAddr, writeInt64OffAddr
51 Coercing between machine ints and words
54 addrToInt :: Addr -> Int
55 intToAddr :: Int -> Addr
58 addrToInt = primAddrToInt
59 intToAddr = primIntToAddr
61 addrToInt (A# a#) = I# (addr2Int# a#)
62 intToAddr (I# i#) = A# (int2Addr# i#)
66 Indexing immutable memory:
69 indexCharOffAddr :: Addr -> Int -> Char
70 indexIntOffAddr :: Addr -> Int -> Int
71 indexWordOffAddr :: Addr -> Int -> Word
72 --in PrelAddr: indexAddrOffAddr :: Addr -> Int -> Addr
73 indexFloatOffAddr :: Addr -> Int -> Float
74 indexDoubleOffAddr :: Addr -> Int -> Double
77 indexCharOffAddr = primIndexCharOffAddr
78 indexIntOffAddr = primIndexIntOffAddr
79 indexWordOffAddr = primIndexWordOffAddr
80 indexAddrOffAddr = primIndexAddrOffAddr
81 indexFloatOffAddr = primIndexFloatOffAddr
82 indexDoubleOffAddr = primIndexDoubleOffAddr
84 indexCharOffAddr (A# addr#) n
85 = case n of { I# n# ->
86 case indexCharOffAddr# addr# n# of { r# ->
89 indexIntOffAddr (A# addr#) n
90 = case n of { I# n# ->
91 case indexIntOffAddr# addr# n# of { r# ->
94 indexWordOffAddr (A# addr#) n
95 = case n of { I# n# ->
96 case indexWordOffAddr# addr# n# of { r# ->
99 indexFloatOffAddr (A# addr#) n
100 = case n of { I# n# ->
101 case indexFloatOffAddr# addr# n# of { r# ->
104 indexDoubleOffAddr (A# addr#) n
105 = case n of { I# n# ->
106 case indexDoubleOffAddr# addr# n# of { r# ->
111 Indexing mutable memory:
114 readCharOffAddr :: Addr -> Int -> IO Char
115 readIntOffAddr :: Addr -> Int -> IO Int
116 readWordOffAddr :: Addr -> Int -> IO Word
117 readAddrOffAddr :: Addr -> Int -> IO Addr
118 readFloatOffAddr :: Addr -> Int -> IO Float
119 readDoubleOffAddr :: Addr -> Int -> IO Double
122 readCharOffAddr = primReadCharOffAddr
123 readIntOffAddr = primReadIntOffAddr
124 readWordOffAddr = primReadWordOffAddr
125 readAddrOffAddr = primReadAddrOffAddr
126 readFloatOffAddr = primReadFloatOffAddr
127 readDoubleOffAddr = primReadDoubleOffAddr
129 readCharOffAddr a i = _casm_ `` %r=(StgChar)(((StgChar*)%0)[(StgInt)%1]); '' a i
130 readIntOffAddr a i = _casm_ `` %r=(StgInt)(((StgInt*)%0)[(StgInt)%1]); '' a i
131 readWordOffAddr a i = _casm_ `` %r=(StgWord)(((StgWord*)%0)[(StgInt)%1]); '' a i
132 readAddrOffAddr a i = _casm_ `` %r=(StgAddr)(((StgAddr*)%0)[(StgInt)%1]); '' a i
133 readFloatOffAddr a i = _casm_ `` %r=(StgFloat)(((StgFloat*)%0)[(StgInt)%1]); '' a i
134 readDoubleOffAddr a i = _casm_ `` %r=(StgDouble)(((StgDouble*)%0)[(StgInt)%1]); '' a i
136 readStablePtrOffAddr :: Addr -> Int -> IO (StablePtr a)
137 readStablePtrOffAddr a i = _casm_ `` %r=(StgStablePtr)(((StgStablePtr*)%0)[(StgInt)%1]); '' a i
143 writeCharOffAddr :: Addr -> Int -> Char -> IO ()
144 writeIntOffAddr :: Addr -> Int -> Int -> IO ()
145 writeWordOffAddr :: Addr -> Int -> Word -> IO ()
146 writeAddrOffAddr :: Addr -> Int -> Addr -> IO ()
147 writeFloatOffAddr :: Addr -> Int -> Float -> IO ()
148 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
151 writeCharOffAddr = primWriteCharOffAddr
152 writeIntOffAddr = primWriteIntOffAddr
153 writeWordOffAddr = primWriteWordOffAddr
154 writeAddrOffAddr = primWriteAddrOffAddr
155 writeFloatOffAddr = primWriteFloatOffAddr
156 writeDoubleOffAddr = primWriteDoubleOffAddr
158 writeCharOffAddr (A# a#) (I# i#) (C# c#) = IO $ \ s# ->
159 case (writeCharOffAddr# a# i# c# s#) of s2# -> (# s2#, () #)
161 writeIntOffAddr (A# a#) (I# i#) (I# e#) = IO $ \ s# ->
162 case (writeIntOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
164 writeWordOffAddr (A# a#) (I# i#) (W# e#) = IO $ \ s# ->
165 case (writeWordOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
167 writeAddrOffAddr (A# a#) (I# i#) (A# e#) = IO $ \ s# ->
168 case (writeAddrOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
170 writeFloatOffAddr (A# a#) (I# i#) (F# e#) = IO $ \ s# ->
171 case (writeFloatOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
173 writeDoubleOffAddr (A# a#) (I# i#) (D# e#) = IO $ \ s# ->
174 case (writeDoubleOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
176 #ifndef __PARALLEL_HASKELL__
177 writeForeignObjOffAddr :: Addr -> Int -> ForeignObj -> IO ()
178 writeForeignObjOffAddr (A# a#) (I# i#) (ForeignObj e#) = IO $ \ s# ->
179 case (writeForeignObjOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
182 writeStablePtrOffAddr :: Addr -> Int -> StablePtr a -> IO ()
183 writeStablePtrOffAddr (A# a#) (I# i#) (StablePtr e#) = IO $ \ s# ->
184 case (writeStablePtrOffAddr# a# i# e# s#) of s2# -> (# s2# , () #)