[add conversions to and from word from address, add Peek, Poke, and sizeof primitives. get rid of special case of testing for the NULL Addr#
John Meacham <john@repetae.net>**20061206070234] hunk ./E/ToHs.hs 66
-cTypeInfo "HsPtr" =  ("Addr#","Ptr","Ptr ()")
-cTypeInfo "HsFunPtr" =  ("Addr#","Ptr","Ptr ()")
+cTypeInfo "HsPtr" =  ("Addr#","Ptr","(Ptr ())")
+cTypeInfo "HsFunPtr" =  ("Addr#","Ptr","(Ptr ())")
hunk ./E/ToHs.hs 265
-transE ECase { eCaseBind = TVr { tvrIdent = 0 }, eCaseScrutinee = scrut, eCaseDefault = Just md, eCaseAlts = as@[Alt (LitInt 0 (ELit LitCons { litName = n })) _] } | n == rt_HsPtr = mparen $ do
-    scrut <- transE scrut
-    md <- noParens $ transE md
-    let md' =  text "_" <+> text "->" <+> md
-    as <- mapM (transAlt False undefined) as
-    let alts = as ++ [md']
-    return (text "case" <+> text "scrutAddr" <+> scrut <+> text "of {" $$ nest 4  (vcat (punctuate semi alts)) $$ text "}")
hunk ./E/ToHs.hs 289
+transE (EPrim (APrim CConst { primConst = ('"':rs) } _) [] _) = return (text ('"':rs) <> text "#")
+transE (EPrim (APrim PrimTypeInfo { primArgType = at, primTypeInfo = c }  _) [] _) = ans where
+    Just pi = primitiveInfo at
+    ans = case c of
+        PrimSizeOf -> return $ tshow (primTypeSizeOf pi) <> char '#'
+
+transE (EPrim (APrim Peek { primArgType = at } _) [w,x] _) = mparen ans where
+    ans = do
+        w <- transE w
+        x <- transE x
+        return (text func <+> x <+> text "0#" <+> w)
+    (tt,_,_) = cTypeInfo at
+    Just pi = primitiveInfo at
+    size = primTypeSizeOf pi * 8
+    sign = primTypeIsSigned pi
+    func = case tt of
+        "Char#" -> "readWideCharOffAddr#"
+        "Addr#" -> "readAddrOffAddr#"
+        "Int#" -> "readInt" ++ show size ++ "OffAddr#"
+        "Word#" -> "readWord" ++ show size ++ "OffAddr#"
+transE (EPrim (APrim Poke { primArgType = at } _) [w,ptr,v] _) = mparen ans where
+    ans = do
+        w <- transE w
+        ptr <- transE ptr
+        v <- transE v
+        return (text func <+> ptr <+> text "0#" <+> v <+> w)
+    Just pi = primitiveInfo at
+    size = primTypeSizeOf pi * 8
+    sign = primTypeIsSigned pi
+    (tt,_,_) = cTypeInfo at
+    func = case tt of
+        "Char#" -> "writeWideCharOffAddr#"
+        "Addr#" -> "writeAddrOffAddr#"
+        "Int#" -> "writeInt" ++ show size ++ "OffAddr#"
+        "Word#" -> "writeWord" ++ show size ++ "OffAddr#"
hunk ./E/ToHs.hs 342
+    ("Addr#","Word#") -> return (text "int2Word#" <+> parens (text "addr2Int#" <+> x))
+    ("Word#","Addr#") -> return (text "int2Addr#" <+> parens (text "word2Int#" <+> x))
hunk ./E/ToHs.hs 419
-transAlt dobind b (Alt (LitInt num t) e) | t == tCharzh || t == rawType "wchar_t" = do
-    e <- noParens $ transE e
-    return ( (if dobind then b <> char '@' else empty) <> text (show $ chr $ fromIntegral num) <> text "#" <+> text "->" <+> e)
hunk ./E/ToHs.hs 422
-    if t == "Int#" then
-        return ( (if dobind then b <> char '@' else empty) <> tshow i <> text "#" <+> text "->" <+> e)
-     else do
-        let bvar = if dobind then b else text "_bvar"
-            Just eq = op2TableCmp ("==",t)
-        v <- transE (ELit (LitInt i tt))
-        return ( bvar <+> text "|" <+> text eq <+> bvar <+> v <+> text "->" <+> e)
+    case t of
+        "Int#" -> return $ (if dobind then b <> char '@' else empty) <> tshow i <> text "#" <+> text "->" <+> e
+        "Char#" -> return $ (if dobind then b <> char '@' else empty) <> text (show $ chr $ fromIntegral i) <> text "#" <+> text "->" <+> e
+        _ -> do
+            let bvar = if dobind then b else text "_bvar"
+                Just eq = op2TableCmp ("==",t)
+            v <- transE (ELit (LitInt i tt))
+            return (bvar <+> text "|" <+> text eq <+> bvar <+> v <+> text "->" <+> e)
hunk ./data/ViaGhc.hs 38
-
-scrutAddr :: Addr# -> Int#
-scrutAddr addr = if eqAddr# addr nullAddr# then 0# else 1#