=head1 VERSION
-Version 1.00
+Version 1.02
=cut
-our $VERSION = '1.00';
+our $VERSION = '1.02';
=head1 DESCRIPTION
=cut
-use base qw/Test::Valgrind::Tool::SuppressionsParser Test::Valgrind::Tool/;
+use base qw/Test::Valgrind::Tool/;
=head1 METHODS
-This class inherits L<Test::Valgrind::Tool> and L<Test::Valgrind::Tool::SuppressionsParser>.
+This class inherits L<Test::Valgrind::Tool>.
=head2 C<requires_version>
$self->{callers} = $callers;
- $self->{twig} = Test::Valgrind::Tool::memcheck::Twig->new(tool => $self);
-
$self;
}
sub callers { $_[0]->{callers} }
-=head2 C<twig>
-
-Read-only accessor for the underlying L<XML::Twig> parser.
-
-=cut
-
-sub twig { $_[0]->{twig} }
-
sub suppressions_tag { 'memcheck-' . $_[1]->version }
=head2 C<report_class_analysis $session>
sub report_class_analysis { 'Test::Valgrind::Tool::memcheck::Report' }
sub args {
- my ($self, $sess) = @_;
+ my $self = shift;
+ my ($sess) = @_;
my @args = (
'--tool=memcheck',
push @args, '--xml=yes';
}
- push @args, $self->SUPER::args();
+ push @args, $self->SUPER::args(@_);
return @args;
}
-# We must store the session in ourselves because it's only possible to pass
-# arguments to XML::Twig objects by a global stash.
-
-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);
-
- return;
-}
-
-sub parse_analysis {
- my ($self, $sess, $fh) = @_;
-
- my $twig = $self->twig;
- $twig->parse($fh);
- $twig->purge;
-
- return;
-}
-
-sub finish {
- my ($self, $sess) = @_;
-
- $self->_session(undef);
- $self->SUPER::start($sess);
-
- return;
-}
-
=head1 SEE ALSO
-L<Test::Valgrind>, L<Test::Valgrind::Tool>, L<Test::Valgrind::Tool::SuppressionsParser>.
+L<Test::Valgrind>, L<Test::Valgrind::Tool>.
L<XML::Twig>.
use base qw/Test::Valgrind::Report/;
-use Config qw/%Config/;
-
-our $VERSION = '1.00';
+our $VERSION = '1.02';
my @kinds = qw/
InvalidFree
sub is_leak { $_[0]->kind =~ /^Leak_/ ? 1 : '' }
-my $pad = 2 * ($Config{ptrsize} || 4);
+my $pad;
+BEGIN {
+ require Config;
+ $pad = 2 * ($Config::Config{ptrsize} || 4);
+}
sub dump {
my ($self) = @_;
# End of Test::Valgrind::Tool::memcheck::Report
-package Test::Valgrind::Tool::memcheck::Twig;
-
-our $VERSION = '1.00';
-
-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.00';
-
-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