X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FTest%2FValgrind%2FTool%2Fmemcheck.pm;h=87852cf5bed7757d23e8661cad90288f10462bc1;hb=76e13d7ca56782de6f9fb8d6597856ad91c15ffb;hp=9ec1aa0762fe972793076efaa28c0755bc3bad3b;hpb=f040b7d40c89671ee109c2554dbb5471fe88b449;p=perl%2Fmodules%2FTest-Valgrind.git diff --git a/lib/Test/Valgrind/Tool/memcheck.pm b/lib/Test/Valgrind/Tool/memcheck.pm index 9ec1aa0..87852cf 100644 --- a/lib/Test/Valgrind/Tool/memcheck.pm +++ b/lib/Test/Valgrind/Tool/memcheck.pm @@ -9,11 +9,11 @@ Test::Valgrind::Tool::memcheck - Run an analysis through the memcheck tool. =head1 VERSION -Version 1.01 +Version 1.02 =cut -our $VERSION = '1.01'; +our $VERSION = '1.02'; =head1 DESCRIPTION @@ -21,11 +21,11 @@ This tool parses the XML output of a C run with L. =cut -use base qw/Test::Valgrind::Tool::SuppressionsParser Test::Valgrind::Tool/; +use base qw/Test::Valgrind::Tool/; =head1 METHODS -This class inherits L and L. +This class inherits L. =head2 C @@ -92,7 +92,8 @@ This tool emits C object reports in anal sub report_class_analysis { 'Test::Valgrind::Tool::memcheck::Report' } sub args { - my ($self, $sess) = @_; + my $self = shift; + my ($sess) = @_; my @args = ( '--tool=memcheck', @@ -108,7 +109,7 @@ sub args { push @args, '--xml=yes'; } - push @args, $self->SUPER::args(); + push @args, $self->SUPER::args(@_); return @args; } @@ -121,9 +122,6 @@ sub _session { @_ <= 1 ? $_[0]->{_session} : ($_[0]->{_session} = $_[1]) } sub start { my ($self, $sess) = @_; - $self->_croak('This memcheck tool can\'t be run in two sessions at once') - if $self->_session; - $self->SUPER::start($sess); $self->_session($sess); @@ -151,7 +149,7 @@ sub finish { =head1 SEE ALSO -L, L, L. +L, L. L. @@ -186,7 +184,7 @@ package Test::Valgrind::Tool::memcheck::Report; use base qw/Test::Valgrind::Report/; -our $VERSION = '1.01'; +our $VERSION = '1.02'; my @kinds = qw/ InvalidFree @@ -256,112 +254,3 @@ sub dump { # End of Test::Valgrind::Tool::memcheck::Report -package Test::Valgrind::Tool::memcheck::Twig; - -our $VERSION = '1.01'; - -use Scalar::Util; - -use base qw/XML::Twig Test::Valgrind::Carp/; - -BEGIN { XML::Twig->add_options('Stash'); } - -my %handlers = ( - '/valgrindoutput/error' => \&handle_error, -); - -sub new { - my $class = shift; - $class = ref($class) || $class; - - my %args = @_; - my $stash = delete $args{stash} || { }; - - my $tool = delete $args{tool}; - $class->_croak('Invalid tool') unless Scalar::Util::blessed($tool) - and $tool->isa('Test::Valgrind::Tool'); - $stash->{tool} = $tool; - - bless $class->XML::Twig::new( - elt_class => __PACKAGE__ . '::Elt', - stash => $stash, - twig_roots => { map { $_ => 1 } keys %handlers }, - twig_handlers => { map { $_ => $handlers{$_} } keys %handlers }, - ), $class; -} - -sub stash { shift->{Stash} } - -sub handle_error { - my ($twig, $node) = @_; - - my $id = $node->kid('unique')->text; - my $kind = $node->kid('kind')->text; - - my $data; - - $data->{what} = $node->kid('what')->text; - $data->{stack} = [ map $_->listify_frame, - $node->kid('stack')->children('frame') ]; - - for (qw/leakedbytes leakedblocks/) { - my $kid = $node->first_child($_); - next unless $kid; - $data->{$_} = int $kid->text; - } - - if (my $auxwhat = $node->first_child('auxwhat')) { - if (my $stack = $auxwhat->next_sibling('stack')) { - $data->{auxstack} = [ map $_->listify_frame, $stack->children('frame') ]; - } - $data->{auxwhat} = $auxwhat->text; - } - - if (my $origin = $node->first_child('origin')) { - $data->{origwhat} = $origin->kid('what')->text; - $data->{origstack} = [ map $_->listify_frame, - $origin->kid('stack')->children('frame') ]; - } - - my $report = Test::Valgrind::Tool::memcheck::Report->new( - kind => $kind, - id => $id, - data => $data, - ); - - $twig->stash->{tool}->_session->report($report); - - $twig->purge; -} - -# End of Test::Valgrind::Tool::memcheck::Twig - -package Test::Valgrind::Tool::memcheck::Twig::Elt; - -our $VERSION = '1.01'; - -BEGIN { require XML::Twig; } - -use base qw/XML::Twig::Elt Test::Valgrind::Carp/; - -sub kid { - my ($self, $what) = @_; - my $node = $self->first_child($what); - $self->_croak("Couldn't get first $what child node") unless $node; - return $node; -} - -sub listify_frame { - my ($frame) = @_; - - return unless $frame->tag eq 'frame'; - - return [ - map { - my $x = $frame->first_child($_); - $x ? $x->text : undef - } qw/ip obj fn dir file line/ - ]; -} - -1; # End of Test::Valgrind::Tool::memcheck::Twig::Elt