[make Jhc.Addr.[Fun]Addr plain types rather than built in
John Meacham <john@repetae.net>**20080218190116] addfile ./lib/base/Jhc/Order.m4
addfile ./lib/base/Foreign/Storable.m4
hunk ./data/names.txt 11
+Addr      Jhc.Addr.Addr
+FunAddr   Jhc.Addr.FunAddr
hunk ./data/names.txt 46
+Addr       Jhc.Addr.Addr
hunk ./data/primitives.txt 27
-Jhc.Addr.Addr, ubits<ptr>, ptr,UINTPTR_MAX, 0
-Jhc.Addr.FunAddr, ubits<ptr>, ptr,UINTPTR_MAX,0
+#Jhc.Addr.Addr, ubits<ptr>, ptr,UINTPTR_MAX, 0
+#Jhc.Addr.FunAddr, ubits<ptr>, ptr,UINTPTR_MAX,0
hunk ./lib/base/Foreign/Ptr.hs 1
-{-# OPTIONS_JHC -N -fffi #-}
+{-# OPTIONS_JHC -N -fffi -funboxed-tuples #-}
+
hunk ./lib/base/Foreign/Ptr.hs 29
-
-
hunk ./lib/base/Foreign/Storable.m4 1
+
+
+m4_define(INST_STORABLE,{{
+
+instance Storable $1 where
+    peek (Ptr (Addr addr)) = IO $ \w -> case peek$2 addr w of
+        (# w', r #) -> (# w', $1 r #)
+    poke (Ptr (Addr addr)) ($1 v) = IO $ \w -> case poke$2 v addr w of
+        w' -> (# w', () #)
+    sizeOf _ = boxInt (sizeOf$2 0#)
+
+ONCE({{
+foreign import primitive "peek.$3" peek$2 :: Addr__ -> UIO $2
+foreign import primitive "poke.$3" poke$2 :: $2 -> Addr__ -> UIO_
+foreign import primitive "sizeOf.$3" sizeOf$2 :: $2 -> Int__
+}})
+
+}})
+
hunk ./lib/base/Jhc/Addr.hs 1
-{-# OPTIONS_JHC -N -fffi #-}
+{-# OPTIONS_JHC -N -fffi -funboxed-values -fm4 #-}
+
+m4_include(Jhc/Order.m4)
+m4_include(Foreign/Storable.m4)
hunk ./lib/base/Jhc/Addr.hs 21
+import Jhc.Int
hunk ./lib/base/Jhc/Addr.hs 23
-import Data.Int
hunk ./lib/base/Jhc/Addr.hs 24
+import Jhc.Types
+import Jhc.Order
+import Jhc.Basics
+import Jhc.IO
+import Foreign.Storable
hunk ./lib/base/Jhc/Addr.hs 30
-data Addr
-data FunAddr
+data Addr = Addr BitsPtr_
+data FunAddr = FunAddr BitsPtr_
hunk ./lib/base/Jhc/Addr.hs 36
-nullAddr = wordPtrToAddr zeroWordPtr
-nullFunAddr = wordPtrToFunAddr zeroWordPtr
+nullAddr = Addr 0#
+nullFunAddr = FunAddr 0#
+
+INST_EQORDER(Addr,BitsPtr_)
+INST_EQORDER(FunAddr,BitsPtr_)
hunk ./lib/base/Jhc/Addr.hs 42
+INST_STORABLE(Addr,BitsPtr_,bits<ptr>)
+INST_STORABLE(FunAddr,BitsPtr_,bits<ptr>)
hunk ./lib/base/Jhc/Addr.hs 47
-plusAddr addr off = wordPtrToAddr (addrToWordPtr addr `plusWordPtr` intToWordPtr off)
+plusAddr (Addr addr) off = case unboxInt off of
+    off_ -> Addr (addr `plusWordPtr` intToPtr__ off_)
hunk ./lib/base/Jhc/Addr.hs 55
-foreign import primitive "Sx" intToWordPtr :: Int -> WordPtr
-
-foreign import primitive "zero" zeroWordPtr :: WordPtr
-foreign import primitive "Add" plusWordPtr :: WordPtr -> WordPtr -> WordPtr
+foreign import primitive "Sx" intToPtr__ :: Int__ -> BitsPtr_
hunk ./lib/base/Jhc/Addr.hs 57
-foreign import primitive "box" boxAddr :: Addr__ -> Addr
+foreign import primitive "Add" plusWordPtr :: BitsPtr_ -> BitsPtr_ -> BitsPtr_
hunk ./lib/base/Jhc/Addr.hs 60
-ptrFromAddr__ addr = Ptr (boxAddr addr)
+ptrFromAddr__ addr = Ptr (Addr addr)
hunk ./lib/base/Jhc/Order.m4 1
+m4_divert(-1)
+m4_dnl simple macros for defining instances for classes in Jhc.Order
+
+m4_define(BOXBOOL,{{ONCE({{
+foreign import primitive "box" boxBool :: Bool__ -> Bool
+}})}})
+
+m4_define(INST_EQ,{{
+instance Eq $1 where
+    $1 x == $1 y = boxBool (equals$2 x y)
+    $1 x /= $1 y = boxBool (nequals$2 x y)
+ONCE({{
+foreign import primitive "Eq" equals$2 :: $2 -> $2 -> Bool__
+foreign import primitive "NEq" nequals$2 :: $2 -> $2 -> Bool__
+}})
+BOXBOOL()
+}})
+
+
+m4_define(INST_ORDER,{{
+instance Ord $1 where
+    $1 x < $1 y = boxBool (lt$2 x y)
+    $1 x > $1 y = boxBool (gt$2 x y)
+    $1 x <= $1 y = boxBool (lte$2 x y)
+    $1 x >= $1 y = boxBool (gte$2 x y)
+ONCE({{
+foreign import primitive "$3Lt" lt$3$2   :: $2 -> $2 -> Bool__
+foreign import primitive "$3Lte" lte$3$2 :: $2 -> $2 -> Bool__
+foreign import primitive "$3Gt" gt$3$2   :: $2 -> $2 -> Bool__
+foreign import primitive "$3Gte" gte$3$2 :: $2 -> $2 -> Bool__
+}})
+BOXBOOL()
+}})
+
+m4_define(INST_EQORDER,{{INST_EQ($1,$2)INST_ORDER($1,$2,$3)}})
+
+m4_divert
+
+