From 98b505e0fccccdbbaa72999cdc26e92dee720a18 Mon Sep 17 00:00:00 2001 From: panne Date: Wed, 12 Apr 2000 15:32:11 +0000 Subject: [PATCH] [project @ 2000-04-12 15:32:11 by panne] Cleaned up Addr, AddrOff added --- ghc/lib/std/PrelAddr.lhs | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/ghc/lib/std/PrelAddr.lhs b/ghc/lib/std/PrelAddr.lhs index 8a0ba32..8bd90f2 100644 --- a/ghc/lib/std/PrelAddr.lhs +++ b/ghc/lib/std/PrelAddr.lhs @@ -9,9 +9,13 @@ module PrelAddr ( Addr(..) - , nullAddr -- :: Addr - , plusAddr -- :: Addr -> Int -> Addr - , indexAddrOffAddr -- :: Addr -> Int -> Addr + , AddrOff(..) + , nullAddr -- :: Addr + , alignAddr -- :: Addr -> Int -> Addr + , plusAddr -- :: Addr -> AddrOff -> Addr + , minusAddr -- :: Addr -> Addr -> AddrOff + + , indexAddrOffAddr -- :: Addr -> Int -> Addr , Word(..) , wordToInt @@ -24,18 +28,30 @@ module PrelAddr ( import PrelGHC import PrelBase -infixl 5 `plusAddr` +infixl 5 `plusAddr`, `minusAddr` \end{code} \begin{code} data Addr = A# Addr# deriving (Eq, Ord) data Word = W# Word# deriving (Eq, Ord) +newtype AddrOff = AddrOff# Int + nullAddr :: Addr nullAddr = A# (int2Addr# 0#) -plusAddr :: Addr -> Int -> Addr -plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off)) +alignAddr :: Addr -> Int -> Addr +alignAddr addr@(A# a) (I# i) + = case addr2Int# a of { ai -> + case remInt# ai i of { + 0# -> addr; + n -> A# (int2Addr# (ai +# (i -# n))) }} + +plusAddr :: Addr -> AddrOff -> Addr +plusAddr (A# addr) (AddrOff# (I# off)) = A# (int2Addr# (addr2Int# addr +# off)) + +minusAddr :: Addr -> Addr -> AddrOff +minusAddr (A# a1) (A# a2) = AddrOff# (I# (addr2Int# a1 -# addr2Int# a2)) instance CCallable Addr instance CReturnable Addr -- 1.7.10.4