=head1 VERSION
-Version 1.15
+Version 1.18
=cut
-our $VERSION = '1.15';
+our $VERSION = '1.18';
=head1 DESCRIPTION
return $status;
}
-=head2 C<strip_tail>
+=head2 C<maybe_generalize>
- my $mangled_suppression = Test::Valgrind::Suppressions->strip_tail(
+ my $mangled_suppression = Test::Valgrind::Suppressions->maybe_generalize(
$session,
$suppression,
);
Removes all wildcard frames at the end of the suppression.
-Moreover, C<'...'> is appended when C<valgrind> C<3.4.0> or higher is used.
+It also replaces sequences of wildcard frames by C<'...'> when C<valgrind> C<3.4.0> or higher is used.
Returns the mangled suppression.
=cut
-sub strip_tail {
+sub maybe_generalize {
shift;
my ($sess, $supp) = @_;
1 while $supp =~ s/[^\r\n]*:\s*\*\s*$//;
+
# With valgrind 3.4.0, we can replace unknown series of frames by '...'
- if ($sess->version ge '3.4.0') {
- 1 while $supp =~ s/[^\r\n]*\.{3}\s*$//;
- $supp .= "...\n";
+ my $can_ellipsis = $sess->version >= '3.4.0';
+
+ my $did_length_check;
+
+ ELLIPSIS: {
+ if ($can_ellipsis) {
+ $supp .= "...\n";
+ $supp =~ s/(?:^\s*(?:\.{3}|\*:\S*|obj:\*)\s*(?:\n|\z))+/...\n/mg;
+ }
+
+ last if $did_length_check++;
+
+ my $frames_count =()= $supp =~ m/^(?:(?:obj|fun|\*):|\.{3}\s*$)/mg;
+ if ($frames_count > 24) {
+ # Keep only 24 frames, and even sacrifice one more if we can do ellipsis.
+ my $last = $can_ellipsis ? 23 : 24;
+ my $len = length $supp;
+ $supp =~ m/^(?:(?:obj|fun|\*):\S*|\.{3})\s*\n/mg for 1 .. $last;
+ my $p = pos $supp;
+ substr $supp, $p, $len - $p, '';
+ redo ELLIPSIS if $can_ellipsis;
+ }
}
$supp;