X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=utils%2Fgenprimopcode%2FMain.hs;h=d228045ad945442e90dad1135f83654f4f7d66c7;hb=d7d755865a3849be26a468a3fa430ff96c8e9e0c;hp=8cfbed3d499159664aa6cc4e37baba5784b77359;hpb=07d1b116efe38566ef51286121da1fc60ef33b16;p=ghc-hetmet.git diff --git a/utils/genprimopcode/Main.hs b/utils/genprimopcode/Main.hs index 8cfbed3..d228045 100644 --- a/utils/genprimopcode/Main.hs +++ b/utils/genprimopcode/Main.hs @@ -190,7 +190,9 @@ gen_ext_core_source entries = ++ "-- This module is automatically generated by the GHC utility\n" ++ "-- \"genprimopcode\". Do not edit!\n" ++ "-----------------------------------------------------------------------\n" - ++ "module PrimEnv(primTcs, primVals) where\nimport Core\nimport Encoding\n\n" + ++ "module Language.Core.PrimEnv(primTcs, primVals, intLitTypes, ratLitTypes," + ++ "\n charLitTypes, stringLitTypes) where\nimport Language.Core.Core" + ++ "\nimport Language.Core.Encoding\n\n" ++ "primTcs :: [(Tcon, Kind)]\n" ++ "primTcs = [\n" ++ printList tcEnt entries @@ -198,7 +200,24 @@ gen_ext_core_source entries = ++ "primVals :: [(Var, Ty)]\n" ++ "primVals = [\n" ++ printList valEnt entries + ++ "]\n" + ++ "intLitTypes :: [Ty]\n" + ++ "intLitTypes = [\n" + ++ printList tyEnt (intLitTys entries) + ++ "]\n" + ++ "ratLitTypes :: [Ty]\n" + ++ "ratLitTypes = [\n" + ++ printList tyEnt (ratLitTys entries) + ++ "]\n" + ++ "charLitTypes :: [Ty]\n" + ++ "charLitTypes = [\n" + ++ printList tyEnt (charLitTys entries) + ++ "]\n" + ++ "stringLitTypes :: [Ty]\n" + ++ "stringLitTypes = [\n" + ++ printList tyEnt (stringLitTys entries) ++ "]\n\n" + where printList f = concat . intersperse ",\n" . filter (not . null) . map f tcEnt (PrimTypeSpec {ty=t}) = case t of @@ -253,20 +272,35 @@ gen_ext_core_source entries = tapp s nextArg = paren $ "Tapp " ++ s ++ " " ++ paren nextArg tcUTuple n = paren $ "Tcon " ++ paren (qualify False $ "Z" ++ show n ++ "H") - -- more hacks. might be better to do this on the ext-core side, - -- as per earlier comment - qualify _ tc | tc == "ByteArr#" = qualify True "ByteArray#" - qualify _ tc | tc == "MutArr#" = qualify True "MutableArray#" - qualify _ tc | tc == "MutByteArr#" = + + tyEnt (PrimTypeSpec {ty=(TyApp tc args)}) = " " ++ paren ("Tcon " ++ + (paren (qualify True tc))) + tyEnt _ = "" + + -- more hacks. might be better to do this on the ext-core side, + -- as per earlier comment + qualify _ tc | tc == "ByteArr#" = qualify True "ByteArray#" + qualify _ tc | tc == "MutArr#" = qualify True "MutableArray#" + qualify _ tc | tc == "MutByteArr#" = qualify True "MutableByteArray#" - qualify _ tc | tc == "Bool" = "Just boolMname" ++ ", " + qualify _ tc | tc == "Bool" = "Just boolMname" ++ ", " ++ ze True tc - qualify _ tc | tc == "()" = "Just baseMname" ++ ", " + qualify _ tc | tc == "()" = "Just baseMname" ++ ", " ++ ze True tc - qualify enc tc = "Just primMname" ++ ", " ++ (ze enc tc) - ze enc tc = (if enc then "zEncodeString " else "") + qualify enc tc = "Just primMname" ++ ", " ++ (ze enc tc) + ze enc tc = (if enc then "zEncodeString " else "") ++ "\"" ++ tc ++ "\"" + intLitTys = prefixes ["Int", "Word", "Addr", "Char"] + ratLitTys = prefixes ["Float", "Double"] + charLitTys = prefixes ["Char"] + stringLitTys = prefixes ["Addr"] + prefixes ps = filter (\ t -> + case t of + (PrimTypeSpec {ty=(TyApp tc args)}) -> + any (\ p -> p `isPrefixOf` tc) ps + _ -> False) + parens n ty = " (zEncodeString \"" ++ n ++ "\", " ++ ty ++ ")" paren s = "(" ++ s ++ ")" quot s = "\"" ++ s ++ "\"" @@ -547,7 +581,7 @@ mkPOI_RHS_text i ++ "(" ++ ppType resTy ++ ")" sl_name :: Entry -> String -sl_name i = "FSLIT(\"" ++ name i ++ "\") " +sl_name i = "(fsLit \"" ++ name i ++ "\") " ppTyVar :: String -> String ppTyVar "a" = "alphaTyVar"