[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
index 6543bfb..dab7f89 100644 (file)
@@ -1,5 +1,5 @@
 %
-% (c) The AQUA Project, Glasgow University, 1994-1996
+% (c) The AQUA Project, Glasgow University, 1994-1998
 %
 
 \section[PrelAddr]{Module @PrelAddr@}
@@ -8,19 +8,24 @@
 {-# OPTIONS -fno-implicit-prelude #-}
 
 module PrelAddr (
-       Addr(..), 
-       nullAddr,                       -- :: Addr
-       plusAddr,                       -- :: Addr -> Int -> Addr
+         Addr(..)
+       , Word(..)
+       , nullAddr                      -- :: Addr
+       , plusAddr                      -- :: Addr -> Int -> Addr
+       , indexAddrOffAddr              -- :: Addr -> Int -> Addr
+
+       , Word64(..)
+       , Int64(..)
    ) where
 
 import PrelGHC
 import PrelBase
-import PrelST
 import PrelCCall
 \end{code}
 
 \begin{code}
 data Addr = A# Addr#   deriving (Eq, Ord)
+data Word = W# Word#   deriving (Eq, Ord)
 
 instance Show Addr where
    showsPrec p (A# a) = showsPrec p (I# (addr2Int# a))
@@ -33,52 +38,33 @@ plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
 instance CCallable Addr
 instance CCallable Addr#
 instance CReturnable Addr
-\end{code}
 
-ToDo:
-
--- read value out of _immutable_ memory
-      indexCharOffAddr   :: Addr -> Int -> Char
-      indexIntOffAddr    :: Addr -> Int -> Int     -- should we drop this?
-      indexAddrOffAddr   :: Addr -> Int -> Addr
-      indexFloatOffAddr  :: Addr -> Int -> Float
-      indexDoubleOffAddr :: Addr -> Int -> Double
-      indexWord8OffAddr  :: Addr -> Int -> Word8
-      indexWord16OffAddr :: Addr -> Int -> Word16
-      indexWord32OffAddr :: Addr -> Int -> Word32
-      indexWord64OffAddr :: Addr -> Int -> Word64
-      indexInt8OffAddr   :: Addr -> Int -> Int8
-      indexInt16OffAddr  :: Addr -> Int -> Int16
-      indexInt32OffAddr  :: Addr -> Int -> Int32
-      indexInt64OffAddr  :: Addr -> Int -> Int64
-
-      -- read value out of mutable memory
-      readCharOffAddr    :: Addr -> Int -> IO Char
-      readIntOffAddr     :: Addr -> Int -> IO Int  -- should we drop this?
-      readAddrOffAddr    :: Addr -> Int -> IO Addr
-      readFloatOffAddr   :: Addr -> Int -> IO Float
-      readDoubleOffAddr  :: Addr -> Int -> IO Double
-      readWord8OffAddr   :: Addr -> Int -> IO Word8
-      readWord16OffAddr  :: Addr -> Int -> IO Word16
-      readWord32OffAddr  :: Addr -> Int -> IO Word32
-      readWord64OffAddr  :: Addr -> Int -> IO Word64
-      readInt8OffAddr    :: Addr -> Int -> IO Int8
-      readInt16OffAddr   :: Addr -> Int -> IO Int16
-      readInt32OffAddr   :: Addr -> Int -> IO Int32
-      readInt64OffAddr   :: Addr -> Int -> IO Int64
-
-      -- write value into mutable memory
-      writeCharOffAddr   :: Addr -> Int -> Char   -> IO ()
-      writeIntOffAddr    :: Addr -> Int -> Int    -> IO ()  -- should we drop this?
-      writeAddrOffAddr   :: Addr -> Int -> Addr   -> IO ()
-      writeFloatOffAddr  :: Addr -> Int -> Float  -> IO ()
-      writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
-      writeWord8OffAddr  :: Addr -> Int -> Word8  -> IO ()
-      writeWord16OffAddr :: Addr -> Int -> Word16 -> IO ()
-      writeWord32OffAddr :: Addr -> Int -> Word32 -> IO ()
-      writeWord64OffAddr :: Addr -> Int -> Word64 -> IO ()
-      writeInt8OffAddr   :: Addr -> Int -> Int8   -> IO ()
-      writeInt16OffAddr  :: Addr -> Int -> Int16  -> IO ()
-      writeInt32OffAddr  :: Addr -> Int -> Int32  -> IO ()
-      writeInt64OffAddr  :: Addr -> Int -> Int64  -> IO ()
+instance CCallable Word
+instance CCallable Word#
+instance CReturnable Word
+
+#if WORD_SIZE_IN_BYTES == 8
+data Word64 = W64# Word#
+data Int64  = I64# Int#
+#else
+data Word64 = W64# Word64# --deriving (Eq, Ord) -- Glasgow extension
+data Int64  = I64# Int64#  --deriving (Eq, Ord) -- Glasgow extension
+
+instance CCallable   Word64#
+instance CCallable   Int64#
+#endif
+
+instance CCallable   Word64
+instance CReturnable Word64
+
+instance CCallable   Int64
+instance CReturnable Int64
+
+indexAddrOffAddr   :: Addr -> Int -> Addr
+indexAddrOffAddr (A# addr#) n
+  = case n                             of { I# n# ->
+    case indexAddrOffAddr# addr# n#    of { r# ->
+    (A# r#)}}
+
+\end{code}