[unbox enumerated return types
John Meacham <john@repetae.net>**20060128034736] hunk ./C/FromGrin.hs 87
+convertExp (Store n@NodeV {}) = newNode n
+convertExp (Return n@NodeV {}) = newNode n
hunk ./C/FromGrin.hs 114
-    let tag = project' (name "any.tag") z'
+    let tag = project' anyTag z'
hunk ./C/FromGrin.hs 144
+anyTag = name "any.tag"
hunk ./C/FromGrin.hs 147
+newNode (NodeV t []) = do
+    tmp <- newVar pnode_t
+    var <- fetchVar t TyTag
+    let tmp' = project' anyTag tmp
+        malloc =  tmp `assign` jhc_malloc (sizeof  node_t)
+        tagassign = tmp' `assign` var
+    return (mappend malloc tagassign, tmp)
hunk ./C/FromGrin.hs 203
-convertBody (Return v :>>= (NodeC t as) :-> e') = do
-    v' <- convertVal v
-    let tmp = project' (nodeStructName t) v'
-    as' <- mapM convertVal as
-    let ass = [assign  a (project (arg i) tmp) | a <- as' | i <- [( 1 :: Int) ..] ]
-    ss' <- convertBody e'
-    return $  mconcat (ass ++ [ss'])
-convertBody (Fetch v :>>= (NodeC t as) :-> e') = do
-    v' <- convertVal v
-    let tmp = project' (nodeStructName t) v'
-    as' <- mapM convertVal as
-    let ass = [assign a (project (arg i) tmp) | a <- as' | i <- [(1 :: Int) ..] ]
-    ss' <- convertBody e'
-    return (mconcat ass `mappend` ss')
+
+convertBody (Return v :>>= (NodeC t as) :-> e') = nodeAssign v t as e'
+convertBody (Fetch v :>>= (NodeC t as) :-> e') = nodeAssign v t as e'
+convertBody (Return v :>>= (NodeV t []) :-> e') = nodeAssignV v t e'
+convertBody (Fetch v :>>= (NodeV t []) :-> e') = nodeAssignV v t e'
hunk ./C/FromGrin.hs 228
-    let tag = project' (name "any.tag") scrut
+    let tag = project' anyTag scrut
hunk ./C/FromGrin.hs 269
-convertBody' e todo = localTodo TodoReturn $ convertBody e
+nodeAssign v t as e' = do
+    v' <- convertVal v
+    let tmp = project' (nodeStructName t) v'
+    as' <- mapM convertVal as
+    let ass = [assign  a (project (arg i) tmp) | a <- as' | i <- [( 1 :: Int) ..] ]
+    ss' <- convertBody e'
+    return $  mconcat ass `mappend` ss'
+
+nodeAssignV v t e' = do
+    v' <- convertVal v
+    var <- fetchVar t TyTag
+    ss' <- convertBody e'
+    return $ assign var (project' anyTag v') `mappend` ss'
+
hunk ./C/FromGrin.hs 344
+
hunk ./C/Generate.hs 10
+    commaExpression,
hunk ./Grin/Grin.hs 48
+    itemTag,
hunk ./Grin/Grin.hs 538
-    freeVars (NodeV _ xs) = freeVars xs
+    freeVars (NodeV v xs) = Set.insert v $ freeVars xs
hunk ./Grin/Grin.hs 607
+itemTag = BasicValue TyTag
+
hunk ./Grin/Simplify.hs 45
+at_OptSimplifyEnumAssignment  = toAtom "Optimize.simplify.enum-assignment"
hunk ./Grin/Simplify.hs 105
+    gv (NodeV v [],Return (NodeC t' [])) = do
+            lift $ tick stats at_OptSimplifyEnumAssignment
+            gv (Var v TyTag, Return (Tag t'))
+    gv (NodeV v [],Return (NodeV v' [])) = do
+            lift $ tick stats at_OptSimplifyEnumAssignment
+            gv (Var v TyTag, Return (Var v' TyTag))
hunk ./Grin/Unboxing.hs 44
---unboxFunction fn (NodeValue vs) | all isEnum (Set.toList vs) = (unboxReturn, unboxCall, TyTag) where
---    unboxReturn (Return (NodeC t [])) = Return t
---    unboxReturn (App a as ty) | a == fn = App a as TyTag
---    unboxCall (App a as ty) = (App a as TyTag :>>= (Var v1 TyTag) :-> Return (NodeV v1 []))
+-- unbox enumerated types
+unboxFunction fn (NodeValue vs) | all isEnum (Set.toList vs) = return (unboxReturn, unboxCall, TyTag, itemTag) where
+    unboxReturn (Return (NodeC t [])) = Return (Tag t)
+    unboxReturn e = e :>>= nodev :-> Return var
+    unboxCall (App a as ty) = App a as TyTag :>>= var :-> Return nodev
+    var = Var v1 TyTag
+    nodev = NodeV v1 []
hunk ./Grin/Unboxing.hs 82
-    --putStrLn "Candidate Unboxings"
-    --mapM_ print cfns
-
-    let pf fn | Just item <- Map.lookup fn (grinReturnTags grin) =
+        pf fn | Just item <- Map.lookup fn (grinReturnTags grin) =