use strict;
use warnings;
+use B ();
+
use Config;
-use base qw/B::Deparse/;
+use base qw<B::Deparse>;
=head1 NAME
sub init {
my $self = shift;
- $self->{brd_cur} = 0;
- $self->{brd_sub} = 0;
+ $self->{brd_cur} = 0;
+ $self->{brd_sub} = 0;
+ $self->{brd_seen} = { };
$self->SUPER::init(@_);
}
}
}
+sub deparse_sub {
+ my $self = shift;
+ my $cv = $_[0];
+
+ my $name;
+ unless ($cv->CvFLAGS & B::CVf_ANON()) {
+ $name = $cv->GV->SAFENAME;
+ }
+
+ local $self->{brd_seen}->{$name} = 1 if defined $name;
+ return $self->SUPER::deparse_sub(@_);
+}
+
sub pp_entersub {
my $self = shift;
sub pp_gv {
my $self = shift;
+ my $gv = $self->gv_or_padgv($_[0]);
+ my $name = $gv->NAME;
+ my $seen = $self->{brd_seen};
+
my $body;
- if ($self->{brd_sub} <= 0 || !$self->_recurse) {
+ if ($self->{brd_sub} <= 0 || !$self->_recurse || $seen->{$name}) {
$body = $self->SUPER::pp_gv(@_);
} else {
- my $gv = $self->gv_or_padgv($_[0]);
-
$body = do {
- local @{$self}{qw/brd_sub brd_cur/} = (0, $self->{brd_cur} + 1);
+ local @{$self}{qw<brd_sub brd_cur>} = (0, $self->{brd_cur} + 1);
+ local $seen->{$name} = 1;
'sub ' . $self->indent($self->deparse_sub($gv->CV));
};
=head2 C<init>
+=head2 C<deparse_sub>
+
=head2 C<pp_entersub>
=head2 C<pp_refgen>
=head1 COPYRIGHT & LICENSE
-Copyright 2008,2009,2010 Vincent Pit, all rights reserved.
+Copyright 2008,2009,2010,2011 Vincent Pit, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.