B-DeparseTree
view release on metacpan or search on metacpan
lib/B/DeparseTree/P526c.pm view on Meta::CPAN
$from .= tr_chr($chunk->[0]);
}
}
for my $chunk (@to) {
$diff = $chunk->[1] - $chunk->[0];
if ($diff > 1) {
$to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
} elsif ($diff == 1) {
$to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
} else {
$to .= tr_chr($chunk->[0]);
}
}
#$final = sprintf("%04x", $final) if defined $final;
#$none = sprintf("%04x", $none) if defined $none;
#$extra = sprintf("%04x", $extra) if defined $extra;
#print STDERR "final: $final\n none: $none\nextra: $extra\n";
#print STDERR $swash{'LIST'}->PV;
return (B::Deparse::escape_str($from), B::Deparse::escape_str($to));
}
sub pp_trans {
my $self = shift;
my($op, $cx) = @_;
my($from, $to);
my $class = class($op);
my $priv_flags = $op->private;
if ($class eq "PVOP") {
($from, $to) = tr_decode_byte($op->pv, $priv_flags);
} elsif ($class eq "PADOP") {
($from, $to)
= tr_decode_utf8($self->padval($op->padix)->RV, $priv_flags);
} else { # class($op) eq "SVOP"
($from, $to) = tr_decode_utf8($op->sv->RV, $priv_flags);
}
my $flags = "";
$flags .= "c" if $priv_flags & OPpTRANS_COMPLEMENT;
$flags .= "d" if $priv_flags & OPpTRANS_DELETE;
$to = "" if $from eq $to and $flags eq "";
$flags .= "s" if $priv_flags & OPpTRANS_SQUASH;
return info_from_list($op, $self, ['tr', double_delim($from, $to), $flags],
'', 'pp_trans', {});
}
sub pp_transr {
my $self = $_[0];
my $op = $_[1];
my $info = pp_trans(@_);
return info_from_text($op, $self, $info->{text} . 'r', 'pp_transr',
{body => [$info]});
}
# Like dq(), but different
sub re_dq {
my $self = shift;
my ($op) = @_;
my ($re_dq_info, $fmt);
my $type = $op->name;
if ($type eq "const") {
return '$[' if $op->private & OPpCONST_ARYBASE;
my $unbacked = B::Deparse::re_unback($self->const_sv($op)->as_string);
return B::Deparse::re_uninterp(escape_re($unbacked));
} elsif ($type eq "concat") {
my $first = $self->re_dq($op->first);
my $last = $self->re_dq($op->last);
return B::Deparse::re_dq_disambiguate($first, $last);
} elsif ($type eq "uc") {
$re_dq_info = $self->re_dq($op->first->sibling);
$fmt = '\U%c\E';
$type .= ' uc';
} elsif ($type eq "lc") {
$re_dq_info = $self->re_dq($op->first->sibling);
$fmt = '\L%c\E';
$type .= ' lc';
} elsif ($type eq "ucfirst") {
$re_dq_info = $self->re_dq($op->first->sibling);
$fmt = '\u%c';
$type .= ' ucfirst';
} elsif ($type eq "lcfirst") {
$re_dq_info = $self->re_dq($op->first->sibling);
$fmt = '\u%c';
$type .= ' lcfirst';
} elsif ($type eq "quotemeta") {
$re_dq_info = $self->re_dq($op->first->sibling);
$fmt = '\Q%c\E';
$type .= ' quotemeta';
} elsif ($type eq "fc") {
$re_dq_info = $self->re_dq($op->first->sibling);
$fmt = '\F%c\E';
$type .= ' fc';
} elsif ($type eq "join") {
return $self->deparse($op->last, 26); # was join($", @ary)
} else {
my $ret = $self->deparse($op, 26);
$ret =~ s/^\$([(|)])\z/\${$1}/ # $( $| $) need braces
or $ret =~ s/^\@([-+])\z/\@{$1}/; # @- @+ need braces
return $ret;
}
return $self->info_from_template($type, $op->first->sibling,
$fmt, [$re_dq_info], [0]);
}
sub pure_string {
my ($self, $op) = @_;
return 0 if B::Deparse::null $op;
my $type = $op->name;
if ($type eq 'const' || $type eq 'av2arylen') {
return 1;
}
elsif ($type =~ /^(?:[ul]c(first)?|fc)$/ || $type eq 'quotemeta') {
return $self->pure_string($op->first->sibling);
}
elsif ($type eq 'join') {
my $join_op = $op->first->sibling; # Skip pushmark
return 0 unless $join_op->name eq 'null' && $join_op->targ == OP_RV2SV;
my $gvop = $join_op->first;
return 0 unless $gvop->name eq 'gvsv';
return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
( run in 0.514 second using v1.01-cache-2.11-cpan-5735350b133 )