X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=CoreTools.hs;h=0c0e1fa7f60d88cd3914b9fcf1c3b20073c3a8ff;hb=b8c1e8554ba8aee73bc9d9a54bb3cb32f7930957;hp=443586b946f6b3ce904d090ed3d1a66aaae75d5f;hpb=c0b63b2aae039cecafb06bbcf63e50ee0359709b;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/CoreTools.hs b/CoreTools.hs index 443586b..0c0e1fa 100644 --- a/CoreTools.hs +++ b/CoreTools.hs @@ -6,6 +6,7 @@ module CoreTools where --Standard modules import qualified Maybe +import System.IO.Unsafe -- GHC API import qualified GHC @@ -14,6 +15,7 @@ import qualified TcType import qualified HsExpr import qualified HsTypes import qualified HsBinds +import qualified HscTypes import qualified RdrName import qualified Name import qualified OccName @@ -36,12 +38,12 @@ import Pretty -- | Evaluate a core Type representing type level int from the tfp -- library to a real int. -eval_tfp_int :: Type.Type -> Int -eval_tfp_int ty = +eval_tfp_int :: HscTypes.HscEnv -> Type.Type -> Int +eval_tfp_int env ty = unsafeRunGhc $ do + GHC.setSession env -- Automatically import modules for any fully qualified identifiers setDynFlag DynFlags.Opt_ImplicitImportQualified - --setDynFlag DynFlags.Opt_D_dump_if_trace let from_int_t_name = mkRdrName "Types.Data.Num" "fromIntegerT" let from_int_t = SrcLoc.noLoc $ HsExpr.HsVar from_int_t_name @@ -49,20 +51,18 @@ eval_tfp_int ty = let app = SrcLoc.noLoc $ HsExpr.HsApp (from_int_t) (undef) let int_ty = SrcLoc.noLoc $ HsTypes.HsTyVar TysWiredIn.intTyCon_RDR let expr = HsExpr.ExprWithTySig app int_ty - let foo_name = mkRdrName "Types.Data.Num" "foo" - let foo_bind_name = RdrName.mkRdrUnqual $ OccName.mkVarOcc "foo" - let binds = Bag.listToBag [SrcLoc.noLoc $ HsBinds.VarBind foo_bind_name (SrcLoc.noLoc $ HsExpr.HsVar foo_name)] - let letexpr = HsExpr.HsLet - (HsBinds.HsValBinds $ (HsBinds.ValBindsIn binds) []) - (SrcLoc.noLoc expr) - - let modules = map GHC.mkModuleName ["Types.Data.Num"] - core <- toCore modules expr + core <- toCore expr execCore core +normalise_tfp_int :: HscTypes.HscEnv -> Type.Type -> Type.Type +normalise_tfp_int env ty = + unsafePerformIO $ do + nty <- normaliseType env ty + return nty + -- | Get the width of a SizedWord type -sized_word_len :: Type.Type -> Int -sized_word_len ty = eval_tfp_int (sized_word_len_ty ty) +-- sized_word_len :: HscTypes.HscEnv -> Type.Type -> Int +-- sized_word_len env ty = eval_tfp_int env (sized_word_len_ty ty) sized_word_len_ty :: Type.Type -> Type.Type sized_word_len_ty ty = len @@ -73,8 +73,8 @@ sized_word_len_ty ty = len [len] = args -- | Get the width of a SizedInt type -sized_int_len :: Type.Type -> Int -sized_int_len ty = eval_tfp_int (sized_int_len_ty ty) +-- sized_int_len :: HscTypes.HscEnv -> Type.Type -> Int +-- sized_int_len env ty = eval_tfp_int env (sized_int_len_ty ty) sized_int_len_ty :: Type.Type -> Type.Type sized_int_len_ty ty = len @@ -85,8 +85,8 @@ sized_int_len_ty ty = len [len] = args -- | Get the upperbound of a RangedWord type -ranged_word_bound :: Type.Type -> Int -ranged_word_bound ty = eval_tfp_int (ranged_word_bound_ty ty) +-- ranged_word_bound :: HscTypes.HscEnv -> Type.Type -> Int +-- ranged_word_bound env ty = eval_tfp_int env (ranged_word_bound_ty ty) ranged_word_bound_ty :: Type.Type -> Type.Type ranged_word_bound_ty ty = len @@ -113,8 +113,8 @@ ranged_word_bound_ty ty = len -- execCore core -- | Get the length of a FSVec type -tfvec_len :: Type.Type -> Int -tfvec_len ty = eval_tfp_int (tfvec_len_ty ty) +-- tfvec_len :: HscTypes.HscEnv -> Type.Type -> Int +-- tfvec_len env ty = eval_tfp_int env (tfvec_len_ty ty) tfvec_len_ty :: Type.Type -> Type.Type tfvec_len_ty ty = len @@ -133,14 +133,6 @@ tfvec_elem ty = el_ty Nothing -> error $ "\nCoreTools.tfvec_len: Not a vector type: " ++ (pprString ty) [len, el_ty] = args --- Is this a wild binder? -is_wild :: CoreSyn.CoreBndr -> Bool --- wild binders have a particular unique, that we copied from MkCore.lhs to --- here. However, this comparison didn't work, so we'll just check the --- occstring for now... TODO ---(Var.varUnique bndr) == (Unique.mkBuiltinUnique 1) -is_wild bndr = "wild" == (OccName.occNameString . Name.nameOccName . Var.varName) bndr - -- Is the given core expression a lambda abstraction? is_lam :: CoreSyn.CoreExpr -> Bool is_lam (CoreSyn.Lam _ _) = True @@ -215,4 +207,4 @@ getLiterals :: CoreSyn.CoreExpr -> [CoreSyn.CoreExpr] getLiterals app@(CoreSyn.App _ _) = literals where (CoreSyn.Var f, args) = CoreSyn.collectArgs app - literals = filter (is_lit) args \ No newline at end of file + literals = filter (is_lit) args