[improve handling of ValUnknown, when creating recursive cafs, put the right tag in directly rather than creating a hole
John Meacham <john@repetae.net>**20070227052320] hunk ./C/FromGrin.hs 248
-        ass = [ project (arg i) tmp' `assign` a | a <- as' | i <- [(1 :: Int) ..] ]
+        ass = [ if isValUnknown aa then mempty else project (arg i) tmp' `assign` a | a <- as' | aa <- as | i <- [(1 :: Int) ..] ]
hunk ./C/FromGrin.hs 255
+isValUnknown ValUnknown {} = True
+isValUnknown _ = False
+
hunk ./C/FromGrin2.hs 437
-newNode (NodeV t []) = do
-    tmp <- newVar pnode_t
-    var <- fetchVar t TyTag
-    let tmp' = getTag tmp
-        malloc =  tmp =* jhc_malloc (sizeof  node_t)
-        tagassign = tmp' =* var
-    return (mappend malloc tagassign, tmp)
+isValUnknown ValUnknown {} = True
+isValUnknown _ = False
+
hunk ./C/FromGrin2.hs 450
-        ass = [ project' (arg i) tmp' =* a | a <- as' | i <- [(1 :: Int) ..] ]
+        ass = [ if isValUnknown aa then mempty else project' i tmp' =* a | a <- as' | aa <- as | i <- map arg [(1 :: Int) ..] ]
hunk ./C/FromGrin2.hs 467
-        ass = [ project' (arg i) tmp' =* a | a <- as' | i <- [(1 :: Int) ..] ]
+        ass = [ if isValUnknown aa then mempty else project' i tmp' =* a | a <- as' | aa <- as | i <- map arg [(1 :: Int) ..] ]
hunk ./C/FromGrin2.hs 646
+newNode (NodeV t []) = do
+    tmp <- newVar pnode_t
+    var <- fetchVar t TyTag
+    let tmp' = getTag tmp
+        malloc =  tmp =* jhc_malloc (sizeof  node_t)
+        tagassign = tmp' =* var
+    return (mappend malloc tagassign, tmp)
hunk ./Grin/FromE.hs 620
-            let g (tvr,_) y = (Store (NodeC (toAtom "@hole") []) :>>= toVal tvr :-> y)
-                u (tvr,e) = do
+            let u [] ss dus = return (\y -> ss (dus y))
+                u ((tvr,e):rs) ss dus = do
hunk ./Grin/FromE.hs 625
-                    return $ doUpdate (toVal tvr) e
-            xs <- mapM u bs
+                    let (du,t,ts) = doUpdate (toVal tvr) e
+                    u rs (\y -> Store (NodeC t (map ValUnknown ts)) :>>= toVal tvr :-> ss y) (\y -> du :>>= unit :-> dus y)
+            rr <- u bs id id
hunk ./Grin/FromE.hs 629
-            let r = (foldr (\a b -> a :>>= unit :-> b) v xs)
-            return $ foldr g r bs
+            return (rr v)
hunk ./Grin/FromE.hs 632
-    doUpdate vr (Store n) = Update vr n
-    doUpdate vr (x :>>= v :-> e) = x :>>= v :-> doUpdate vr e
+    doUpdate vr (Store n@(NodeC t ts)) = (Update vr n,t,map getType ts)
+    doUpdate vr (x :>>= v :-> e) = let (du,t,ts) = doUpdate vr e in (x :>>= v :-> du,t,ts)
hunk ./Grin/Grin.hs 555
+    typecheck _ (ValUnknown ty) = return ty
hunk ./Grin/Linear.hs 86
+    omegaize ValUnknown {} = return ()
hunk ./Grin/PointsToAnalysis.hs 486
-    isHole (Con t _) | t == tagHole = True
-    isHole _ = False
+    --isHole (Con t _) | t == tagHole = True
+    --isHole _ = False
hunk ./Grin/PointsToAnalysis.hs 534
+    g Store { expValue = NodeC t vs } | any isValUnknown vs = do
+        newHeap RecursiveThunk mempty
hunk ./Grin/PointsToAnalysis.hs 583
+isValUnknown ValUnknown {} = True
+isValUnknown _ = False
+
hunk ./Grin/PointsToAnalysis.hs 601
+toPos ValUnknown {} = return mempty