X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FdeSugar%2FCoverage.lhs;h=f46d9cd23a17a4cfdb5913446f98b1d8a352ab4c;hb=72fbfd1c72d4b3b331e201289ef2ce98d848d879;hp=e56f231eb16f22d57c88b3f2738034ddde91f0ac;hpb=ff8e1d01524b48e028b09e2b04b2e5303cb6d95f;p=ghc-hetmet.git diff --git a/compiler/deSugar/Coverage.lhs b/compiler/deSugar/Coverage.lhs index e56f231..f46d9cd 100644 --- a/compiler/deSugar/Coverage.lhs +++ b/compiler/deSugar/Coverage.lhs @@ -70,11 +70,11 @@ addCoverageTicksToBinds dflags mod mod_loc binds = do (TTE { modName = mod_name , declPath = [] + , inScope = emptyVarSet }) (TT { tickBoxCount = 0 , mixEntries = [] - , inScope = emptyVarSet }) let entries = reverse $ mixEntries st @@ -177,10 +177,13 @@ addTickLHsBind (VarBind var_id var_rhs) = do -} addTickLHsBind other = return other --- add a tick to the expression no matter what it is +-- Add a tick to the expression no matter what it is. There is one exception: +-- for the debugger, if the expression is a 'let', then we don't want to add +-- a tick here because there will definititely be a tick on the body anyway. addTickLHsExprAlways :: LHsExpr Id -> TM (LHsExpr Id) -addTickLHsExprAlways (L pos e0) = do - allocTickBox (ExpBox False) pos $ addTickHsExpr e0 +addTickLHsExprAlways (L pos e0) + | not opt_Hpc, HsLet _ _ <- e0 = addTickLHsExprNever (L pos e0) + | otherwise = allocTickBox (ExpBox False) pos $ addTickHsExpr e0 addTickLHsExprNeverOrAlways :: LHsExpr Id -> TM (LHsExpr Id) addTickLHsExprNeverOrAlways e @@ -273,10 +276,10 @@ addTickHsExpr (HsIf e1 e2 e3) = (addTickLHsExprOptAlt True e2) (addTickLHsExprOptAlt True e3) addTickHsExpr (HsLet binds e) = + bindLocals (map unLoc $ collectLocalBinders binds) $ liftM2 HsLet - (addTickHsLocalBinds binds) -- to think about: !patterns. - (bindLocals (map unLoc $ collectLocalBinders binds) $ - addTickLHsExprNeverOrAlways e) + (addTickHsLocalBinds binds) -- to think about: !patterns. + (addTickLHsExprNeverOrAlways e) addTickHsExpr (HsDo cxt stmts last_exp srcloc) = do (stmts', last_exp') <- addTickLStmts' forQual stmts (addTickLHsExpr last_exp) @@ -513,11 +516,11 @@ addTickArithSeqInfo (FromThenTo e1 e2 e3) = \begin{code} data TickTransState = TT { tickBoxCount:: Int , mixEntries :: [MixEntry] - , inScope :: VarSet -- move the TickTransEnv } data TickTransEnv = TTE { modName :: String , declPath :: [String] + , inScope :: VarSet } -- deriving Show @@ -550,17 +553,12 @@ instance Monad TM where (r2,fv2,st2) -> (r2, fv1 `plusOccEnv` fv2, st2) -getState :: TM TickTransState -getState = TM $ \ env st -> (st, noFVs, st) +-- getState :: TM TickTransState +-- getState = TM $ \ env st -> (st, noFVs, st) setState :: (TickTransState -> TickTransState) -> TM () setState f = TM $ \ env st -> ((), noFVs, f st) -withState :: (TickTransState -> TickTransState) -> TM a -> TM a -withState f (TM m) = TM $ \ env st -> - case m env (f st) of - (a, fvs, st') -> (a, fvs, st') - getEnv :: TM TickTransEnv getEnv = TM $ \ env st -> (env, noFVs, st) @@ -575,7 +573,7 @@ getFreeVars (TM m) freeVar :: Id -> TM () freeVar id = TM $ \ env st -> - if id `elemVarSet` inScope st + if id `elemVarSet` inScope env then ((), unitOccEnv (nameOccName (idName id)) id, st) else ((), noFVs, st) @@ -588,7 +586,7 @@ getPathEntry = declPath `liftM` getEnv bindLocals :: [Id] -> TM a -> TM a bindLocals new_ids (TM m) = TM $ \ env st -> - case m env st{ inScope = inScope st `extendVarSetList` new_ids } of + case m env{ inScope = inScope env `extendVarSetList` new_ids } st of (r, fv, st') -> (r, fv `delListFromUFM` occs, st') where occs = [ nameOccName (idName id) | id <- new_ids ]