]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/blobdiff - lib/Test/Valgrind/Parser/Suppressions/Text.pm
This is 1.17
[perl/modules/Test-Valgrind.git] / lib / Test / Valgrind / Parser / Suppressions / Text.pm
index 03a9556a1dc070477511c088ca439788a93dea6e..90cbea9aa22945a66dbb63d035c85bdf0a60d7dd 100644 (file)
@@ -9,19 +9,21 @@ Test::Valgrind::Parser::Suppressions::Text - Parse valgrind suppressions output
 
 =head1 VERSION
 
-Version 1.10
+Version 1.17
 
 =cut
 
-our $VERSION = '1.10';
+our $VERSION = '1.17';
 
 =head1 DESCRIPTION
 
-This is a L<Test::Valgrind::Parser> object that can extract suppressions from C<valgrind>'s text output.
+This is a L<Test::Valgrind::Parser::Text> object that can extract suppressions from C<valgrind>'s text output.
 
 =cut
 
-use base qw/Test::Valgrind::Parser::Text Test::Valgrind::Carp/;
+use Test::Valgrind::Suppressions;
+
+use base qw<Test::Valgrind::Parser::Text Test::Valgrind::Carp>;
 
 =head1 METHODS
 
@@ -34,12 +36,6 @@ Their C<data> member contains the raw text of the suppression.
 
 sub report_class { 'Test::Valgrind::Report::Suppressions' }
 
-=head2 C<parse $session, $fh>
-
-Parses the filehandle C<$fh> fed with the output of F<valgrind --gen-suppressions=all> and sends a report to the session C<$session> for each suppression.
-
-=cut
-
 sub parse {
  my ($self, $sess, $fh) = @_;
 
@@ -49,8 +45,13 @@ sub parse {
  while (<$fh>) {
   s/^\s*#\s//;        # Strip comments
 
-  next if /^==/;      # Valgrind info line
-  next if /valgrind/; # and /\Q$file\E/;
+  if (/^==/) {        # Valgrind info line
+   if (/Signal 11 being dropped from thread/) {
+    # This might loop endlessly
+    return 1;
+   }
+   next;
+  }
 
   s/^\s*//;           # Strip leading spaces
   s/<[^>]+>//;        # Strip tags
@@ -60,18 +61,18 @@ sub parse {
   if ($_ eq '{') {      # A suppression block begins
    $in = 1;
   } elsif ($_ eq '}') { # A suppression block ends
-   # With valgrind 3.4.0, we can replace unknown series of frames by '...'
-   if ($sess->version ge '3.4.0') {
-    my $unknown_tail;
-    ++$unknown_tail while $s =~ s/(\n)\s*obj:\*\s*$/$1/;
-    $s .= "...\n" if $unknown_tail;
-   }
-
    push @supps, $s;     # Add the suppression that just ended to the list
    $s  = '';            # Reset the state
    $in = 0;
   } elsif ($in) {       # We're inside a suppresion block
-   $s .= "$_\n";        # Append the current line to the state
+   if (/^fun\s*:\s*(.*)/) {
+    # Sometimes valgrind seems to forget to Z-demangle the symbol names.
+    # Make sure it's done and append the result to the state.
+    my $sym = $1;
+    $s .= 'fun:' . Test::Valgrind::Suppressions->maybe_z_demangle($sym) . "\n";
+   } else {
+    $s .= "$_\n";
+   }
   }
  }
 
@@ -83,11 +84,11 @@ sub parse {
 
    my %call; # Frames to append (if the value is 1) or to prepend (if it's 0)
    if ($t eq 'm') {       # malloc can also be called by calloc or realloc
-    $call{$_} = 1 for qw/calloc realloc/;
+    $call{$_} = 1 for qw<calloc realloc>;
    } elsif ($t eq 're') { # realloc can also call malloc or free
-    $call{$_} = 0 for qw/malloc free/;
+    $call{$_} = 0 for qw<malloc free>;
    } elsif ($t eq 'c') {  # calloc can also call malloc
-    $call{$_} = 0 for qw/malloc/;
+    $call{$_} = 0 for qw<malloc>;
    }
 
    my $c = $_;
@@ -107,6 +108,8 @@ sub parse {
   kind => 'Suppression',
   data => $_,
  )) for @supps, @extra;
+
+ return 0;
 }
 
 =head1 SEE ALSO
@@ -132,7 +135,7 @@ You can find documentation for this module with the perldoc command.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2009 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.
 
@@ -142,7 +145,7 @@ This program is free software; you can redistribute it and/or modify it under th
 
 package Test::Valgrind::Report::Suppressions;
 
-use base qw/Test::Valgrind::Report/;
+use base qw<Test::Valgrind::Report>;
 
 sub kinds { shift->SUPER::kinds(), 'Suppression' }