X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FTest-Valgrind.git;a=blobdiff_plain;f=lib%2FTest%2FValgrind%2FCommand%2FPerl.pm;h=99882955724f14a298f0791d62bc8721a9ee8b76;hp=494c1442a77da7c46a630b9de2792c22e395b1e3;hb=b34179155630f5f4cbea1749af4054a746ded9a4;hpb=77d53e292f2fdac4991d1d6c140f1edd79ff3afa diff --git a/lib/Test/Valgrind/Command/Perl.pm b/lib/Test/Valgrind/Command/Perl.pm index 494c144..9988295 100644 --- a/lib/Test/Valgrind/Command/Perl.pm +++ b/lib/Test/Valgrind/Command/Perl.pm @@ -9,11 +9,11 @@ Test::Valgrind::Command::Perl - A Test::Valgrind command that invokes perl. =head1 VERSION -Version 1.13 +Version 1.17 =cut -our $VERSION = '1.13'; +our $VERSION = '1.17'; =head1 DESCRIPTION @@ -22,6 +22,7 @@ It handles the suppression generation and sets the main command-line flags. =cut +use List::Util (); use Env::Sanctify (); use Test::Valgrind::Suppressions; @@ -186,15 +187,64 @@ sub suppressions_tag { return $self->{suppressions_tag}; } +sub check_suppressions_file { + my ($self, $file) = @_; + + { + open my $fh, '<', $file or return 0; + + local $_; + while (<$fh>) { + return 1 if /^\s*fun:(Perl|S|XS)_/ + or /^\s*obj:.*perl/; + } + + close $fh; + } + + return 0; +} + sub filter { my ($self, $session, $report) = @_; return $report if $report->is_diag or not $report->isa('Test::Valgrind::Report::Suppressions'); - my $data = $report->data; - $data =~ s/[^\r\n]*\bPerl_runops_(?:standard|debug)\b.*//s; - $data = Test::Valgrind::Suppressions->strip_tail($session, $data); + my @frames = grep length, split /\n/, $report->data; + + # If we see the runloop, match from here. + my $top = List::Util::first(sub { + $frames[$_] =~ /^\s*fun:Perl_runops_(?:standard|debug)\b/ + }, 0 .. $#frames); + --$top if $top; + + unless (defined $top) { + # Otherwise, match from the latest Perl_ symbol. + $top = List::Util::first(sub { + $frames[$_] =~ /^\s*fun:Perl_/ + }, reverse 0 .. $#frames); + } + + unless (defined $top) { + # Otherwise, match from the latest S_ symbol. + $top = List::Util::first(sub { + $frames[$_] =~ /^\s*fun:S_/ + }, reverse 0 .. $#frames); + } + + unless (defined $top) { + # Otherwise, match from the latest XS_ symbol. + $top = List::Util::first(sub { + $frames[$_] =~ /^\s*fun:XS_/ + }, reverse 0 .. $#frames); + } + + $#frames = $top if defined $top; + + my $data = join "\n", @frames, ''; + + $data = Test::Valgrind::Suppressions->maybe_generalize($session, $data); $report->new( id => $report->id, @@ -239,7 +289,7 @@ You can find documentation for this module with the perldoc command. =head1 COPYRIGHT & LICENSE -Copyright 2009,2010,2011,2013 Vincent Pit, all rights reserved. +Copyright 2009,2010,2011,2013,2015 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. @@ -260,11 +310,11 @@ eval { XSLoader::load('Test::Valgrind', $Test::Valgrind::VERSION); }; -unless ($@) { - Test::Valgrind::notleak("valgrind it!"); -} else { +if ($@) { diag $@; *Test::Valgrind::DEBUGGING = sub { 'unknown' }; +} else { + Test::Valgrind::notleak("valgrind it!"); } plan tests => 1;