Skip to content

Commit 08c7b2f

Browse files
committed
Improved support for coverpoint filtering in genhtml; filters are
applied to both baseline and current data. See #314 Signed-off-by: Henry Cox <[email protected]>
1 parent c062292 commit 08c7b2f

File tree

4 files changed

+170
-162
lines changed

4 files changed

+170
-162
lines changed

bin/genhtml

Lines changed: 68 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -1961,124 +1961,32 @@ sub nextDate
19611961

19621962
package ReadBaselineSource;
19631963

1964+
use base 'ReadCurrentSource';
1965+
19641966
sub new
19651967
{
19661968
my ($class, $diffData) = @_;
19671969

1968-
my $self = [$diffData, ReadCurrentSource->new()];
1969-
bless $self, $class;
1970+
my $self = $class->SUPER::new();
1971+
push(@$self, $diffData);
1972+
19701973
return $self;
19711974
}
19721975

19731976
sub open
19741977
{
19751978
my ($self, $filename) = @_;
1979+
my $diffmap = $self->[1];
1980+
if (defined($diffmap) && $diffmap->containsFile($filename)) {
1981+
# if there are any diffs, then need to load the current source, then
1982+
# walk the diff to insert and remove changed lines
19761983

1977-
$self->[1]->open($filename, "baseline ");
1978-
$self->[1]->notEmpty() or
1979-
die("unable to read baseline '$filename'");
1980-
$self->[2] = $filename;
1981-
}
1982-
1983-
sub close
1984-
{
1985-
my $self = shift;
1986-
$self->[1]->close();
1987-
}
1988-
1989-
sub notEmpty
1990-
{
1991-
my $self = shift;
1992-
return $self->[1]->notEmpty();
1993-
}
1994-
1995-
sub isOutOfRange
1996-
{
1997-
my $self = shift;
1998-
return $self->[1]->isOutOfRange(@_);
1999-
}
2000-
2001-
sub isExcluded
2002-
{
2003-
my $self = shift;
2004-
return $self->[1]->isExcluded(@_);
2005-
}
2006-
2007-
sub filename
2008-
{
2009-
return $_[0]->[2];
2010-
}
2011-
2012-
sub getLine
2013-
{
2014-
my ($self, $line) = @_;
2015-
my ($map, $reader, $filename) = @$self;
2016-
my $type = $map->type($filename, $map->OLD, $line);
2017-
if ($type ne 'delete') {
2018-
my $currLine = $map->lookup($filename, $map->OLD, $line);
2019-
return $reader->getLine($currLine);
2020-
} else {
2021-
# deleted line...we don't really care what it looked like
2022-
# return empty - so the line gets treated as not conditional
2023-
return undef;
1984+
my $currentSrc = $self->_load($filename, 'baseline');
1985+
my $src = $diffmap->recreateBaseline($filename, $currentSrc);
1986+
return $self->parseLines($filename, $src);
20241987
}
2025-
}
2026-
2027-
sub isCharacter
2028-
{
2029-
my $self = shift;
2030-
return $self->[1]->isCharacter(@_);
2031-
}
2032-
2033-
sub isCloseBrace
2034-
{
2035-
my ($self, $line) = @_;
2036-
my ($map, $reader, $filename) = @$self;
2037-
my $type = $map->type($filename, $map->OLD, $line);
2038-
if ($type ne 'delete') {
2039-
my $currLine = $map->lookup($filename, $map->OLD, $line);
2040-
return $reader->isCloseBrace($currLine);
2041-
} else {
2042-
return 0;
2043-
}
2044-
}
2045-
2046-
sub containsConditional
2047-
{
2048-
my ($self, $line) = @_;
2049-
my ($map, $reader, $filename) = @$self;
2050-
my $type = $map->type($filename, $map->OLD, $line);
2051-
if ($type ne 'delete') {
2052-
my $currLine = $map->lookup($filename, $map->OLD, $line);
2053-
return $reader->containsConditional($currLine);
2054-
} else {
2055-
return 1; # we don't know - so just go with what gcov said
2056-
}
2057-
}
2058-
2059-
sub containsTrivialFunction
2060-
{
2061-
my ($self, $line) = @_;
2062-
my ($map, $reader, $filename) = @$self;
2063-
my $type = $map->type($filename, $map->OLD, $line);
2064-
if ($type ne 'delete') {
2065-
my $currLine = $map->lookup($filename, $map->OLD, $line);
2066-
return $reader->containsTrivialFunction($currLine);
2067-
} else {
2068-
return 0; # we don't know - assume not
2069-
}
2070-
}
2071-
2072-
sub suppressCloseBrace
2073-
{
2074-
my $self = shift;
2075-
return $self->[1]->isCharacter(@_);
2076-
}
2077-
2078-
sub isBlank
2079-
{
2080-
my $self = shift;
2081-
return $self->[1]->isBlank(@_);
1988+
# else no diff data here - just read the file
1989+
return ReadCurrentSource::open($self, $filename, 'baseline');
20821990
}
20831991

20841992
package LineData;
@@ -3176,15 +3084,16 @@ package DiffMap;
31763084
# that would be more consistent and might execute faster.
31773085

31783086
use constant {
3179-
LINEMAP => 0,
3180-
FILEMAP => 1,
3087+
LINEMAP => 0,
3088+
FILEMAP => 1,
3089+
BASELINE => 2,
31813090
# keep track of line number where file entry is found in diff file
31823091
# - use line number in error messages.
3183-
DIFF_FILENAME => 2,
3184-
LOCATION => 3,
3185-
UNCHANGED => 4,
3186-
ALIASES => 5,
3187-
DIFF_ROOT => 6,
3092+
DIFF_FILENAME => 3,
3093+
LOCATION => 4,
3094+
UNCHANGED => 5,
3095+
ALIASES => 6,
3096+
DIFF_ROOT => 7,
31883097

31893098
OLD => 0,
31903099
NEW => 1,
@@ -3199,6 +3108,7 @@ sub new
31993108
my $class = shift;
32003109
my $self = [{}, # linemap
32013110
{}, # filemap
3111+
{}, # baseline: filename -> baseline lineno -> text
32023112
undef, # diff filename
32033113
[{}, {}], # def location
32043114
# element 0: old filename -> line number where this
@@ -3297,6 +3207,32 @@ sub containsFile
32973207
return exists($self->[LINEMAP]->{$file});
32983208
}
32993209

3210+
sub recreateBaseline
3211+
{
3212+
my ($self, $filename, $currentSrcLines) = @_;
3213+
3214+
my $diffs = $self->[LINEMAP]->{$self->findName($filename)};
3215+
die("no diff data for $filename") unless defined $diffs;
3216+
3217+
my $deleted = $self->[BASELINE]->{$self->findName($filename)};
3218+
my @lines;
3219+
foreach my $chunk (@$diffs) {
3220+
if ($chunk->[TYPE] eq 'equal') {
3221+
my ($from, $to) = @{$chunk->[NEW]};
3222+
push(@lines, @{$currentSrcLines}[($from - 1) .. ($to - 1)]);
3223+
} elsif ($chunk->[TYPE] eq 'delete') {
3224+
my $r = $chunk->[OLD];
3225+
for (my $i = $r->[_START]; $i <= $r->[_END]; ++$i) {
3226+
die("missing baseline line $i")
3227+
unless defined($deleted) && exists($deleted->{$i});
3228+
push(@lines, $deleted->{$i});
3229+
}
3230+
}
3231+
# else 'insert': nothing to do/those lines are not in baseline
3232+
}
3233+
return \@lines;
3234+
}
3235+
33003236
sub lookup
33013237
{
33023238
my ($self, $file, $vers, $line) = @_;
@@ -3760,20 +3696,31 @@ sub _read_udiff
37603696
};
37613697
# Line as seen in old file
37623698
# <line starts with '-'>
3763-
/^-/ && do {
3699+
/^-(.*)$/ && do {
37643700
if ($old_block == 0 && $new_block == 0) {
37653701
last;
37663702
}
3703+
my $baseline_lineno = $chunk->[OLD]->[_END] + 1;
3704+
# really only need to keep track of baseline content if user
3705+
# is planning on doing any filtering
3706+
my $lines;
3707+
if (exists($self->[BASELINE]->{$file_old})) {
3708+
$lines = $self->[BASELINE]->{$file_old};
3709+
} else {
3710+
$lines = {};
3711+
$self->[BASELINE]->{$file_old} = $lines;
3712+
}
3713+
$lines->{$baseline_lineno} = $1;
3714+
37673715
if ($chunk->[TYPE] ne "delete") {
37683716
if ($filename) {
37693717
push(@{$self->[LINEMAP]->{$filename}}, $chunk);
37703718
_printChunk($chunk) if ($verbose);
37713719
}
3772-
$chunk = _newChunk('delete',
3773-
$chunk->[OLD]->[_END] + 1,
3720+
$chunk = _newChunk('delete', $baseline_lineno,
37743721
$chunk->[NEW]->[_END]);
37753722
} else {
3776-
$chunk->[OLD]->[_END] += 1;
3723+
$chunk->[OLD]->[_END] = $baseline_lineno;
37773724
}
37783725
last;
37793726
};
@@ -6824,11 +6771,11 @@ sub print_overall_rate($$$$$)
68246771
sub gen_html()
68256772
{
68266773
# "Read
6827-
my $readSourceFile = ReadCurrentSource->new();
68286774

68296775
# Read in all specified .info files
6830-
my $now = Time::HiRes::gettimeofday();
6831-
($current_data) = AggregateTraces::merge(@info_filenames);
6776+
my $now = Time::HiRes::gettimeofday();
6777+
my $readSourceFile = ReadCurrentSource->new();
6778+
($current_data) = AggregateTraces::merge($readSourceFile, @info_filenames);
68326779
my $then = Time::HiRes::gettimeofday();
68336780
$lcovutil::profileData{parse_current} = $then - $now;
68346781

@@ -6854,7 +6801,7 @@ sub gen_html()
68546801
# Read baseline file
68556802

68566803
$now = Time::HiRes::gettimeofday();
6857-
($base_data) = AggregateTraces::merge(@base_filenames);
6804+
($base_data) = AggregateTraces::merge($readBaseSource, @base_filenames);
68586805
info("Found %d baseline entries.\n", scalar($base_data->files()));
68596806
$then = Time::HiRes::gettimeofday();
68606807
$lcovutil::profileData{parse_baseline} = $then - $now;

bin/lcov

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,7 +1551,8 @@ sub add_traces()
15511551
my @merge = AggregateTraces::find_from_glob(@add_tracefile);
15521552
info(".. found " . scalar(@merge) . " files to aggregate.\n");
15531553

1554-
my ($total_trace, $effective) = AggregateTraces::merge(@merge);
1554+
my ($total_trace, $effective) =
1555+
AggregateTraces::merge(ReadCurrentSource->new(), @merge);
15551556

15561557
if ($AggregateTraces::function_mapping) {
15571558
return;
@@ -1587,8 +1588,9 @@ sub merge_traces($$)
15871588
' file' . (1 == scalar(@merge) ? '' : 's') . ' to ' .
15881589
($op == TraceInfo::INTERSECT ? 'intersect' : 'subtract') . ".\n");
15891590

1590-
my ($base) = AggregateTraces::merge(@data);
1591-
my ($merge) = AggregateTraces::merge(@merge);
1591+
my $srcReader = ReadCurrentSource->new();
1592+
my ($base) = AggregateTraces::merge($srcReader, @data);
1593+
my ($merge) = AggregateTraces::merge($srcReader, @merge);
15921594

15931595
my $interesting = $base->merge_tracefile($merge, $op);
15941596
# write the result
@@ -2591,7 +2593,8 @@ sub summary()
25912593
my @merge = AggregateTraces::find_from_glob(@opt_summary);
25922594
info(1, "Summarize " . scalar(@merge) . " files...\n");
25932595

2594-
my ($total, $effective) = AggregateTraces::merge(@merge);
2596+
my ($total, $effective) =
2597+
AggregateTraces::merge(ReadCurrentSource->new(), @merge);
25952598
return $total;
25962599
}
25972600

0 commit comments

Comments
 (0)