X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FdeSugar%2FDsUtils.lhs;h=3f340911e70336da6365ce9b400c83084b1f71ea;hb=a8427a4125e9b78e88a487eeabf018f1c6e8bc08;hp=455db042f927bbe19b04b922ef8b196a2059ab87;hpb=3bdbcf162f78f28d3d50d30456aced559473b878;p=ghc-hetmet.git diff --git a/compiler/deSugar/DsUtils.lhs b/compiler/deSugar/DsUtils.lhs index 455db04..3f34091 100644 --- a/compiler/deSugar/DsUtils.lhs +++ b/compiler/deSugar/DsUtils.lhs @@ -69,6 +69,8 @@ import SrcLoc import Util import ListSetOps import FastString +import StaticFlags + import Data.Char infixl 4 `mkDsApp`, `mkDsApps` @@ -240,7 +242,7 @@ worthy of a type synonym and a few handy functions. \begin{code} firstPat :: EquationInfo -> Pat Id -firstPat eqn = head (eqn_pats eqn) +firstPat eqn = ASSERT( notNull (eqn_pats eqn) ) head (eqn_pats eqn) shiftEqns :: [EquationInfo] -> [EquationInfo] -- Drop the first pattern in each equation @@ -355,8 +357,8 @@ mkCoAlgCaseMatchResult var ty match_alts -- the scrutinised Id to be sufficiently refined to have a TyCon in it] -- Stuff for newtype - (con1, arg_ids1, match_result1) = head match_alts - arg_id1 = head arg_ids1 + (con1, arg_ids1, match_result1) = ASSERT( notNull match_alts ) head match_alts + arg_id1 = ASSERT( notNull arg_ids1 ) head arg_ids1 var_ty = idType var (tc, ty_args) = splitNewTyConApp var_ty newtype_rhs = unwrapNewTypeBody tc ty_args (Var var) @@ -645,7 +647,7 @@ mkSelectorBinds pat val_expr is_simple_lpat p = is_simple_pat (unLoc p) is_simple_pat (TuplePat ps Boxed _) = all is_triv_lpat ps - is_simple_pat (ConPatOut{ pat_args = ps }) = all is_triv_lpat (hsConArgs ps) + is_simple_pat (ConPatOut{ pat_args = ps }) = all is_triv_lpat (hsConPatArgs ps) is_simple_pat (VarPat _) = True is_simple_pat (ParPat p) = is_simple_lpat p is_simple_pat other = False @@ -934,23 +936,29 @@ mkFailurePair expr \end{code} \begin{code} -mkOptTickBox :: Maybe Int -> CoreExpr -> DsM CoreExpr +mkOptTickBox :: Maybe (Int,[Id]) -> CoreExpr -> DsM CoreExpr mkOptTickBox Nothing e = return e -mkOptTickBox (Just ix) e = mkTickBox ix e +mkOptTickBox (Just (ix,ids)) e = mkTickBox ix ids e -mkTickBox :: Int -> CoreExpr -> DsM CoreExpr -mkTickBox ix e = do +mkTickBox :: Int -> [Id] -> CoreExpr -> DsM CoreExpr +mkTickBox ix vars e = do uq <- newUnique mod <- getModuleDs - let tick = mkTickBoxOpId uq mod ix + let tick | opt_Hpc = mkTickBoxOpId uq mod ix + | otherwise = mkBreakPointOpId uq mod ix uq2 <- newUnique let occName = mkVarOcc "tick" - let name = mkInternalName uq2 occName noSrcLoc -- use mkSysLocal? + let name = mkInternalName uq2 occName noSrcSpan -- use mkSysLocal? let var = Id.mkLocalId name realWorldStatePrimTy - return $ Case (Var tick) - var - ty - [(DEFAULT,[],e)] + scrut <- + if opt_Hpc + then return (Var tick) + else do + let tickVar = Var tick + let tickType = mkFunTys (map idType vars) realWorldStatePrimTy + let scrutApTy = App tickVar (Type tickType) + return (mkApps scrutApTy (map Var vars) :: Expr Id) + return $ Case scrut var ty [(DEFAULT,[],e)] where ty = exprType e @@ -960,10 +968,10 @@ mkBinaryTickBox ixT ixF e = do uq <- newUnique mod <- getModuleDs let bndr1 = mkSysLocal FSLIT("t1") uq boolTy - falseBox <- mkTickBox ixF $ Var falseDataConId - trueBox <- mkTickBox ixT $ Var trueDataConId + falseBox <- mkTickBox ixF [] $ Var falseDataConId + trueBox <- mkTickBox ixT [] $ Var trueDataConId return $ Case e bndr1 boolTy [ (DataAlt falseDataCon, [], falseBox) , (DataAlt trueDataCon, [], trueBox) ] -\end{code} \ No newline at end of file +\end{code}