X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FcoreSyn%2FMkExternalCore.lhs;h=8ad5c7f1850c34400c72bca61bfb6b85c7630f99;hb=550421384b8364cdaf3135f7859c9f7d7ee1fff1;hp=569655c727a190b327610914cbd4c96f02f372e4;hpb=6c2e162376df87192b7a65461f452a776e7f5116;p=ghc-hetmet.git diff --git a/ghc/compiler/coreSyn/MkExternalCore.lhs b/ghc/compiler/coreSyn/MkExternalCore.lhs index 569655c..8ad5c7f 100644 --- a/ghc/compiler/coreSyn/MkExternalCore.lhs +++ b/ghc/compiler/coreSyn/MkExternalCore.lhs @@ -18,6 +18,7 @@ import TyCon import Class import TypeRep import Type +import PprExternalCore -- Instances import DataCon ( DataCon, dataConExistentialTyVars, dataConRepArgTys, dataConName, dataConWrapId_maybe ) import CoreSyn @@ -26,15 +27,12 @@ import IdInfo import Id ( idUnfolding ) import CoreTidy ( tidyExpr ) import VarEnv ( emptyTidyEnv ) -import TysPrim ( intPrimTy ) import Literal import Name -import CostCentre import Outputable import ForeignCall -import PprExternalCore import CmdLineOpts -import Maybes ( orElse, catMaybes ) +import Maybes ( mapCatMaybes ) import IO import FastString @@ -74,11 +72,11 @@ mkExternalCore (ModGuts {mg_module=this_mod, mg_types = type_env, mg_binds = bin other_implicit_binds = map get_defn (concatMap other_implicit_ids (typeEnvElts type_env)) implicit_con_ids :: TyThing -> [Id] -implicit_con_ids (ATyCon tc) | isAlgTyCon tc = catMaybes (map dataConWrapId_maybe (tyConDataCons tc)) +implicit_con_ids (ATyCon tc) | isAlgTyCon tc = mapCatMaybes dataConWrapId_maybe (tyConDataCons tc) implicit_con_ids other = [] other_implicit_ids :: TyThing -> [Id] -other_implicit_ids (ATyCon tc) = tyConSelIds tc ++ tyConGenIds tc +other_implicit_ids (ATyCon tc) = tyConSelIds tc other_implicit_ids (AClass cl) = classSelIds cl other_implicit_ids other = [] @@ -97,6 +95,7 @@ collect_tdefs tcon tdefs where tdef | isNewTyCon tcon = C.Newtype (make_con_qid (tyConName tcon)) (map make_tbind tyvars) repclause + | null (tyConDataCons tcon) = error "MkExternalCore died: can't handle datatype declarations with no data constructors" | otherwise = C.Data (make_con_qid (tyConName tcon)) (map make_tbind tyvars) (map make_cdef (tyConDataCons tcon)) where repclause | isRecursiveTyCon tcon = Nothing @@ -110,7 +109,7 @@ collect_tdefs _ tdefs = tdefs make_cdef :: DataCon -> C.Cdef make_cdef dcon = C.Constr dcon_name existentials tys where - dcon_name = make_con_qid (dataConName dcon) + dcon_name = make_var_id (dataConName dcon) existentials = map make_tbind ex_tyvars ex_tyvars = dataConExistentialTyVars dcon tys = map make_ty (dataConRepArgTys dcon) @@ -126,7 +125,8 @@ make_vdef b = case b of NonRec v e -> C.Nonrec (f (v,e)) Rec ves -> C.Rec (map f ves) - where f (v,e) = (make_var_qid (Var.varName v), make_ty (varType v),make_exp e) + where f (v,e) = (make_var_id (Var.varName v), make_ty (varType v),make_exp e) + -- Top level bindings are unqualified now make_exp :: CoreExpr -> C.Exp make_exp (Var v) = @@ -136,7 +136,7 @@ make_exp (Var v) = FCallId (CCall (CCallSpec (StaticTarget nm) _ _)) -> C.External (unpackFS nm) (make_ty (varType v)) FCallId _ -> error "MkExternalCore died: can't handle non-static-C foreign call" _ -> C.Var (make_var_qid (Var.varName v)) -make_exp (Lit (l@(MachLabel s _))) = C.External (unpackFS s) (make_ty (literalType l)) +make_exp (Lit (l@(MachLabel s _))) = error "MkExternalCore died: can't handle \"foreign label\" declarations" make_exp (Lit l) = C.Lit (make_lit l) make_exp (App e (Type t)) = C.Appt (make_exp e) (make_ty t) make_exp (App e1 e2) = C.App (make_exp e1) (make_exp e2) @@ -164,9 +164,7 @@ make_alt (DEFAULT,[],e) = C.Adefault (make_exp e) make_lit :: Literal -> C.Lit make_lit l = case l of - MachChar i | i <= 0xff -> C.Lchar (chr i) t - MachChar i | otherwise -> C.Lint (toEnum i) (make_ty intPrimTy) - -- For 'big' characters, use an integer + MachChar i -> C.Lchar i t MachStr s -> C.Lstring (unpackFS s) t MachNullAddr -> C.Lint 0 t MachInt i -> C.Lint i t @@ -187,7 +185,7 @@ make_ty (ForAllTy tv t) = C.Tforall (make_tbind tv) (make_ty t) make_ty (TyConApp tc ts) = foldl C.Tapp (C.Tcon (make_con_qid (tyConName tc))) (map make_ty ts) -- The special case for newtypes says "do not expand newtypes". --- Reason: sourceTypeRep does substitution and, while substitution deals +-- Reason: predTypeRep does substitution and, while substitution deals -- correctly with name capture, it's only correct if you see the uniques! -- If you just see occurrence names, name capture may occur. -- Example: newtype A a = A (forall b. b -> a) @@ -198,11 +196,11 @@ make_ty (TyConApp tc ts) = foldl C.Tapp (C.Tcon (make_con_qid (tyConName tc))) -- expose the representation in interface files, which definitely isn't right. -- Maybe CoreTidy should know whether to expand newtypes or not? -make_ty (SourceTy (NType tc ts)) = foldl C.Tapp (C.Tcon (make_con_qid (tyConName tc))) +make_ty (NewTcApp tc ts) = foldl C.Tapp (C.Tcon (make_con_qid (tyConName tc))) (map make_ty ts) -make_ty (SourceTy p) = make_ty (sourceTypeRep p) -make_ty (NoteTy _ t) = make_ty t +make_ty (PredTy p) = make_ty (predTypeRep p) +make_ty (NoteTy _ t) = make_ty t