[project @ 2000-04-10 16:02:58 by simonpj]
[ghc-hetmet.git] / ghc / lib / std / PrelAddr.lhs
index 6543bfb..8a0ba32 100644 (file)
@@ -1,84 +1,73 @@
 %
-% (c) The AQUA Project, Glasgow University, 1994-1996
+% (c) The AQUA Project, Glasgow University, 1994-1998
 %
 
 \section[PrelAddr]{Module @PrelAddr@}
 
 \begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
+{-# OPTIONS -fcompiling-prelude -fno-implicit-prelude #-}
 
 module PrelAddr (
-       Addr(..), 
-       nullAddr,                       -- :: Addr
-       plusAddr,                       -- :: Addr -> Int -> Addr
+         Addr(..)
+       , nullAddr                      -- :: Addr
+       , plusAddr                      -- :: Addr -> Int -> Addr
+       , indexAddrOffAddr              -- :: Addr -> Int -> Addr
+
+       , Word(..)
+       , wordToInt
+       , intToWord
+
+       , Word64(..)
+       , Int64(..)
    ) where
 
 import PrelGHC
 import PrelBase
-import PrelST
-import PrelCCall
+
+infixl 5 `plusAddr`
 \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))
-
-nullAddr = ``NULL'' :: Addr
+nullAddr :: Addr
+nullAddr = A# (int2Addr# 0#)
 
 plusAddr :: Addr -> Int -> Addr
 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 CReturnable Word
+
+wordToInt :: Word -> Int
+wordToInt (W# w#) = I# (word2Int# w#)
+
+intToWord :: Int -> Word
+intToWord (I# i#) = W# (int2Word# i#)
+
+#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
+#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}