@@ -18,6 +18,12 @@ pub(super) struct CoverageCounters {
18
18
function_source_hash : u64 ,
19
19
next_counter_id : CounterId ,
20
20
next_expression_id : ExpressionId ,
21
+
22
+ /// Expression nodes that are not directly associated with any particular
23
+ /// BCB/edge, but are needed as operands to more complex expressions.
24
+ /// These are always `CoverageKind::Expression`.
25
+ pub ( super ) intermediate_expressions : Vec < CoverageKind > ,
26
+
21
27
pub debug_counters : DebugCounters ,
22
28
}
23
29
@@ -27,6 +33,9 @@ impl CoverageCounters {
27
33
function_source_hash,
28
34
next_counter_id : CounterId :: START ,
29
35
next_expression_id : ExpressionId :: START ,
36
+
37
+ intermediate_expressions : Vec :: new ( ) ,
38
+
30
39
debug_counters : DebugCounters :: new ( ) ,
31
40
}
32
41
}
@@ -38,13 +47,13 @@ impl CoverageCounters {
38
47
}
39
48
40
49
/// Makes `CoverageKind` `Counter`s and `Expressions` for the `BasicCoverageBlock`s directly or
41
- /// indirectly associated with `CoverageSpans`, and returns additional `Expression`s
50
+ /// indirectly associated with `CoverageSpans`, and accumulates additional `Expression`s
42
51
/// representing intermediate values.
43
52
pub fn make_bcb_counters (
44
53
& mut self ,
45
54
basic_coverage_blocks : & mut CoverageGraph ,
46
55
coverage_spans : & [ CoverageSpan ] ,
47
- ) -> Result < Vec < CoverageKind > , Error > {
56
+ ) -> Result < ( ) , Error > {
48
57
MakeBcbCounters :: new ( self , basic_coverage_blocks) . make_bcb_counters ( coverage_spans)
49
58
}
50
59
@@ -134,13 +143,9 @@ impl<'a> MakeBcbCounters<'a> {
134
143
/// Returns any non-code-span expressions created to represent intermediate values (such as to
135
144
/// add two counters so the result can be subtracted from another counter), or an Error with
136
145
/// message for subsequent debugging.
137
- fn make_bcb_counters (
138
- & mut self ,
139
- coverage_spans : & [ CoverageSpan ] ,
140
- ) -> Result < Vec < CoverageKind > , Error > {
146
+ fn make_bcb_counters ( & mut self , coverage_spans : & [ CoverageSpan ] ) -> Result < ( ) , Error > {
141
147
debug ! ( "make_bcb_counters(): adding a counter or expression to each BasicCoverageBlock" ) ;
142
148
let num_bcbs = self . basic_coverage_blocks . num_nodes ( ) ;
143
- let mut collect_intermediate_expressions = Vec :: with_capacity ( num_bcbs) ;
144
149
145
150
let mut bcbs_with_coverage = BitSet :: new_empty ( num_bcbs) ;
146
151
for covspan in coverage_spans {
@@ -161,16 +166,10 @@ impl<'a> MakeBcbCounters<'a> {
161
166
while let Some ( bcb) = traversal. next ( self . basic_coverage_blocks ) {
162
167
if bcbs_with_coverage. contains ( bcb) {
163
168
debug ! ( "{:?} has at least one `CoverageSpan`. Get or make its counter" , bcb) ;
164
- let branching_counter_operand =
165
- self . get_or_make_counter_operand ( bcb, & mut collect_intermediate_expressions) ?;
169
+ let branching_counter_operand = self . get_or_make_counter_operand ( bcb) ?;
166
170
167
171
if self . bcb_needs_branch_counters ( bcb) {
168
- self . make_branch_counters (
169
- & mut traversal,
170
- bcb,
171
- branching_counter_operand,
172
- & mut collect_intermediate_expressions,
173
- ) ?;
172
+ self . make_branch_counters ( & mut traversal, bcb, branching_counter_operand) ?;
174
173
}
175
174
} else {
176
175
debug ! (
@@ -182,7 +181,7 @@ impl<'a> MakeBcbCounters<'a> {
182
181
}
183
182
184
183
if traversal. is_complete ( ) {
185
- Ok ( collect_intermediate_expressions )
184
+ Ok ( ( ) )
186
185
} else {
187
186
Error :: from_string ( format ! (
188
187
"`TraverseCoverageGraphWithLoops` missed some `BasicCoverageBlock`s: {:?}" ,
@@ -196,7 +195,6 @@ impl<'a> MakeBcbCounters<'a> {
196
195
traversal : & mut TraverseCoverageGraphWithLoops ,
197
196
branching_bcb : BasicCoverageBlock ,
198
197
branching_counter_operand : Operand ,
199
- collect_intermediate_expressions : & mut Vec < CoverageKind > ,
200
198
) -> Result < ( ) , Error > {
201
199
let branches = self . bcb_branches ( branching_bcb) ;
202
200
debug ! (
@@ -232,17 +230,10 @@ impl<'a> MakeBcbCounters<'a> {
232
230
counter",
233
231
branch, branching_bcb
234
232
) ;
235
- self . get_or_make_counter_operand (
236
- branch. target_bcb ,
237
- collect_intermediate_expressions,
238
- ) ?
233
+ self . get_or_make_counter_operand ( branch. target_bcb ) ?
239
234
} else {
240
235
debug ! ( " {:?} has multiple incoming edges, so adding an edge counter" , branch) ;
241
- self . get_or_make_edge_counter_operand (
242
- branching_bcb,
243
- branch. target_bcb ,
244
- collect_intermediate_expressions,
245
- ) ?
236
+ self . get_or_make_edge_counter_operand ( branching_bcb, branch. target_bcb ) ?
246
237
} ;
247
238
if let Some ( sumup_counter_operand) =
248
239
some_sumup_counter_operand. replace ( branch_counter_operand)
@@ -258,7 +249,7 @@ impl<'a> MakeBcbCounters<'a> {
258
249
self . format_counter( & intermediate_expression)
259
250
) ;
260
251
let intermediate_expression_operand = intermediate_expression. as_operand ( ) ;
261
- collect_intermediate_expressions . push ( intermediate_expression) ;
252
+ self . coverage_counters . intermediate_expressions . push ( intermediate_expression) ;
262
253
some_sumup_counter_operand. replace ( intermediate_expression_operand) ;
263
254
}
264
255
}
@@ -290,18 +281,13 @@ impl<'a> MakeBcbCounters<'a> {
290
281
Ok ( ( ) )
291
282
}
292
283
293
- fn get_or_make_counter_operand (
294
- & mut self ,
295
- bcb : BasicCoverageBlock ,
296
- collect_intermediate_expressions : & mut Vec < CoverageKind > ,
297
- ) -> Result < Operand , Error > {
298
- self . recursive_get_or_make_counter_operand ( bcb, collect_intermediate_expressions, 1 )
284
+ fn get_or_make_counter_operand ( & mut self , bcb : BasicCoverageBlock ) -> Result < Operand , Error > {
285
+ self . recursive_get_or_make_counter_operand ( bcb, 1 )
299
286
}
300
287
301
288
fn recursive_get_or_make_counter_operand (
302
289
& mut self ,
303
290
bcb : BasicCoverageBlock ,
304
- collect_intermediate_expressions : & mut Vec < CoverageKind > ,
305
291
debug_indent_level : usize ,
306
292
) -> Result < Operand , Error > {
307
293
// If the BCB already has a counter, return it.
@@ -354,15 +340,13 @@ impl<'a> MakeBcbCounters<'a> {
354
340
let first_edge_counter_operand = self . recursive_get_or_make_edge_counter_operand (
355
341
predecessors. next ( ) . unwrap ( ) ,
356
342
bcb,
357
- collect_intermediate_expressions,
358
343
debug_indent_level + 1 ,
359
344
) ?;
360
345
let mut some_sumup_edge_counter_operand = None ;
361
346
for predecessor in predecessors {
362
347
let edge_counter_operand = self . recursive_get_or_make_edge_counter_operand (
363
348
predecessor,
364
349
bcb,
365
- collect_intermediate_expressions,
366
350
debug_indent_level + 1 ,
367
351
) ?;
368
352
if let Some ( sumup_edge_counter_operand) =
@@ -380,7 +364,7 @@ impl<'a> MakeBcbCounters<'a> {
380
364
self . format_counter( & intermediate_expression)
381
365
) ;
382
366
let intermediate_expression_operand = intermediate_expression. as_operand ( ) ;
383
- collect_intermediate_expressions . push ( intermediate_expression) ;
367
+ self . coverage_counters . intermediate_expressions . push ( intermediate_expression) ;
384
368
some_sumup_edge_counter_operand. replace ( intermediate_expression_operand) ;
385
369
}
386
370
}
@@ -403,32 +387,21 @@ impl<'a> MakeBcbCounters<'a> {
403
387
& mut self ,
404
388
from_bcb : BasicCoverageBlock ,
405
389
to_bcb : BasicCoverageBlock ,
406
- collect_intermediate_expressions : & mut Vec < CoverageKind > ,
407
390
) -> Result < Operand , Error > {
408
- self . recursive_get_or_make_edge_counter_operand (
409
- from_bcb,
410
- to_bcb,
411
- collect_intermediate_expressions,
412
- 1 ,
413
- )
391
+ self . recursive_get_or_make_edge_counter_operand ( from_bcb, to_bcb, 1 )
414
392
}
415
393
416
394
fn recursive_get_or_make_edge_counter_operand (
417
395
& mut self ,
418
396
from_bcb : BasicCoverageBlock ,
419
397
to_bcb : BasicCoverageBlock ,
420
- collect_intermediate_expressions : & mut Vec < CoverageKind > ,
421
398
debug_indent_level : usize ,
422
399
) -> Result < Operand , Error > {
423
400
// If the source BCB has only one successor (assumed to be the given target), an edge
424
401
// counter is unnecessary. Just get or make a counter for the source BCB.
425
402
let successors = self . bcb_successors ( from_bcb) . iter ( ) ;
426
403
if successors. len ( ) == 1 {
427
- return self . recursive_get_or_make_counter_operand (
428
- from_bcb,
429
- collect_intermediate_expressions,
430
- debug_indent_level + 1 ,
431
- ) ;
404
+ return self . recursive_get_or_make_counter_operand ( from_bcb, debug_indent_level + 1 ) ;
432
405
}
433
406
434
407
// If the edge already has a counter, return it.
0 commit comments