2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Addr]{Module @Addr@}
20 -- (non-standard) coercions
21 , addrToInt -- :: Addr -> Int
22 , intToAddr -- :: Int -> Addr
32 import PrelIOBase ( IO(..) )
33 import Word ( indexWord8OffAddr, indexWord16OffAddr
34 , indexWord32OffAddr, indexWord64OffAddr
35 , readWord8OffAddr, readWord16OffAddr
36 , readWord32OffAddr, readWord64OffAddr
37 , writeWord8OffAddr, writeWord16OffAddr
38 , writeWord32OffAddr, writeWord64OffAddr
41 import Int ( indexInt8OffAddr, indexInt16OffAddr
42 , indexInt32OffAddr, indexInt64OffAddr
43 , readInt8OffAddr, readInt16OffAddr
44 , readInt32OffAddr, readInt64OffAddr
45 , writeInt8OffAddr, writeInt16OffAddr
46 , writeInt32OffAddr, writeInt64OffAddr
54 instance Show Addr where
55 showsPrec p addr rs = pad_out (showHex int "") rs
57 -- want 0s prefixed to pad it out to a fixed length.
58 pad_out ('0':'x':ls) rs =
59 '0':'x':(replicate (2*ADDR_SIZE_IN_BYTES - length ls) '0')
61 int = primAddrToInt addr
63 instance Show Addr where
64 showsPrec p (A# a) rs = pad_out (showHex int "") rs
66 -- want 0s prefixed to pad it out to a fixed length.
67 pad_out ('0':'x':ls) rs =
68 '0':'x':(replicate (2*ADDR_SIZE_IN_BYTES - length ls) '0') ++ ls ++ rs
71 case word2Integer# (int2Word# (addr2Int# a)) of
77 Coercing between machine ints and words
80 addrToInt :: Addr -> Int
81 intToAddr :: Int -> Addr
84 addrToInt = primAddrToInt
85 intToAddr = primIntToAddr
87 addrToInt (A# a#) = I# (addr2Int# a#)
88 intToAddr (I# i#) = A# (int2Addr# i#)
92 Indexing immutable memory:
95 indexCharOffAddr :: Addr -> Int -> Char
96 indexIntOffAddr :: Addr -> Int -> Int
97 indexWordOffAddr :: Addr -> Int -> Word
98 --in PrelAddr: indexAddrOffAddr :: Addr -> Int -> Addr
99 indexFloatOffAddr :: Addr -> Int -> Float
100 indexDoubleOffAddr :: Addr -> Int -> Double
101 indexStablePtrOffAddr :: Addr -> Int -> StablePtr a
104 indexCharOffAddr = error "TODO: indexCharOffAddr "
105 indexIntOffAddr = error "TODO: indexIntOffAddr "
106 indexWordOffAddr = error "TODO: indexWordOffAddr "
107 indexAddrOffAddr = error "TODO: indexAddrOffAddr "
108 indexFloatOffAddr = error "TODO: indexFloatOffAddr "
109 indexDoubleOffAddr = error "TODO: indexDoubleOffAddr"
110 indexStablePtrOffAddr = error "TODO: indexStablePtrOffAddr"
112 indexCharOffAddr (A# addr#) n
113 = case n of { I# n# ->
114 case indexCharOffAddr# addr# n# of { r# ->
117 indexIntOffAddr (A# addr#) n
118 = case n of { I# n# ->
119 case indexIntOffAddr# addr# n# of { r# ->
122 indexWordOffAddr (A# addr#) n
123 = case n of { I# n# ->
124 case indexWordOffAddr# addr# n# of { r# ->
127 indexFloatOffAddr (A# addr#) n
128 = case n of { I# n# ->
129 case indexFloatOffAddr# addr# n# of { r# ->
132 indexDoubleOffAddr (A# addr#) n
133 = case n of { I# n# ->
134 case indexDoubleOffAddr# addr# n# of { r# ->
137 indexStablePtrOffAddr (A# addr#) n
138 = case n of { I# n# ->
139 case indexStablePtrOffAddr# addr# n# of { r# ->
144 Indexing mutable memory:
147 readCharOffAddr :: Addr -> Int -> IO Char
148 readIntOffAddr :: Addr -> Int -> IO Int
149 readWordOffAddr :: Addr -> Int -> IO Word
150 readAddrOffAddr :: Addr -> Int -> IO Addr
151 readFloatOffAddr :: Addr -> Int -> IO Float
152 readDoubleOffAddr :: Addr -> Int -> IO Double
153 readStablePtrOffAddr :: Addr -> Int -> IO (StablePtr a)
156 readCharOffAddr = error "TODO: readCharOffAddr "
157 readIntOffAddr = error "TODO: readIntOffAddr "
158 readWordOffAddr = error "TODO: readWordOffAddr "
159 readAddrOffAddr = error "TODO: readAddrOffAddr "
160 readFloatOffAddr = error "TODO: readFloatOffAddr "
161 readDoubleOffAddr = error "TODO: readDoubleOffAddr "
162 readStablePtrOffAddr = error "TODO: readStablePtrOffAddr"
164 readCharOffAddr a i = case indexCharOffAddr a i of { C# o# -> return (C# o#) }
165 readIntOffAddr a i = case indexIntOffAddr a i of { I# o# -> return (I# o#) }
166 readWordOffAddr a i = case indexWordOffAddr a i of { W# o# -> return (W# o#) }
167 readAddrOffAddr a i = case indexAddrOffAddr a i of { A# o# -> return (A# o#) }
168 readFloatOffAddr a i = case indexFloatOffAddr a i of { F# o# -> return (F# o#) }
169 readDoubleOffAddr a i = case indexDoubleOffAddr a i of { D# o# -> return (D# o#) }
170 readStablePtrOffAddr a i = case indexStablePtrOffAddr a i of { StablePtr x -> return (StablePtr x) }
176 writeCharOffAddr :: Addr -> Int -> Char -> IO ()
177 writeIntOffAddr :: Addr -> Int -> Int -> IO ()
178 writeWordOffAddr :: Addr -> Int -> Word -> IO ()
179 writeAddrOffAddr :: Addr -> Int -> Addr -> IO ()
180 writeFloatOffAddr :: Addr -> Int -> Float -> IO ()
181 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
184 writeCharOffAddr = error "TODO: writeCharOffAddr "
185 writeIntOffAddr = error "TODO: writeIntOffAddr "
186 writeWordOffAddr = error "TODO: writeWordOffAddr "
187 writeAddrOffAddr = error "TODO: writeAddrOffAddr "
188 writeFloatOffAddr = error "TODO: writeFloatOffAddr "
189 writeDoubleOffAddr = error "TODO: writeDoubleOffAddr "
191 writeCharOffAddr (A# a#) (I# i#) (C# c#) = IO $ \ s# ->
192 case (writeCharOffAddr# a# i# c# s#) of s2# -> (# s2#, () #)
194 writeIntOffAddr (A# a#) (I# i#) (I# e#) = IO $ \ s# ->
195 case (writeIntOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
197 writeWordOffAddr (A# a#) (I# i#) (W# e#) = IO $ \ s# ->
198 case (writeWordOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
200 writeAddrOffAddr (A# a#) (I# i#) (A# e#) = IO $ \ s# ->
201 case (writeAddrOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
203 writeFloatOffAddr (A# a#) (I# i#) (F# e#) = IO $ \ s# ->
204 case (writeFloatOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
206 writeDoubleOffAddr (A# a#) (I# i#) (D# e#) = IO $ \ s# ->
207 case (writeDoubleOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
209 #ifndef __PARALLEL_HASKELL__
210 writeForeignObjOffAddr :: Addr -> Int -> ForeignObj -> IO ()
211 writeForeignObjOffAddr (A# a#) (I# i#) (ForeignObj e#) = IO $ \ s# ->
212 case (writeForeignObjOffAddr# a# i# e# s#) of s2# -> (# s2#, () #)
215 writeStablePtrOffAddr :: Addr -> Int -> StablePtr a -> IO ()
216 writeStablePtrOffAddr (A# a#) (I# i#) (StablePtr e#) = IO $ \ s# ->
217 case (writeStablePtrOffAddr# a# i# e# s#) of s2# -> (# s2# , () #)