Skip to content

Commit 839d2d3

Browse files
committed
Address review comments
1 parent 8d2cb5e commit 839d2d3

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed

Diff for: lib/Echidna/Exec.hs

+5-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Echidna.Exec where
77
import Optics.Core
88
import Optics.State.Operators
99

10-
import Control.Monad (when, forM_)
10+
import Control.Monad (when)
1111
import Control.Monad.Catch (MonadThrow(..))
1212
import Control.Monad.State.Strict (MonadState(get, put), execState, runStateT, MonadIO(liftIO), gets, modify', execStateT)
1313
import Control.Monad.Reader (MonadReader, ask, asks)
@@ -292,18 +292,16 @@ execTxWithCov tx = do
292292
let size = BS.length . forceBuf . fromJust . view bytecode $ contract
293293
if size == 0 then pure Nothing else do
294294
-- IO for making a new vec
295-
vec <- VMut.new size
296295
-- We use -1 for opIx to indicate that the location was not covered
297-
forM_ [0..size-1] $ \i -> VMut.write vec i (-1, 0, 0)
296+
vec <- VMut.replicate size (-1, 0, 0)
298297
pure $ Just vec
299298

300299
statsRef <- getTLS env.statsRef
301300
maybeStatsVec <- lookupUsingCodehashOrInsert env.codehashMap contract env.dapp statsRef $ do
302301
let size = BS.length . forceBuf . fromJust . view bytecode $ contract
303302
if size == 0 then pure Nothing else do
304303
-- IO for making a new vec
305-
vec <- VMut.new size
306-
forM_ [0..size-1] $ \i -> VMut.write vec i (0, 0)
304+
vec <- VMut.replicate size (0, 0)
307305
pure $ Just vec
308306

309307
case maybeCovVec of
@@ -320,7 +318,8 @@ execTxWithCov tx = do
320318
(_, depths, results) | depth < 64 && not (depths `testBit` depth) -> do
321319
VMut.write vec pc (opIx, depths `setBit` depth, results `setBit` fromEnum Stop)
322320
writeIORef covContextRef (True, Just (vec, pc))
323-
_ -> modifyIORef' covContextRef $ \(new, _) -> (new, Just (vec, pc))
321+
_ ->
322+
modifyIORef' covContextRef $ \(new, _) -> (new, Just (vec, pc))
324323

325324
-- | Get the VM's current execution location
326325
currentCovLoc vm = (vm.state.pc, fromMaybe 0 $ vmOpIx vm, length vm.frames)

Diff for: lib/Echidna/Output/Source.hs

+4-4
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ zipSumStats v1 v2 = do
4242
vec2 <- v2
4343
return [(exec1 + exec2, revert1 + revert2) | (exec1, revert1) <- vec1 | (exec2, revert2) <- vec2]
4444

45-
mvToList :: (VU.Unbox a) => VU.IOVector a -> IO [a]
46-
mvToList = fmap U.toList . U.freeze
47-
4845
combineStats :: TLS (IORef StatsMap) -> IO StatsMapV
4946
combineStats statsRef = do
5047
threadStats' <- allTLS statsRef
5148
threadStats <- mapM readIORef threadStats' :: IO [StatsMap]
52-
statsLists <- pure $ map (\(m :: StatsMap) -> Map.map (\(x :: VU.IOVector StatsInfo) -> mvToList x) m) threadStats :: IO [Map EVM.Types.W256 (IO [StatsInfo])]
49+
let statsLists = map (Map.map mvToList) threadStats :: [Map EVM.Types.W256 (IO [StatsInfo])]
5350
traverse (U.fromList <$>) $ Map.unionsWith zipSumStats statsLists
51+
where
52+
mvToList :: (VU.Unbox a) => VU.IOVector a -> IO [a]
53+
mvToList = fmap U.toList . U.freeze
5454

5555
saveCoverages
5656
:: Env

Diff for: lib/Echidna/Types/Coverage.hs

+3
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ type CoverageMap = Map W256 (IOVector CoverageInfo)
2020

2121
-- | Map with the statistic information needed for source code printing.
2222
-- Indexed by contracts' compile-time codehash; see `CodehashMap`.
23+
-- Used during runtime data collection
2324
type StatsMap = Map W256 (IOVector StatsInfo)
2425

2526
-- | Map with the statistic information needed for source code printing.
2627
-- Indexed by contracts' compile-time codehash; see `CodehashMap`.
28+
-- Used during statistics summarization (combining multiple `StatsMap`)
29+
-- and coverage report generation.
2730
type StatsMapV = Map W256 (Vector StatsInfo)
2831

2932
-- | Basic coverage information

0 commit comments

Comments
 (0)