package B::RecDeparse;
-use 5.008001;
+use 5.008_001;
use strict;
use warnings;
=head1 VERSION
-Version 0.04
+Version 0.09
=cut
-our $VERSION = '0.04';
+our $VERSION = '0.09';
=head1 SYNOPSIS
- perl -MO=RecDeparse,deparse,[@B__Deparse_opts],level,-1 [ -e '...' | bleh.pl ]
+ # Deparse recursively a Perl one-liner :
+ $ perl -MO=RecDeparse,deparse,@B__Deparse_opts,level,-1 -e '...'
- # Or as a module :
+ # Or a complete Perl script :
+ $ perl -MO=RecDeparse,deparse,@B__Deparse_opts,level,-1 x.pl
+
+ # Or a single code reference :
use B::RecDeparse;
- my $brd = B::RecDeparse->new(deparse => [ @b__deparse_opts ], level => $level);
+ my $brd = B::RecDeparse->new(
+ deparse => \@B__Deparse_opts,
+ level => $level,
+ );
my $code = $brd->coderef2text(sub { ... });
=head1 DESCRIPTION
=head1 METHODS
-=head2 C<< new < deparse => [ @B__Deparse_opts ], level => $level > >>
+=head2 C<new>
+
+ my $brd = B::RecDeparse->new(
+ deparse => \@B__Deparse_opts,
+ level => $level,
+ );
The L<B::RecDeparse> object constructor.
You can specify the underlying L<B::Deparse> constructor arguments by passing a string or an array reference as the value of the C<deparse> key.
use constant {
# p31268 made pp_entersub call single_delim
FOOL_SINGLE_DELIM =>
- ($^V ge v5.9.5)
- || ($^V lt v5.9.0 and $^V ge v5.8.9)
+ ("$]" >= 5.009_005)
+ || ("$]" < 5.009 and "$]" >= 5.008_009)
|| ($Config{perl_patchlevel} && $Config{perl_patchlevel} >= 31268)
};
}
}
+sub pp_srefgen {
+ my $self = shift;
+
+ return do {
+ local $self->{brd_sub} = 0;
+ $self->SUPER::pp_srefgen(@_);
+ }
+}
+
sub pp_gv {
my $self = shift;
my $gv = $self->gv_or_padgv($_[0]);
- my $name = $gv->NAME;
- my $cv = $gv->CV;
+ my $cv = $gv->FLAGS & B::SVf_ROK ? $gv->RV : undef;
+ my $name = $cv ? $cv->NAME_HEK || $cv->GV->NAME : $gv->NAME;
+ $cv ||= $gv->CV;
my $seen = $self->{brd_seen};
my $body;
- if (!$self->{brd_sub} or !$self->_recurse or $seen->{$name} or !$$cv) {
+ if (!$self->{brd_sub} or !$self->_recurse or $seen->{$name} or !$$cv
+ or !$cv->isa('B::CV') or $cv->ROOT->isa('B::NULL')) {
$body = $self->SUPER::pp_gv(@_);
} else {
$body = do {
local @{$self}{qw<brd_sub brd_cur>} = (0, $self->{brd_cur} + 1);
local $seen->{$name} = 1;
- 'sub ' . $self->indent($self->deparse_sub($gv->CV));
+ 'sub ' . $self->indent($self->deparse_sub($cv));
};
if (FOOL_SINGLE_DELIM) {
return $body;
}
-=head2 C<compile>
+=pod
+
+The following functions and methods from L<B::Deparse> are reimplemented by this module :
+
+=over 4
+
+=item *
+
+C<compile>
+
+=item *
+
+C<init>
+
+=item *
+
+C<deparse_sub>
+
+=item *
+
+C<pp_entersub>
+
+=item *
-=head2 C<init>
+C<pp_refgen>
-=head2 C<deparse_sub>
+=item *
-=head2 C<pp_entersub>
+C<pp_srefgen>
-=head2 C<pp_refgen>
+=item *
-=head2 C<pp_gv>
+C<pp_gv>
-Functions and methods from L<B::Deparse> reimplemented by this module.
-Never call them directly.
+=back
Otherwise, L<B::RecDeparse> inherits all methods from L<B::Deparse>.
=head1 COPYRIGHT & LICENSE
-Copyright 2008,2009,2010,2011 Vincent Pit, all rights reserved.
+Copyright 2008,2009,2010,2011,2013,2014 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.