[add support for Data.IORef
John Meacham <john@repetae.net>**20061109070219] hunk ./Grin/FromE.hs 378
-    ce (EPrim ap@(APrim (PrimPrim "writeRef__") _) [r,v,_] _) = do
-        let var = Var v2 TyNode
-            [r',v'] = args [r,v]
-        return $ Update r' (NodeC (toAtom "CData.IORef.IORef") [v'])
hunk ./Grin/FromE.hs 381
+    ce (EPrim ap@(APrim (PrimPrim "newRef__") _) [v,_] _) = do
+        let [v'] = args [v]
+            var = Var v2 (TyPtr TyNode)
+        return $ Store (NodeC (convertName dc_Ref) [v']) :>>= var :-> Store (NodeC (convertName dc_IORef) [var])
+        --return $ Alloc { expValue = NodeC (convertName dc_Ref) [v'], expCount = toUnVal (1 :: Int), expRegion = region_heap, expInfo = mempty } :>>= var :-> Store (NodeC (convertName dc_IORef) [var])
+    ce (EPrim ap@(APrim (PrimPrim "readRef__") _) [r,_] _) = do
+        let [r'] = args [r]
+            var = Var v2 (TyPtr TyNode)
+            var' = Var v3 (TyPtr TyNode)
+        return $ gEval r' :>>= NodeC (convertName dc_IORef) [var] :-> Fetch var :>>= NodeC (convertName dc_Ref) [var'] :-> Return var'
+    ce (EPrim ap@(APrim (PrimPrim "writeRef__") _) [r,v,_] _) = do
+        let var = Var v2 (TyPtr TyNode)
+            [r',v'] = args [r,v]
+        return $ gEval r' :>>= NodeC (convertName dc_IORef) [var] :-> Update var (NodeC (convertName dc_Ref) [v'])
hunk ./Grin/Grin.hs 509
+        return (TyPtr t)
+    typecheck te Alloc { expValue = v } = do
+        t <- typecheck te v
hunk ./Grin/Noodle.hs 11
+import Grin.Val
+import Name.Names
hunk ./Grin/Noodle.hs 99
-isMutableNodeTag t = t == ref_tag where ref_tag = toAtom "CData.IORef.IORef"
+isMutableNodeTag t = t ==  convertName dc_Ref
hunk ./Grin/Whiz.hs 187
+    f e@Alloc { expValue = v, expCount = c } = do
+        v <- g v
+        c <- g c
+        return e { expValue = v, expCount = c }
hunk ./Name/Names.hs 68
+dc_IORef = toName DataConstructor ("Data.IORef","IORef")
+dc_Ref = toName DataConstructor ("Data.IORef","Ref")
hunk ./lib/base/Data/IORef.hs 14
-import Jhc.Addr
hunk ./lib/base/Data/IORef.hs 15
-newtype IORef a = IORef Addr
+data IORef a = IORef (Ref a)
+data Ref a = Ref a
hunk ./lib/base/Data/IORef.hs 23
+{-# NOINLINE newIORef #-}
hunk ./lib/base/Data/IORef.hs 28
+{-# NOINLINE readIORef #-}
hunk ./lib/base/Data/IORef.hs 32
+{-# NOINLINE writeIORef #-}
hunk ./lib/base/Data/IORef.hs 43
+{-# NOINLINE modifyIORef #-}
hunk ./lib/base/Data/IORef.hs 49
+{-# NOINLINE atomicModifyIORef #-}