B-DeparseTree
view release on metacpan or search on metacpan
lib/B/DeparseTree/PPfns.pm view on Meta::CPAN
sub deparse_format($$$)
{
my ($self, $form, $parent) = @_;
my @texts;
local($self->{'curcv'}) = $form;
local($self->{'curcvlex'});
local($self->{'in_format'}) = 1;
local(@$self{qw'curstash warnings hints hinthash'})
= @$self{qw'curstash warnings hints hinthash'};
my $op = $form->ROOT;
local $B::overlay = {};
$self->pessimise($op, $form->START);
my $info = {
op => $op,
parent => $parent,
cop => $self->{'curcop'}
};
$self->{optree}{$$op} = $info;
if ($op->first->name eq 'stub' || $op->first->name eq 'nextstate') {
my $info->{text} = "\f.";
lib/B/DeparseTree/TreeMain.pm view on Meta::CPAN
# or (2), for the = @_ case, changed this:
# pushmark -> gv[_] -> rv2av -> (pad stuff) -> the_rest
# into this:
# padrange ----------------------------------------> the_rest
# so we just need to convert the padrange back into a
# pushmark, and in case (1), set its op_next to op_sibling,
# which is the head of the original chain of optimised-away
# pad ops, or for (2), set it to sibling->first, which is
# the original gv[_].
$B::overlay->{$$op} = {
type => OP_PUSHMARK,
name => 'pushmark',
private => ($op->private & OPpLVAL_INTRO),
};
}
# pessimisations end here
if (class($op) eq 'PMOP'
&& ref($op->pmreplroot)
lib/B/DeparseTree/TreeMain.pm view on Meta::CPAN
# redoop and nextop will already be covered by the main block
# of the loop
$self->_pessimise_walk_exe($op->lastop, $visited);
}
# pessimisations start here
}
}
# Go through an optree and "remove" some optimisations by using an
# overlay to selectively modify or un-null some ops. Deparsing in the
# absence of those optimisations is then easier.
#
# Note that older optimisations are not removed, as Deparse was already
# written to recognise them before the pessimise/overlay system was added.
sub pessimise {
my ($self, $root, $start) = @_;
no warnings 'recursion';
# walk tree in root-to-branch order
$self->_pessimise_walk($root);
my %visited;
# walk tree in execution order
lib/B/DeparseTree/TreeMain.pm view on Meta::CPAN
use Data::Printer;
my @bt = caller(1);
p @bt;
};
$self->{'curcv'} = main_cv;
$self->{'curcvlex'} = undef;
print $self->extract_prototypes;
@{$self->{'subs_todo'}} =
sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
my $root = main_root;
local $B::overlay = {};
if ($] < 5.021) {
unless (B::Deparse::null $root) {
$self->pessimise($root, main_start);
# Print deparsed program
print $self->deparse_root($root)->{text}, "\n";
}
} else {
unless (B::Deparse::null $root) {
$self->B::Deparse::pad_subs($self->{'curcv'});
lib/B/DeparseTree/TreeMain.pm view on Meta::CPAN
local($self->{'curcv'}) = $cv;
local($self->{'curcvlex'});
local(@$self{qw'curstash warnings hints hinthash'})
= @$self{qw'curstash warnings hints hinthash'};
# Now deparse subroutine body
my $root = $cv->ROOT;
my ($body, $node);
local $B::overlay = {};
if (not B::Deparse::null $root) {
$self->pessimise($root, $cv->START);
my $lineseq = $root->first;
if ($lineseq->name eq "lineseq") {
my @ops;
for(my $o=$lineseq->first; $$o; $o=$o->sibling) {
push @ops, $o;
}
$body = $self->lineseq($root, 0, @ops);
my $scope_en = $self->find_scope_en($lineseq);
( run in 0.927 second using v1.01-cache-2.11-cpan-49f99fa48dc )