X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FdeSugar%2FDsExpr.lhs;h=4163559959ba85d351f14e8a6f5a61009b05fb23;hb=e1f7582a9d9f4112bec7b92a61c7f2366ab91666;hp=2bb2cc43db1f3e3c7682ae10279c38007fbc209f;hpb=d5934bbb856aa0aa620c9b2e0fa51c90a1a5a048;p=ghc-hetmet.git diff --git a/compiler/deSugar/DsExpr.lhs b/compiler/deSugar/DsExpr.lhs index 2bb2cc4..4163559 100644 --- a/compiler/deSugar/DsExpr.lhs +++ b/compiler/deSugar/DsExpr.lhs @@ -9,15 +9,7 @@ Desugaring exporessions. module DsExpr ( dsExpr, dsLExpr, dsLocalBinds, dsValBinds, dsLit ) where #include "HsVersions.h" -#if defined(GHCI) && defined(BREAKPOINT) -import Foreign.StablePtr -import GHC.Exts -import IOEnv -import PrelNames -import TysWiredIn -import TypeRep -import TyCon -#endif + import Match import MatchLit @@ -29,6 +21,7 @@ import DsArrows import DsMonad #ifdef GHCI +import PrelNames -- Template Haskell stuff iff bootstrapped import DsMeta #endif @@ -179,6 +172,7 @@ scrungleMatch var scrut body | x == var = Case scrut bndr ty alts scrungle (Let binds body) = Let binds (scrungle body) scrungle other = panic ("scrungleMatch: tuple pattern:\n" ++ showSDoc (ppr other)) + \end{code} %************************************************************************ @@ -189,17 +183,17 @@ scrungleMatch var scrut body \begin{code} dsLExpr :: LHsExpr Id -> DsM CoreExpr + dsLExpr (L loc e) = putSrcSpanDs loc $ dsExpr e dsExpr :: HsExpr Id -> DsM CoreExpr - dsExpr (HsPar e) = dsLExpr e dsExpr (ExprWithTySigOut e _) = dsLExpr e dsExpr (HsVar var) = returnDs (Var var) dsExpr (HsIPVar ip) = returnDs (Var (ipNameName ip)) dsExpr (HsLit lit) = dsLit lit dsExpr (HsOverLit lit) = dsOverLit lit -dsExpr (HsWrap co_fn e) = dsCoercion co_fn (dsExpr e) +dsExpr (HsWrap co_fn e) = dsCoercion co_fn (dsExpr e) dsExpr (NegApp expr neg_expr) = do { core_expr <- dsLExpr expr @@ -210,41 +204,10 @@ dsExpr expr@(HsLam a_Match) = matchWrapper LambdaExpr a_Match `thenDs` \ (binders, matching_code) -> returnDs (mkLams binders matching_code) -#if defined(GHCI) && defined(BREAKPOINT) -dsExpr (HsApp (L _ (HsApp realFun@(L _ (HsWrap _ fun)) (L loc arg))) _) - | HsVar funId <- fun - , idName funId `elem` [breakpointJumpName, breakpointCondJumpName] - , ids <- filter (isValidType . idType) (extractIds arg) - = do warnDs (text "Extracted ids:" <+> ppr ids <+> ppr (map idType ids)) - stablePtr <- ioToIOEnv $ newStablePtr ids - -- Yes, I know... I'm gonna burn in hell. - let Ptr addr# = castStablePtrToPtr stablePtr - funCore <- dsLExpr realFun - argCore <- dsLExpr (L loc (HsLit (HsInt (fromIntegral (I# (addr2Int# addr#)))))) - hvalCore <- dsLExpr (L loc (extractHVals ids)) - return ((funCore `App` argCore) `App` hvalCore) - where extractIds :: HsExpr Id -> [Id] - extractIds (HsApp fn arg) - | HsVar argId <- unLoc arg - = argId:extractIds (unLoc fn) - | HsWrap co_fn arg' <- unLoc arg - , HsVar argId <- arg' -- SLPJ: not sure what is going on here - = error (showSDoc (ppr co_fn)) -- argId:extractIds (unLoc fn) - extractIds x = [] - extractHVals ids = ExplicitList unitTy (map (L loc . HsVar) ids) - -- checks for tyvars and unlifted kinds. - isValidType (TyVarTy _) = False - isValidType (FunTy a b) = isValidType a && isValidType b - isValidType (NoteTy _ t) = isValidType t - isValidType (AppTy a b) = isValidType a && isValidType b - isValidType (TyConApp con ts) = not (isUnLiftedTyCon con) && all isValidType ts - isValidType _ = True -#endif - dsExpr expr@(HsApp fun arg) = dsLExpr fun `thenDs` \ core_fun -> dsLExpr arg `thenDs` \ core_arg -> - returnDs (core_fun `App` core_arg) + returnDs (core_fun `mkDsApp` core_arg) \end{code} Operator sections. At first it looks as if we can convert @@ -274,12 +237,12 @@ dsExpr (OpApp e1 op _ e2) -- for the type of y, we need the type of op's 2nd argument dsLExpr e1 `thenDs` \ x_core -> dsLExpr e2 `thenDs` \ y_core -> - returnDs (mkApps core_op [x_core, y_core]) + returnDs (mkDsApps core_op [x_core, y_core]) dsExpr (SectionL expr op) -- Desugar (e !) to ((!) e) = dsLExpr op `thenDs` \ core_op -> dsLExpr expr `thenDs` \ x_core -> - returnDs (App core_op x_core) + returnDs (mkDsApp core_op x_core) -- dsLExpr (SectionR op expr) -- \ x -> op x expr dsExpr (SectionR op expr) @@ -294,7 +257,7 @@ dsExpr (SectionR op expr) newSysLocalDs y_ty `thenDs` \ y_id -> returnDs (bindNonRec y_id y_core $ - Lam x_id (mkApps core_op [Var x_id, Var y_id])) + Lam x_id (mkDsApps core_op [Var x_id, Var y_id])) dsExpr (HsSCC cc expr) = dsLExpr expr `thenDs` \ core_expr -> @@ -313,8 +276,10 @@ dsExpr (HsCase discrim matches) matchWrapper CaseAlt matches `thenDs` \ ([discrim_var], matching_code) -> returnDs (scrungleMatch discrim_var core_discrim matching_code) +-- Pepe: The binds are in scope in the body but NOT in the binding group +-- This is to avoid silliness in breakpoints dsExpr (HsLet binds body) - = dsLExpr body `thenDs` \ body' -> + = dsLExpr body `thenDs` \ body' -> dsLocalBinds binds body' -- We need the `ListComp' form to use `deListComp' (rather than the "do" form) @@ -443,7 +408,7 @@ We also handle @C{}@ as valid construction syntax for an unlabelled constructor @C@, setting all of @C@'s fields to bottom. \begin{code} -dsExpr (RecordCon (L _ data_con_id) con_expr rbinds) +dsExpr (RecordCon (L _ data_con_id) con_expr (HsRecordBinds rbinds)) = dsExpr con_expr `thenDs` \ con_expr' -> let (arg_tys, _) = tcSplitFunTys (exprType con_expr') @@ -491,10 +456,10 @@ might do some argument-evaluation first; and may have to throw away some dictionaries. \begin{code} -dsExpr (RecordUpd record_expr [] record_in_ty record_out_ty) +dsExpr (RecordUpd record_expr (HsRecordBinds []) record_in_ty record_out_ty) = dsLExpr record_expr -dsExpr expr@(RecordUpd record_expr rbinds record_in_ty record_out_ty) +dsExpr expr@(RecordUpd record_expr (HsRecordBinds rbinds) record_in_ty record_out_ty) = dsLExpr record_expr `thenDs` \ record_expr' -> -- Desugar the rbinds, and generate let-bindings if @@ -574,9 +539,9 @@ dsExpr (HsProc pat cmd) = dsProcExpr pat cmd Hpc Support \begin{code} -dsExpr (HsTick ix e) = do +dsExpr (HsTick ix vars e) = do e' <- dsLExpr e - mkTickBox ix e' + mkTickBox ix vars e' -- There is a problem here. The then and else branches -- have no free variables, so they are open to lifting. @@ -627,14 +592,15 @@ dsDo stmts body result_ty go (LetStmt binds : stmts) = do { rest <- go stmts ; dsLocalBinds binds rest } - + go (BindStmt pat rhs bind_op fail_op : stmts) - = do { body <- go stmts + = + do { body <- go stmts ; var <- selectSimpleMatchVarL pat ; match <- matchSinglePat (Var var) (StmtCtxt DoExpr) pat result_ty (cantFailMatchResult body) ; match_code <- handle_failure pat match fail_op - ; rhs' <- dsLExpr rhs + ; rhs' <- dsLExpr rhs ; bind_op' <- dsExpr bind_op ; returnDs (mkApps bind_op' [rhs', Lam var match_code]) }