]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/blobdiff - lib/Test/Valgrind/Parser/Suppressions/Text.pm
This is 1.12
[perl/modules/Test-Valgrind.git] / lib / Test / Valgrind / Parser / Suppressions / Text.pm
index 6142e4278d01b484eb7bcb0a24ed0fd88d3b3a22..9c35155a3b6ee13ba8cddf629e3a8f9e75eadc2d 100644 (file)
@@ -1,59 +1,42 @@
-package Test::Valgrind::Tool::SuppressionsParser;
+package Test::Valgrind::Parser::Suppressions::Text;
 
 use strict;
 use warnings;
 
 =head1 NAME
 
 
 use strict;
 use warnings;
 
 =head1 NAME
 
-Test::Valgrind::Tool::SuppressionsParser - Mock Test::Valgrind::Tool for parsing valgrind suppressions.
+Test::Valgrind::Parser::Suppressions::Text - Parse valgrind suppressions output as text blocks.
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-Version 1.02
+Version 1.12
 
 =cut
 
 
 =cut
 
-our $VERSION = '1.02';
+our $VERSION = '1.12';
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
-This class provides a default C<parse_suppressions> method, so that real tools for which suppressions are meaningful can exploit it by inheriting.
-
-It's not meant to be used directly as a tool.
+This is a L<Test::Valgrind::Parser::Text> object that can extract suppressions from C<valgrind>'s text output.
 
 =cut
 
 
 =cut
 
-use base qw/Test::Valgrind::Carp/;
-
-=head1 METHODS
-
-=head2 C<new>
+use Test::Valgrind::Suppressions;
 
 
-Just a croaking stub to remind you not to use this class as a real tool.
+use base qw/Test::Valgrind::Parser::Text Test::Valgrind::Carp/;
 
 
-If your tool both inherit from this class and from C<Test::Valgrind::Tool>, and that you want to dispatch the call to your C<new> to its ancestors', be careful with C<SUPER> which may end up calling this dieing version of C<new>.
-The solution is to either put C<Test::Valgrind::Tool> first in the C<@ISA> list or to explicitely call C<Test::Valgrind::Tool::new> instead of C<SUPER::new>.
-
-=cut
-
-sub new { shift->_croak('This mock tool isn\'t meant to be used directly') }
+=head1 METHODS
 
 
-=head2 C<report_class_suppressions $session>
+=head2 C<report_class>
 
 Generated reports are C<Test::Valgrind::Report::Suppressions> objects.
 Their C<data> member contains the raw text of the suppression.
 
 =cut
 
 
 Generated reports are C<Test::Valgrind::Report::Suppressions> objects.
 Their C<data> member contains the raw text of the suppression.
 
 =cut
 
-sub report_class_suppressions { 'Test::Valgrind::Report::Suppressions' }
+sub report_class { 'Test::Valgrind::Report::Suppressions' }
 
 
-=head2 C<parse_suppressions $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_suppressions {
+sub parse {
  my ($self, $sess, $fh) = @_;
 
  my ($s, $in) = ('', 0);
  my ($self, $sess, $fh) = @_;
 
  my ($s, $in) = ('', 0);
@@ -63,7 +46,6 @@ sub parse_suppressions {
   s/^\s*#\s//;        # Strip comments
 
   next if /^==/;      # Valgrind info line
   s/^\s*#\s//;        # Strip comments
 
   next if /^==/;      # Valgrind info line
-  next if /valgrind/; # and /\Q$file\E/;
 
   s/^\s*//;           # Strip leading spaces
   s/<[^>]+>//;        # Strip tags
 
   s/^\s*//;           # Strip leading spaces
   s/<[^>]+>//;        # Strip tags
@@ -73,18 +55,19 @@ sub parse_suppressions {
   if ($_ eq '{') {      # A suppression block begins
    $in = 1;
   } elsif ($_ eq '}') { # A suppression block ends
   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;
-   }
-
+   $s = Test::Valgrind::Suppressions->strip_tail($sess, $s); # Strip the 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
    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";
+   }
   }
  }
 
   }
  }
 
@@ -124,7 +107,7 @@ sub parse_suppressions {
 
 =head1 SEE ALSO
 
 
 =head1 SEE ALSO
 
-L<Test::Valgrind>, L<Test::Valgrind::Tool>.
+L<Test::Valgrind>, L<Test::Valgrind::Parser::Text>.
 
 =head1 AUTHOR
 
 
 =head1 AUTHOR
 
@@ -141,7 +124,7 @@ I will be notified, and then you'll automatically be notified of progress on you
 
 You can find documentation for this module with the perldoc command.
 
 
 You can find documentation for this module with the perldoc command.
 
-    perldoc Test::Valgrind::Tool::SuppressionsParser
+    perldoc Test::Valgrind::Parser::Suppressions::Text
 
 =head1 COPYRIGHT & LICENSE
 
 
 =head1 COPYRIGHT & LICENSE
 
@@ -151,7 +134,7 @@ This program is free software; you can redistribute it and/or modify it under th
 
 =cut
 
 
 =cut
 
-# End of Test::Valgrind::Tool::SuppressionsParser
+# End of Test::Valgrind::Parser::Suppressions::Text
 
 package Test::Valgrind::Report::Suppressions;
 
 
 package Test::Valgrind::Report::Suppressions;