[allow scrutinization of addresses to determine if they are null when using -fvia-ghc. clean up code before trying to convert it to ghc hs
John Meacham <john@repetae.net>**20061114061352] hunk ./E/ToHs.hs 4
+import Control.Monad.Identity
hunk ./E/ToHs.hs 16
+import E.FreeVars
hunk ./E/ToHs.hs 30
+import Support.FreeVars
hunk ./E/ToHs.hs 37
+
+-- | get rid of unused bindings
+cleanupE :: E -> E
+cleanupE e = runIdentity (f e) where
+    f (ELam t@TVr { tvrIdent = v } e) | v /= 0, v `notMember` freeIds e = f (ELam t { tvrIdent = 0 } e)
+    f (EPi t@TVr { tvrIdent = v } e) | v /= 0, v `notMember` freeIds e = f (EPi t { tvrIdent = 0 } e)
+    f ec@ECase { eCaseBind = t@TVr { tvrIdent = v } } | v /= 0, v `notMember` (freeVars (caseBodies ec)::IdSet) = f ec { eCaseBind = t { tvrIdent = 0 } }
+    f e = emapEG f f e
+
hunk ./E/ToHs.hs 49
-    (v,_,Coll { collNames = ns, collPrims = prims }) <- runRWST (fromTM $ transE (programE prog)) emptyEnvironment 1
+    (v,_,Coll { collNames = ns, collPrims = prims }) <- runRWST (fromTM $ transE (cleanupE $ programE prog)) emptyEnvironment 1
hunk ./E/ToHs.hs 244
+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 ./data/ViaGhc.hs 31
+
+scrutAddr :: Addr# -> Int#
+scrutAddr addr = if eqAddr# addr nullAddr# then 0# else 1#