]> git.vpit.fr Git - perl/modules/B-RecDeparse.git/commitdiff
Stop tripping on special function calls. rt63842
authorVincent Pit <vince@profvince.com>
Sun, 27 Feb 2011 18:44:50 +0000 (19:44 +0100)
committerVincent Pit <vince@profvince.com>
Sun, 27 Feb 2011 18:44:50 +0000 (19:44 +0100)
Like calls to an undefined subroutine or that involve @_ and friends.

This solves RT #63842.

MANIFEST
lib/B/RecDeparse.pm
t/17-calls.t [new file with mode: 0644]

index a2af98147fcc2639b20920ab3d5fbe4b1deddf24..b67812fbca9d10c11b5537b075d8847cc9ded94d 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -14,6 +14,7 @@ t/13-prototypes.t
 t/14-refs.t
 t/15-pkg.t
 t/16-recurse.t
+t/17-calls.t
 t/20-compile.t
 t/21-single_delim.t
 t/91-pod.t
index 89d695c131640eb6aa830d1bf5c6f7b8fbe797e2..12df138ed059273de20251c0a0818499bc07ccfa 100644 (file)
@@ -183,10 +183,11 @@ sub pp_gv {
 
  my $gv   = $self->gv_or_padgv($_[0]);
  my $name = $gv->NAME;
+ my $cv   = $gv->CV;
  my $seen = $self->{brd_seen};
 
  my $body;
- if (!$self->{brd_sub} or !$self->_recurse or $seen->{$name}) {
+ if (!$self->{brd_sub} or !$self->_recurse or $seen->{$name} or !$$cv) {
   $body = $self->SUPER::pp_gv(@_);
  } else {
   $body = do {
diff --git a/t/17-calls.t b/t/17-calls.t
new file mode 100644 (file)
index 0000000..8db7ac4
--- /dev/null
@@ -0,0 +1,52 @@
+#!perl -T
+
+use strict;
+use warnings;
+
+use Test::More tests => 2 * 4 * 5;
+
+use B::RecDeparse;
+
+my $brd = B::RecDeparse->new(level => -1);
+
+sub foo { 123 }
+my $pkg;
+
+my @tests = (
+ [ e1 => 'foo()',      '123' ],
+ [ e2 => 'foo(1)',     '123' ],
+ [ e3 => 'foo(@_)',    '123' ],
+ [ e4 => 'foo(shift)', '123' ],
+
+ [ x1 => 'bar()',      'bar' ],
+ [ x2 => 'bar(1)',     'bar' ],
+ [ x3 => 'bar(@_)',    'bar' ],
+ [ x4 => 'bar(shift)', 'bar' ],
+
+ [ m1  => '"pkg"->qux()',      'qux' ],
+ [ m2  => '"pkg"->qux(1)',     'qux' ],
+ [ m3  => '"pkg"->qux(@_)',    'qux' ],
+ [ m4  => '"pkg"->qux(shift)', 'qux' ],
+ [ m5  => '$pkg->qux()',       'qux' ],
+ [ m6  => '$pkg->qux(1)',      'qux' ],
+ [ m7  => '$pkg->qux(@_)',     'qux' ],
+ [ m8  => '$pkg->qux(shift)',  'qux' ],
+ [ m9  => 'shift->qux()',      'qux' ],
+ [ m10 => 'shift->qux(1)',     'qux' ],
+ [ m11 => 'shift->qux(@_)',    'qux' ],
+ [ m12 => 'shift->qux(shift)', 'qux' ],
+);
+
+for my $test (@tests) {
+ my ($name, $source, $match) = @$test;
+
+ my $code = do {
+  local $@;
+  eval "sub { $source }";
+ };
+
+ my $res = eval { $brd->coderef2text($code) };
+ is  $@,    '',             "deparsing sub $name doesn't croak";
+ $res = '' unless defined $res;
+ like $res, qr/\Q$match\E/, "deparsing sub $name works as expected";
+}