]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/blobdiff - lib/Test/Valgrind/Parser/XML/Twig.pm
Make Parser::XML::Twig collect the protocol version
[perl/modules/Test-Valgrind.git] / lib / Test / Valgrind / Parser / XML / Twig.pm
index a949e81b4856ff9b51513f845c5f4bc9f624e4be..878ef4de6afe1594bf46b5338c0d0293d4435071 100644 (file)
@@ -7,12 +7,13 @@ our $VERSION = '1.02';
 
 use Scalar::Util ();
 
-use base qw/XML::Twig Test::Valgrind::Carp/;
+use base qw/Test::Valgrind::Parser::XML Test::Valgrind::Carp XML::Twig/;
 
 BEGIN { XML::Twig->add_options('Stash'); }
 
 my %handlers = (
- '/valgrindoutput/error' => \&handle_error,
+ '/valgrindoutput/protocolversion' => \&handle_version,
+ '/valgrindoutput/error'           => \&handle_error,
 );
 
 sub new {
@@ -22,11 +23,6 @@ sub new {
  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,
@@ -37,6 +33,47 @@ sub new {
 
 sub stash { shift->{Stash} }
 
+eval "sub $_ { \@_ <= 1 ? \$_[0]->{$_} : (\$_[0]->{$_} = \$_[1]) }"
+                                              for qw/_session protocol_version/;
+
+# We must store the session in ourselves because it's only possible to pass
+# arguments to XML::Twig objects by a global stash.
+
+sub start {
+ my ($self, $sess) = @_;
+
+ $self->SUPER::start($sess);
+ $self->_session($sess);
+
+ return;
+}
+
+sub parse {
+ my ($self, $sess, $fh) = @_;
+
+ $self->XML::Twig::parse($fh);
+ $self->purge;
+
+ return;
+}
+
+sub finish {
+ my ($self, $sess) = @_;
+
+ $self->_session(undef);
+ $self->SUPER::finish($sess);
+
+ return;
+}
+
+sub handle_version {
+ my ($twig, $node) = @_;
+
+ $twig->protocol_version($node->text);
+
+ $twig->purge;
+}
+
 sub handle_error {
  my ($twig, $node) = @_;
 
@@ -68,10 +105,9 @@ sub handle_error {
                                      $origin->kid('stack')->children('frame') ];
  }
 
- my $tool = $twig->stash->{tool};
- my $sess = $tool->_session;
+ my $sess = $twig->_session;
 
- $sess->report($tool->report_class($sess)->new(
+ $sess->report($sess->report_class($sess)->new(
   kind => $kind,
   id   => $id,
   data => $data,