summaryrefslogtreecommitdiff
path: root/systems/texlive/tlnet/tlpkg/tlperl/lib/B
diff options
context:
space:
mode:
Diffstat (limited to 'systems/texlive/tlnet/tlpkg/tlperl/lib/B')
-rw-r--r--systems/texlive/tlnet/tlpkg/tlperl/lib/B/Concise.pm17
-rw-r--r--systems/texlive/tlnet/tlpkg/tlperl/lib/B/Deparse.pm418
-rw-r--r--systems/texlive/tlnet/tlpkg/tlperl/lib/B/Op_private.pm104
3 files changed, 382 insertions, 157 deletions
diff --git a/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Concise.pm b/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Concise.pm
index 729fcd95f4..73d4045a63 100644
--- a/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Concise.pm
+++ b/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Concise.pm
@@ -12,10 +12,9 @@ package B::Concise;
use strict; # use #2
use warnings; # uses #3 and #4, since warnings uses Carp
-use Exporter (); # use #5
+use Exporter 'import'; # use #5
-our $VERSION = "1.004";
-our @ISA = qw(Exporter);
+our $VERSION = "1.007";
our @EXPORT_OK = qw( set_style set_style_standard add_callback
concise_subref concise_cv concise_main
add_style walk_output compile reset_sequence );
@@ -853,9 +852,14 @@ sub concise_op {
# targ holds a reference count
my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
$h{targarglife} = $h{targarg} = "$h{targ} $refs";
- } elsif ($h{targ}) {
+ } elsif ($h{targ} && $h{name} ne 'iter') {
+ # for my ($q, $r, $s) () {} syntax hijacks the targ of the iter op,
+ # (which is the ->next of the enteriter) hence the special cases above
+ # and just below:
my $count = $h{name} eq 'padrange'
? ($op->private & $B::Op_private::defines{'OPpPADRANGE_COUNTMASK'})
+ : $h{name} eq 'enteriter'
+ ? $op->next->targ + 1
: 1;
my (@targarg, @targarglife);
for my $i (0..$count-1) {
@@ -1485,6 +1489,11 @@ They're opcode specific, and occur less often than the public ones, so
they're represented by short mnemonics instead of single-chars; see
B::Op_private and F<regen/op_private> for more details.
+Note that a number after a '/' often indicates the number of arguments.
+In the I<sassign> example above, the OP takes 2 arguments. These values
+are sometimes used at runtime: in particular, the MAXARG macro makes use
+of them.
+
=head1 FORMATTING SPECIFICATIONS
For each line-style ('concise', 'terse', 'linenoise', etc.) there are
diff --git a/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Deparse.pm b/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Deparse.pm
index 67147f12dd..90a36752bd 100644
--- a/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Deparse.pm
+++ b/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Deparse.pm
@@ -7,13 +7,14 @@
# This is based on the module of the same name by Malcolm Beattie,
# but essentially none of his code remains.
-package B::Deparse;
+package B::Deparse 1.74;
+use strict;
use Carp;
use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS
OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpKVSLICE
- OPpCONST_BARE
+ OPpCONST_BARE OPpEMPTYAVHV_IS_HV
OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST
OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE
@@ -21,13 +22,14 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
OPpPADHV_ISKEYS OPpRV2HV_ISKEYS
OPpCONCAT_NESTED
OPpMULTICONCAT_APPEND OPpMULTICONCAT_STRINGIFY OPpMULTICONCAT_FAKE
- OPpTRUEBOOL OPpINDEX_BOOLNEG
- SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
- SVs_PADTMP SVpad_TYPED
- CVf_METHOD CVf_LVALUE
+ OPpTRUEBOOL OPpINDEX_BOOLNEG OPpDEFER_FINALLY
+ OPpARG_IF_UNDEF OPpARG_IF_FALSE
+ SVf_IOK SVf_NOK SVf_ROK SVf_POK SVf_FAKE SVs_RMG SVs_SMG
+ SVs_PADTMP
+ CVf_NOWARN_AMBIGUOUS CVf_LVALUE
PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED PMf_EXTENDED_MORE
- PADNAMEt_OUTER
+ PADNAMEf_OUTER PADNAMEf_OUR PADNAMEf_TYPED
MDEREF_reload
MDEREF_AV_pop_rv2av_aelem
MDEREF_AV_gvsv_vivify_rv2av_aelem
@@ -52,8 +54,6 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
MDEREF_SHIFT
);
-$VERSION = '1.56';
-use strict;
our $AUTOLOAD;
use warnings ();
require feature;
@@ -272,7 +272,8 @@ BEGIN {
BEGIN { for (qw[ const stringify rv2sv list glob pushmark null aelem
kvaslice kvhslice padsv argcheck
- nextstate dbstate rv2av rv2hv helem custom ]) {
+ nextstate dbstate rv2av rv2hv helem pushdefer leavetrycatch
+ custom ]) {
eval "sub OP_\U$_ () { " . opnumber($_) . "}"
}}
@@ -447,14 +448,32 @@ sub next_todo {
# emit the sub.
my @text;
my $flags = $name->FLAGS;
- push @text,
+ my $category =
!$cv || $seq <= $name->COP_SEQ_RANGE_LOW
- ? $self->keyword($flags & SVpad_OUR
+ ? $self->keyword($flags & PADNAMEf_OUR
? "our"
: $flags & SVpad_STATE
? "state"
: "my") . " "
: "";
+
+ # Skip lexical 'state' subs imported from the builtin::
+ # package, since they are created automatically by
+ # use builtin "foo"
+ if ($cv && $category =~ /\bstate\b/) {
+ my $globname;
+ my $gv = $cv->GV;
+ if (
+ $gv
+ && defined (($globname = $gv->object_2svref))
+ && $$globname =~ /^\*builtin::/
+ ) {
+ return '';
+ }
+ }
+
+ push @text, $category;
+
# XXX We would do $self->keyword("sub"), but ‘my CORE::sub’
# doesn’t work and ‘my sub’ ignores a &sub in scope. I.e.,
# we have a core bug here.
@@ -822,16 +841,6 @@ sub new {
return $self;
}
-{
- # Mask out the bits that L<warnings::register> uses
- my $WARN_MASK;
- BEGIN {
- $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
- }
- sub WARN_MASK () {
- return $WARN_MASK;
- }
-}
# Initialise the contextual information, either from
# defaults provided with the ambient_pragmas method,
@@ -839,9 +848,7 @@ sub new {
sub init {
my $self = shift;
- $self->{'warnings'} = defined ($self->{'ambient_warnings'})
- ? $self->{'ambient_warnings'} & WARN_MASK
- : undef;
+ $self->{'warnings'} = $self->{'ambient_warnings'};
$self->{'hints'} = $self->{'ambient_hints'};
$self->{'hinthash'} = $self->{'ambient_hinthash'};
@@ -1114,8 +1121,8 @@ sub pad_subs {
if (defined $name && $name =~ /^&./) {
my $low = $_->COP_SEQ_RANGE_LOW;
my $flags = $_->FLAGS;
- my $outer = $flags & PADNAMEt_OUTER;
- if ($flags & SVpad_OUR) {
+ my $outer = $flags & PADNAMEf_OUTER;
+ if ($flags & PADNAMEf_OUR) {
push @todo, [$low, undef, 0, $_]
# [seq, no cv, not format, padname]
unless $outer;
@@ -1128,7 +1135,7 @@ sub pad_subs {
my $flags = $flags;
my $cv = $cv;
my $name = $_;
- while ($flags & PADNAMEt_OUTER && class ($protocv) ne 'CV')
+ while ($flags & PADNAMEf_OUTER && class ($protocv) ne 'CV')
{
$cv = $cv->OUTSIDE;
next PADENTRY if class($cv) eq 'SPECIAL'; # XXX freed?
@@ -1145,7 +1152,7 @@ sub pad_subs {
my $other = $protocv->PADLIST;
$$other && $other->outid == $padlist->id;
};
- if ($flags & PADNAMEt_OUTER) {
+ if ($flags & PADNAMEf_OUTER) {
next unless $defined_in_this_sub;
push @todo, [$protocv->OUTSIDE_SEQ, $protocv, 0, $_];
next;
@@ -1255,7 +1262,10 @@ sub deparse_argops {
return unless $$kid and $kid->name eq 'argdefelem';
my $def = $self->deparse($kid->first, 7);
$def = "($def)" if $kid->first->flags & OPf_PARENS;
- $var .= " = $def";
+ my $assign = "=";
+ $assign = "//=" if $kid->private & OPpARG_IF_UNDEF;
+ $assign = "||=" if $kid->private & OPpARG_IF_FALSE;
+ $var .= " $assign $def";
}
push @sig, $var;
}
@@ -1306,7 +1316,7 @@ Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
local $self->{'curcop'} = $self->{'curcop'};
- my $has_sig = $self->{hinthash}{feature_signatures};
+ my $has_sig = $self->feature_enabled('signatures');
if ($cv->FLAGS & SVf_POK) {
my $myproto = $cv->PV;
if ($has_sig) {
@@ -1316,9 +1326,9 @@ Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
$proto = $myproto;
}
}
- if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) {
+ if ($cv->CvFLAGS & (CVf_NOWARN_AMBIGUOUS|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) {
push @attrs, "lvalue" if $cv->CvFLAGS & CVf_LVALUE;
- push @attrs, "method" if $cv->CvFLAGS & CVf_METHOD;
+ push @attrs, "method" if $cv->CvFLAGS & CVf_NOWARN_AMBIGUOUS;
push @attrs, "const" if $cv->CvFLAGS & CVf_ANONCONST;
}
@@ -1544,7 +1554,7 @@ sub maybe_parens_func {
if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
return "$func($text)";
} else {
- return "$func $text";
+ return $func . (length($text) ? " $text" : "");
}
}
@@ -1554,7 +1564,7 @@ sub find_our_type {
my $seq = $self->{'curcop'} ? $self->{'curcop'}->cop_seq : 0;
for my $a (@{$self->{'curcvlex'}{"o$name"}}) {
my ($st, undef, $padname) = @$a;
- if ($st >= $seq && $padname->FLAGS & SVpad_TYPED) {
+ if ($st >= $seq && $padname->FLAGS & PADNAMEf_TYPED) {
return $padname->SvSTASH->NAME;
}
}
@@ -1640,7 +1650,7 @@ sub maybe_my {
# because enteriter ops do not carry the flag.
my $my =
$self->keyword($padname->FLAGS & SVpad_STATE ? "state" : "my");
- if ($padname->FLAGS & SVpad_TYPED) {
+ if ($padname->FLAGS & PADNAMEf_TYPED) {
$my .= ' ' . $padname->SvSTASH->NAME;
}
if ($need_parens) {
@@ -1732,6 +1742,12 @@ sub scopeop {
$body = $self->deparse($body, 1);
return "$body $name $cond";
}
+ elsif($kid->type == OP_PUSHDEFER &&
+ $kid->private & OPpDEFER_FINALLY &&
+ $kid->sibling->type == OP_LEAVETRYCATCH &&
+ null($kid->sibling->sibling)) {
+ return $self->pp_leavetrycatch_with_finally($kid->sibling, $kid, $cx);
+ }
} else {
$kid = $op->first;
}
@@ -1974,7 +1990,7 @@ sub populate_curcvlex {
: ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
push @{$self->{'curcvlex'}{
- ($ns[$i]->FLAGS & SVpad_OUR ? 'o' : 'm') . $name
+ ($ns[$i]->FLAGS & PADNAMEf_OUR ? 'o' : 'm') . $name
}}, [$seq_st, $seq_en, $ns[$i]];
}
}
@@ -2075,7 +2091,7 @@ sub pragmata {
my $warnings = $op->warnings;
my $warning_bits;
if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
- $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
+ $warning_bits = $warnings::Bits{"all"};
}
elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
$warning_bits = $warnings::NONE;
@@ -2084,14 +2100,24 @@ sub pragmata {
$warning_bits = undef;
}
else {
- $warning_bits = $warnings->PV & WARN_MASK;
+ $warning_bits = $warnings->PV;
}
- if (defined ($warning_bits) and
- !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
- push @text,
- $self->declare_warnings($self->{'warnings'}, $warning_bits);
- $self->{'warnings'} = $warning_bits;
+ my ($w1, $w2);
+ # The number of valid bit positions may have grown (by a byte or
+ # more) since the last warnings state, by custom warnings
+ # categories being registered in the meantime. Normalise the
+ # bitmasks first so they may be fairly compared.
+ $w1 = defined($self->{warnings})
+ ? warnings::_expand_bits($self->{warnings})
+ : undef;
+ $w2 = defined($warning_bits)
+ ? warnings::_expand_bits($warning_bits)
+ : undef;
+
+ if (defined($w2) and !defined($w1) || $w1 ne $w2) {
+ push @text, $self->declare_warnings($w1, $w2);
+ $self->{'warnings'} = $w2;
}
my $hints = $op->hints;
@@ -2176,13 +2202,13 @@ sub pp_nextstate {
sub declare_warnings {
my ($self, $from, $to) = @_;
$from //= '';
- my $all = (warnings::bits("all") & WARN_MASK);
- unless ((($from & WARN_MASK) & ~$all) =~ /[^\0]/) {
+ my $all = warnings::bits("all");
+ unless (($from & ~$all) =~ /[^\0]/) {
# no FATAL bits need turning off
- if ( ($to & WARN_MASK) eq $all) {
+ if ( $to eq $all) {
return $self->keyword("use") . " warnings;\n";
}
- elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
+ elsif ($to eq ("\0"x length($to))) {
return $self->keyword("no") . " warnings;\n";
}
}
@@ -2306,6 +2332,9 @@ my %feature_keywords = (
fc => 'fc',
try => 'try',
catch => 'try',
+ finally => 'try',
+ defer => 'defer',
+ signatures => 'signatures',
);
# keywords that are strong and also have a prototype
@@ -2489,7 +2518,21 @@ sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
sub pp_defined { unop(@_, "defined") }
-sub pp_undef { unop(@_, "undef") }
+sub pp_undef {
+ if ($_[1]->private & OPpTARGET_MY) {
+ my $targ = $_[1]->targ;
+ my $var = $_[0]->maybe_my($_[1], $_[2], $_[0]->padname($targ),
+ $_[0]->padname_sv($targ),
+ 1);
+ my $func = unop(@_, "undef");
+ if ($func =~ /\s/) {
+ return unop(@_, "undef").$var;
+ } else {
+ return "$var = undef";
+ }
+ }
+ unop(@_, "undef")
+}
sub pp_study { unop(@_, "study") }
sub pp_ref { unop(@_, "ref") }
sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
@@ -2747,19 +2790,40 @@ sub pp_anonlist {
*pp_anonhash = \&pp_anonlist;
+sub pp_emptyavhv {
+ my $self = shift;
+ my ($op, $cx, $forbid_parens) = @_;
+ my $val = ($op->private & OPpEMPTYAVHV_IS_HV) ? '{}' : '[]';
+ if ($op->private & OPpTARGET_MY) {
+ my $targ = $op->targ;
+ my $var = $self->maybe_my($op, $cx, $self->padname($targ),
+ $self->padname_sv($targ),
+ $forbid_parens);
+ return $self->maybe_parens("$var = $val", $cx, 7);
+ } else {
+ return $val;
+ }
+}
+
sub pp_refgen {
my $self = shift;
my($op, $cx) = @_;
my $kid = $op->first;
if ($kid->name eq "null") {
my $anoncode = $kid = $kid->first;
+
+ # Perl no longer generates this, but XS modules might:
if ($anoncode->name eq "anonconst") {
$anoncode = $anoncode->first->first->sibling;
}
+
+ # Same as with `anonconst`:
if ($anoncode->name eq "anoncode"
or !null($anoncode = $kid->sibling) and
$anoncode->name eq "anoncode") {
return $self->e_anoncode({ code => $self->padval($anoncode->targ) });
+
+ # Perl still generates this:
} elsif ($kid->name eq "pushmark") {
my $sib_name = $kid->sibling->name;
if ($sib_name eq 'entersub') {
@@ -2781,6 +2845,18 @@ sub e_anoncode {
return $self->keyword("sub") . " $text";
}
+sub pp_anoncode {
+ my ($self, $anoncode) = @_;
+
+ return $self->e_anoncode( { code => $self->padval($anoncode->targ) } );
+}
+
+sub pp_anonconst {
+ my ($self, $anonconst) = @_;
+
+ return $self->pp_anoncode( $anonconst->first->first->sibling );
+}
+
sub pp_srefgen { pp_refgen(@_) }
sub pp_readline {
@@ -3068,6 +3144,18 @@ sub pp_isa { binop(@_, "isa", 15) }
sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
+sub pp_padsv_store {
+ my $self = shift;
+ my ($op, $cx, $forbid_parens, @args) = @_;
+ my $targ = $op->targ;
+ my $var = $self->maybe_my($op, $cx, $self->padname($targ),
+ $self->padname_sv($targ),
+ $forbid_parens);
+
+ my $val = $self->deparse($op->first, 7);
+ return $self->maybe_parens("$var = $val", $cx, 7);
+}
+
sub pp_smartmatch {
my ($self, $op, $cx) = @_;
if (($op->flags & OPf_SPECIAL) && $self->{expand} < 2) {
@@ -3669,7 +3757,7 @@ sub maybe_var_attr {
return unless $loppriv & OPpLVAL_INTRO;
my $padname = $self->padname_sv($lop->targ);
- my $thisclass = ($padname->FLAGS & SVpad_TYPED)
+ my $thisclass = ($padname->FLAGS & PADNAMEf_TYPED)
? $padname->SvSTASH->NAME : 'main';
# all pad vars must be in the same class
@@ -3788,9 +3876,12 @@ sub pp_list {
$local = "my";
}
my $padname = $self->padname_sv($lop->targ);
- if ($padname->FLAGS & SVpad_TYPED) {
+ if ($padname->FLAGS & PADNAMEf_TYPED) {
$newtype = $padname->SvSTASH->NAME;
}
+ } elsif ($lopname eq 'padsv_store') {
+ # don't interpret as my (list) if it has an implicit assign
+ $local = "";
} elsif ($lopname =~ /^(?:gv|rv2)([ash])v$/
&& $loppriv & OPpOUR_INTRO
or $lopname eq "null" && class($lop) eq 'UNOP'
@@ -3953,7 +4044,21 @@ sub loop_common {
} else {
$ary = $self->deparse($ary, 1);
}
- if (null $var) {
+
+ if ($enter->flags & OPf_PARENS) {
+ # for my ($x, $y, ...) ...
+ # for my ($foo, $bar) () stores the count (less 1) in the targ of
+ # the ITER op. For the degenerate case of 1 var ($x), the
+ # TARG is zero, so it works anyway
+ my $iter_targ = $kid->first->first->targ;
+ my @vars;
+ my $targ = $enter->targ;
+ while ($iter_targ-- >= 0) {
+ push @vars, $self->padname_sv($targ)->PVX;
+ ++$targ;
+ }
+ $var = 'my (' . join(', ', @vars) . ')';
+ } elsif (null $var) {
$var = $self->pp_padsv($enter, 1, 1);
} elsif ($var->name eq "rv2gv") {
$var = $self->pp_rv2sv($var, 1);
@@ -4057,9 +4162,9 @@ sub pp_leavetry {
return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
}
-sub pp_leavetrycatch {
+sub pp_leavetrycatch_with_finally {
my $self = shift;
- my ($op) = @_;
+ my ($op, $finallyop) = @_;
# Expect that the first three kids should be (entertrycatch, poptry, catch)
my $entertrycatch = $op->first;
@@ -4072,14 +4177,30 @@ sub pp_leavetrycatch {
$catch->name eq "catch" or die "Expected catch as third child of leavetrycatch";
my $catchblock = $catch->first->sibling;
- $catchblock->name eq "scope" or die "Expected scope as second child of catch";
+ my $name = $catchblock->name;
+ unless ($name eq "scope" || $name eq "leave") {
+ die "Expected scope or leave as second child of catch, got $name instead";
+ }
my $trycode = scopeop(0, $self, $tryblock);
my $catchvar = $self->padname($catch->targ);
- my $catchcode = scopeop(0, $self, $catchblock);
+ my $catchcode = $name eq 'scope' ? scopeop(0, $self, $catchblock)
+ : scopeop(1, $self, $catchblock);
+
+ my $finallycode = "";
+ if($finallyop) {
+ my $body = $self->deparse($finallyop->first->first);
+ $finallycode = "\nfinally {\n\t$body\n\b}";
+ }
return "try {\n\t$trycode\n\b}\n" .
- "catch($catchvar) {\n\t$catchcode\n\b}\cK";
+ "catch($catchvar) {\n\t$catchcode\n\b}$finallycode\cK";
+}
+
+sub pp_leavetrycatch {
+ my $self = shift;
+ my ($op, @args) = @_;
+ return $self->pp_leavetrycatch_with_finally($op, undef, @args);
}
sub _op_is_or_was {
@@ -4225,6 +4346,17 @@ sub pp_gv {
return $self->maybe_qualify("", $self->gv_name($gv));
}
+sub pp_aelemfastlex_store {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $name = $self->padname($op->targ);
+ $name =~ s/^@/\$/;
+ my $i = $op->private;
+ $i -= 256 if $i > 127;
+ my $val = $self->deparse($op->first, 7);
+ return $self->maybe_parens("${name}[$i] = $val", $cx, 7);
+}
+
sub pp_aelemfast_lex {
my $self = shift;
my($op, $cx) = @_;
@@ -4922,78 +5054,92 @@ sub e_method {
sub check_proto {
my $self = shift;
return "&" if $self->{'noproto'};
- my($proto, @args) = @_;
- my($arg, $real);
+ my ($proto, @args) = @_;
my $doneok = 0;
my @reals;
- # An unbackslashed @ or % gobbles up the rest of the args
- 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
- $proto =~ s/^\s*//;
- while ($proto) {
- $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;|)\s*//;
+ $proto =~ s/^\s+//;
+ while (length $proto) {
+ $proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|[_+;])\s*//
+ or return "&"; # malformed prototype
my $chr = $1;
- if ($chr eq "") {
- return "&" if @args;
- } elsif ($chr eq ";") {
+ if ($chr eq ";") {
$doneok = 1;
- } elsif ($chr eq "@" or $chr eq "%") {
+ } elsif ($chr eq '@' or $chr eq '%') {
+ # An unbackslashed @ or % gobbles up the rest of the args
push @reals, map($self->deparse($_, 6), @args);
@args = ();
+ $proto = '';
+ } elsif (!@args) {
+ last if $doneok;
+ return "&"; # too few args and no ';'
} else {
- $arg = shift @args;
- last unless $arg;
- if ($chr eq "\$" || $chr eq "_") {
+ my $arg = shift @args;
+ if ($chr eq '$' || $chr eq '_') {
if (want_scalar $arg) {
push @reals, $self->deparse($arg, 6);
} else {
return "&";
}
} elsif ($chr eq "&") {
- if ($arg->name =~ /^(s?refgen|undef)$/) {
+ if ($arg->name =~ /^(?:s?refgen|undef)\z/) {
push @reals, $self->deparse($arg, 6);
} else {
return "&";
}
} elsif ($chr eq "*") {
- if ($arg->name =~ /^s?refgen$/
+ if ($arg->name =~ /^s?refgen\z/
and $arg->first->first->name eq "rv2gv")
- {
- $real = $arg->first->first; # skip refgen, null
- if ($real->first->name eq "gv") {
- push @reals, $self->deparse($real, 6);
- } else {
- push @reals, $self->deparse($real->first, 6);
- }
- } else {
- return "&";
- }
+ {
+ my $real = $arg->first->first; # skip refgen, null
+ if ($real->first->name eq "gv") {
+ push @reals, $self->deparse($real, 6);
+ } else {
+ push @reals, $self->deparse($real->first, 6);
+ }
+ } else {
+ return "&";
+ }
+ } elsif ($chr eq "+") {
+ my $real;
+ if ($arg->name =~ /^s?refgen\z/ and
+ !null($real = $arg->first) and
+ !null($real->first) and
+ $real->first->name =~ /^(?:rv2|pad)[ah]v\z/)
+ {
+ push @reals, $self->deparse($real, 6);
+ } elsif (want_scalar $arg) {
+ push @reals, $self->deparse($arg, 6);
+ } else {
+ return "&";
+ }
} elsif (substr($chr, 0, 1) eq "\\") {
$chr =~ tr/\\[]//d;
- if ($arg->name =~ /^s?refgen$/ and
+ my $real;
+ if ($arg->name =~ /^s?refgen\z/ and
!null($real = $arg->first) and
($chr =~ /\$/ && is_scalar($real->first)
or ($chr =~ /@/
- && class($real->first->sibling) ne 'NULL'
- && $real->first->sibling->name
- =~ /^(rv2|pad)av$/)
+ && !null($real->first)
+ && $real->first->name =~ /^(?:rv2|pad)av\z/)
or ($chr =~ /%/
- && class($real->first->sibling) ne 'NULL'
- && $real->first->sibling->name
- =~ /^(rv2|pad)hv$/)
+ && !null($real->first)
+ && $real->first->name =~ /^(?:rv2|pad)hv\z/)
#or ($chr =~ /&/ # This doesn't work
# && $real->first->name eq "rv2cv")
or ($chr =~ /\*/
&& $real->first->name eq "rv2gv")))
- {
- push @reals, $self->deparse($real, 6);
- } else {
- return "&";
- }
- }
- }
+ {
+ push @reals, $self->deparse($real, 6);
+ } else {
+ return "&";
+ }
+ } else {
+ # should not happen
+ return "&";
+ }
+ }
}
- return "&" if $proto and !$doneok; # too few args and no ';'
- return "&" if @args; # too many args
+ return "&" if @args; # too many args
return ("", join ", ", @reals);
}
@@ -5038,7 +5184,7 @@ sub retscalar {
|msgrcv|semop|semget|semctl|hintseval|shostent|snetent
|sprotoent|sservent|ehostent|enetent|eprotoent|eservent
|spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv
- |fc)\z/x
+ |fc|padsv_store)\z/x
}
sub pp_entersub {
@@ -5049,9 +5195,7 @@ sub pp_entersub {
my $prefix = "";
my $amper = "";
my($kid, @exprs);
- if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
- $prefix = "do ";
- } elsif ($op->private & OPpENTERSUB_AMPER) {
+ if ($op->private & OPpENTERSUB_AMPER) {
$amper = "&";
}
$kid = $op->first;
@@ -5175,19 +5319,23 @@ sub pp_entersub {
# it back.
$kid =~ s/^CORE::GLOBAL:://;
- my $dproto = defined($proto) ? $proto : "undefined";
- my $scalar_proto = $dproto =~ /^;*(?:[\$*_+]|\\.|\\\[[^]]\])\z/;
if (!$declared) {
return "$kid(" . $args . ")";
- } elsif ($dproto =~ /^\s*\z/) {
+ }
+
+ my $dproto = defined($proto) ? $proto : "undefined";
+ if ($dproto =~ /^\s*\z/) {
return $kid;
- } elsif ($scalar_proto and is_scalar($exprs[0])) {
+ }
+
+ my $scalar_proto = $dproto =~ /^ \s* (?: ;\s* )* (?: [\$*_+] |\\ \s* (?: [\$\@%&*] | \[ [^\]]+ \] ) ) \s* \z/x;
+ if ($scalar_proto and !@exprs || is_scalar($exprs[0])) {
# is_scalar is an excessively conservative test here:
# really, we should be comparing to the precedence of the
# top operator of $exprs[0] (ala unop()), but that would
# take some major code restructuring to do right.
return $self->maybe_parens_func($kid, $args, $cx, 16);
- } elsif (not $scalar_proto and defined($proto) || $simple) { #'
+ } elsif (not $scalar_proto and defined($proto) || $simple) {
return $self->maybe_parens_func($kid, $args, $cx, 5);
} else {
return "$kid(" . $args . ")";
@@ -5295,7 +5443,7 @@ sub re_unback {
# the insane complexity here is due to the behaviour of "\c\"
$str =~ s/
# these two lines ensure that the backslash we're about to
- # remove isn't preceeded by something which makes it part
+ # remove isn't preceded by something which makes it part
# of a \c
(^ | [^\\] | \\c\\) # $1
@@ -5408,9 +5556,15 @@ sub const {
return $self->const_dumper($sv, $cx);
}
if (class($sv) eq "SPECIAL") {
- # sv_undef, sv_yes, sv_no
- return $$sv == 3 ? $self->maybe_parens("!1", $cx, 21)
- : ('undef', '1')[$$sv-1];
+ # PL_sv_undef etc
+ # return yes/no as boolean expressions rather than integers to
+ # preserve their boolean-ness
+ return
+ $$sv == 1 ? 'undef' : # PL_sv_undef
+ $$sv == 2 ? $self->maybe_parens("!0", $cx, 21) : # PL_sv_yes
+ $$sv == 3 ? $self->maybe_parens("!1", $cx, 21) : # PL_sv_no
+ $$sv == 7 ? '0' : # PL_sv_zero
+ '"???"';
}
if (class($sv) eq "NULL") {
return 'undef';
@@ -5431,10 +5585,10 @@ sub const {
if ($nv == 0) {
if (pack("F", $nv) eq pack("F", 0)) {
# positive zero
- return "0";
+ return "0.0";
} else {
# negative zero
- return $self->maybe_parens("-.0", $cx, 21);
+ return $self->maybe_parens("-0.0", $cx, 21);
}
} elsif (1/$nv == 0) {
if ($nv > 0) {
@@ -5471,6 +5625,10 @@ sub const {
return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
}
}
+
+ # preserve NV-ness: output as NNN.0 rather than NNN
+ $str .= ".0" if $str =~ /^-?[0-9]+$/;
+
$str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
return $str;
} elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
@@ -6252,9 +6410,7 @@ sub matchop {
->sibling # entersub
->first # ex-list
->first # pushmark
- ->sibling # srefgen
- ->first # ex-list
- ->first # anoncode
+ ->sibling # anoncode
->targ
)
: undef);
@@ -6578,6 +6734,34 @@ sub pp_argdefelem {
}
+sub pp_pushdefer {
+ my $self = shift;
+ my($op, $cx) = @_;
+ # defer block body is stored in the ->first of an OP_NULL that is
+ # ->first of OP_PUSHDEFER
+ my $body = $self->deparse($op->first->first);
+ return "defer {\n\t$body\n\b}\cK";
+}
+
+sub builtin1 {
+ my $self = shift;
+ my ($op, $cx, $name) = @_;
+ my $arg = $self->deparse($op->first);
+ # TODO: work out if lexical alias is present somehow...
+ return "builtin::$name($arg)";
+}
+
+sub pp_is_bool { builtin1(@_, "is_bool"); }
+sub pp_is_weak { builtin1(@_, "is_weak"); }
+sub pp_weaken { builtin1(@_, "weaken"); }
+sub pp_unweaken { builtin1(@_, "unweaken"); }
+sub pp_blessed { builtin1(@_, "blessed"); }
+sub pp_refaddr { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "refaddr"); }
+sub pp_reftype { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "reftype"); }
+sub pp_ceil { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "ceil"); }
+sub pp_floor { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "floor"); }
+sub pp_is_tainted { builtin1(@_, "is_tainted"); }
+
1;
__END__
diff --git a/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Op_private.pm b/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Op_private.pm
index e4a9ecdc31..634cad2dd9 100644
--- a/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Op_private.pm
+++ b/systems/texlive/tlnet/tlpkg/tlperl/lib/B/Op_private.pm
@@ -1,4 +1,4 @@
-# -*- buffer-read-only: t -*-
+# -*- mode: Perl; buffer-read-only: t -*-
#
# lib/B/Op_private.pm
#
@@ -118,7 +118,7 @@ package B::Op_private;
our %bits;
-our $VERSION = "5.034000";
+our $VERSION = "5.038002";
$bits{$_}{3} = 'OPpENTERSUB_AMPER' for qw(entersub rv2cv);
$bits{$_}{6} = 'OPpENTERSUB_DB' for qw(entersub rv2cv);
@@ -134,22 +134,22 @@ $bits{$_}{6} = 'OPpINDEX_BOOLNEG' for qw(index rindex);
$bits{$_}{1} = 'OPpITER_REVERSED' for qw(enteriter iter);
$bits{$_}{7} = 'OPpLVALUE' for qw(leave leaveloop);
$bits{$_}{6} = 'OPpLVAL_DEFER' for qw(aelem helem multideref);
-$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split);
+$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete emptyavhv enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv padsv_store pushmark refassign rv2av rv2gv rv2hv rv2sv split undef);
$bits{$_}{2} = 'OPpLVREF_ELEM' for qw(lvref refassign);
$bits{$_}{3} = 'OPpLVREF_ITER' for qw(lvref refassign);
$bits{$_}{3} = 'OPpMAYBE_LVSUB' for qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec);
-$bits{$_}{4} = 'OPpMAYBE_TRUEBOOL' for qw(padhv ref rv2hv);
+$bits{$_}{4} = 'OPpMAYBE_TRUEBOOL' for qw(blessed padhv ref rv2hv);
$bits{$_}{7} = 'OPpOFFBYONE' for qw(caller runcv wantarray);
$bits{$_}{5} = 'OPpOPEN_IN_CRLF' for qw(backtick open);
$bits{$_}{4} = 'OPpOPEN_IN_RAW' for qw(backtick open);
$bits{$_}{7} = 'OPpOPEN_OUT_CRLF' for qw(backtick open);
$bits{$_}{6} = 'OPpOPEN_OUT_RAW' for qw(backtick open);
$bits{$_}{6} = 'OPpOUR_INTRO' for qw(enteriter gvsv rv2av rv2hv rv2sv split);
-$bits{$_}{6} = 'OPpPAD_STATE' for qw(lvavref lvref padav padhv padsv pushmark refassign);
+$bits{$_}{6} = 'OPpPAD_STATE' for qw(emptyavhv lvavref lvref padav padhv padsv padsv_store pushmark refassign undef);
$bits{$_}{7} = 'OPpPV_IS_UTF8' for qw(dump goto last next redo);
$bits{$_}{6} = 'OPpREFCOUNTED' for qw(leave leaveeval leavesub leavesublv leavewrite);
$bits{$_}{2} = 'OPpSLICEWARNING' for qw(aslice hslice padav padhv rv2av rv2hv);
-$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid);
+$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide emptyavhv exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time undef unlink unshift utime wait waitpid);
$bits{$_}{0} = 'OPpTRANS_CAN_FORCE_UTF8' for qw(trans transr);
$bits{$_}{5} = 'OPpTRANS_COMPLEMENT' for qw(trans transr);
$bits{$_}{7} = 'OPpTRANS_DELETE' for qw(trans transr);
@@ -157,7 +157,8 @@ $bits{$_}{6} = 'OPpTRANS_GROWS' for qw(trans transr);
$bits{$_}{2} = 'OPpTRANS_IDENTICAL' for qw(trans transr);
$bits{$_}{3} = 'OPpTRANS_SQUASH' for qw(trans transr);
$bits{$_}{1} = 'OPpTRANS_USE_SVOP' for qw(trans transr);
-$bits{$_}{5} = 'OPpTRUEBOOL' for qw(grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst);
+$bits{$_}{5} = 'OPpTRUEBOOL' for qw(blessed grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst);
+$bits{$_}{2} = 'OPpUSEINT' for qw(bit_and bit_or bit_xor complement left_shift nbit_and nbit_or nbit_xor ncomplement right_shift sbit_and sbit_or sbit_xor);
my @bf = (
{
@@ -253,6 +254,7 @@ $bits{aeach}{0} = $bf[0];
@{$bits{aelem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]);
@{$bits{aelemfast}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]);
@{$bits{aelemfast_lex}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]);
+@{$bits{aelemfastlex_store}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]);
$bits{akeys}{0} = $bf[0];
$bits{alarm}{0} = $bf[0];
$bits{and}{0} = $bf[0];
@@ -261,7 +263,7 @@ $bits{anonconst}{0} = $bf[0];
@{$bits{anonhash}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{anonlist}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{argcheck}{0} = $bf[0];
-$bits{argdefelem}{0} = $bf[0];
+@{$bits{argdefelem}}{7,6,0} = ('OPpARG_IF_UNDEF', 'OPpARG_IF_FALSE', $bf[0]);
@{$bits{argelem}}{2,1,0} = ($bf[7], $bf[7], $bf[0]);
@{$bits{atan2}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{av2arylen}{0} = $bf[0];
@@ -270,12 +272,11 @@ $bits{avalues}{0} = $bf[0];
$bits{backtick}{0} = $bf[0];
@{$bits{bind}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{binmode}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
-@{$bits{bit_and}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{bit_or}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{bit_xor}}{1,0} = ($bf[1], $bf[1]);
@{$bits{bless}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+$bits{blessed}{0} = $bf[0];
@{$bits{caller}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{catch}{0} = $bf[0];
+$bits{ceil}{0} = $bf[0];
@{$bits{chdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{chmod}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{chomp}{0} = $bf[0];
@@ -287,7 +288,6 @@ $bits{chroot}{0} = $bf[0];
$bits{closedir}{0} = $bf[0];
$bits{cmpchain_and}{0} = $bf[0];
$bits{cmpchain_dup}{0} = $bf[0];
-$bits{complement}{0} = $bf[0];
@{$bits{concat}}{6,1,0} = ('OPpCONCAT_NESTED', $bf[1], $bf[1]);
$bits{cond_expr}{0} = $bf[0];
@{$bits{connect}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@@ -306,7 +306,8 @@ $bits{dor}{0} = $bf[0];
$bits{dorassign}{0} = $bf[0];
$bits{dump}{0} = $bf[0];
$bits{each}{0} = $bf[0];
-@{$bits{entereval}}{5,4,3,2,1,0} = ('OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]);
+@{$bits{emptyavhv}}{5,3,2,1,0} = ('OPpEMPTYAVHV_IS_HV', $bf[4], $bf[4], $bf[4], $bf[4]);
+@{$bits{entereval}}{6,5,4,3,2,1,0} = ('OPpEVAL_EVALSV', 'OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]);
$bits{entergiven}{0} = $bf[0];
$bits{enteriter}{3} = 'OPpITER_DEF';
@{$bits{entersub}}{5,4,0} = ($bf[8], $bf[8], 'OPpENTERSUB_INARGS');
@@ -325,6 +326,7 @@ $bits{fc}{0} = $bf[0];
@{$bits{fileno}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{flip}{0} = $bf[0];
@{$bits{flock}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+$bits{floor}{0} = $bf[0];
$bits{flop}{0} = $bf[0];
@{$bits{formline}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{ftatime}{0} = $bf[0];
@@ -382,6 +384,7 @@ $bits{grepwhile}{0} = $bf[0];
@{$bits{gt}}{1,0} = ($bf[1], $bf[1]);
$bits{gv}{5} = 'OPpEARLY_CV';
@{$bits{helem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]);
+@{$bits{helemexistsor}}{7,0} = ('OPpHELEMEXISTSOR_DELETE', $bf[0]);
$bits{hex}{0} = $bf[0];
@{$bits{i_add}}{1,0} = ($bf[1], $bf[1]);
@{$bits{i_divide}}{1,0} = ($bf[1], $bf[1]);
@@ -401,8 +404,12 @@ $bits{i_predec}{0} = $bf[0];
$bits{i_preinc}{0} = $bf[0];
@{$bits{i_subtract}}{1,0} = ($bf[1], $bf[1]);
@{$bits{index}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+@{$bits{initfield}}{2,1,0} = ('OPpINITFIELD_HV', 'OPpINITFIELD_AV', $bf[0]);
$bits{int}{0} = $bf[0];
@{$bits{ioctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+$bits{is_bool}{0} = $bf[0];
+$bits{is_tainted}{0} = $bf[0];
+$bits{is_weak}{0} = $bf[0];
@{$bits{isa}}{1,0} = ($bf[1], $bf[1]);
@{$bits{join}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{keys}{0} = $bf[0];
@@ -418,7 +425,6 @@ $bits{leavesub}{0} = $bf[0];
$bits{leavesublv}{0} = $bf[0];
$bits{leavewhen}{0} = $bf[0];
$bits{leavewrite}{0} = $bf[0];
-@{$bits{left_shift}}{1,0} = ($bf[1], $bf[1]);
$bits{length}{0} = $bf[0];
@{$bits{link}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{list}{6} = 'OPpLIST_GUESSED';
@@ -438,6 +444,7 @@ $bits{method_named}{0} = $bf[0];
$bits{method_redir}{0} = $bf[0];
$bits{method_redir_super}{0} = $bf[0];
$bits{method_super}{0} = $bf[0];
+@{$bits{methstart}}{7,0} = ('OPpINITFIELDS', $bf[0]);
@{$bits{mkdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{modulo}}{1,0} = ($bf[1], $bf[1]);
@{$bits{msgctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@@ -447,11 +454,7 @@ $bits{method_super}{0} = $bf[0];
@{$bits{multiconcat}}{6,5,3,0} = ('OPpMULTICONCAT_APPEND', 'OPpMULTICONCAT_FAKE', 'OPpMULTICONCAT_STRINGIFY', $bf[0]);
@{$bits{multideref}}{5,4,0} = ('OPpMULTIDEREF_DELETE', 'OPpMULTIDEREF_EXISTS', $bf[0]);
@{$bits{multiply}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{nbit_and}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{nbit_or}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{nbit_xor}}{1,0} = ($bf[1], $bf[1]);
@{$bits{ncmp}}{1,0} = ($bf[1], $bf[1]);
-$bits{ncomplement}{0} = $bf[0];
@{$bits{ne}}{1,0} = ($bf[1], $bf[1]);
$bits{negate}{0} = $bf[0];
$bits{next}{0} = $bf[0];
@@ -467,6 +470,7 @@ $bits{ord}{0} = $bf[0];
$bits{padhv}{0} = 'OPpPADHV_ISKEYS';
@{$bits{padrange}}{6,5,4,3,2,1,0} = ($bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5]);
@{$bits{padsv}}{5,4} = ($bf[8], $bf[8]);
+$bits{padsv_store}{0} = $bf[0];
@{$bits{pipe_op}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{pop}{0} = $bf[0];
$bits{pos}{0} = $bf[0];
@@ -477,6 +481,7 @@ $bits{predec}{0} = $bf[0];
$bits{preinc}{0} = $bf[0];
$bits{prototype}{0} = $bf[0];
@{$bits{push}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+@{$bits{pushdefer}}{7,0} = ('OPpDEFER_FINALLY', $bf[0]);
$bits{quotemeta}{0} = $bf[0];
@{$bits{rand}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{range}{0} = $bf[0];
@@ -487,8 +492,10 @@ $bits{readlink}{0} = $bf[0];
@{$bits{recv}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{redo}{0} = $bf[0];
$bits{ref}{0} = $bf[0];
+$bits{refaddr}{0} = $bf[0];
@{$bits{refassign}}{5,4,1,0} = ($bf[9], $bf[9], $bf[1], $bf[1]);
$bits{refgen}{0} = $bf[0];
+$bits{reftype}{0} = $bf[0];
$bits{regcmaybe}{0} = $bf[0];
$bits{regcomp}{0} = $bf[0];
$bits{regcreset}{0} = $bf[0];
@@ -498,7 +505,6 @@ $bits{require}{0} = $bf[0];
@{$bits{reset}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{reverse}}{3,0} = ('OPpREVERSE_INPLACE', $bf[0]);
$bits{rewinddir}{0} = $bf[0];
-@{$bits{right_shift}}{1,0} = ($bf[1], $bf[1]);
@{$bits{rindex}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{rmdir}{0} = $bf[0];
$bits{rv2av}{0} = $bf[0];
@@ -507,9 +513,6 @@ $bits{rv2av}{0} = $bf[0];
$bits{rv2hv}{0} = 'OPpRV2HV_ISKEYS';
@{$bits{rv2sv}}{5,4,0} = ($bf[8], $bf[8], $bf[0]);
@{$bits{sassign}}{7,6,1,0} = ('OPpASSIGN_CV_TO_GV', 'OPpASSIGN_BACKWARDS', $bf[1], $bf[1]);
-@{$bits{sbit_and}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{sbit_or}}{1,0} = ($bf[1], $bf[1]);
-@{$bits{sbit_xor}}{1,0} = ($bf[1], $bf[1]);
$bits{scalar}{0} = $bf[0];
$bits{schomp}{0} = $bf[0];
$bits{schop}{0} = $bf[0];
@@ -543,7 +546,7 @@ $bits{sin}{0} = $bf[0];
$bits{snetent}{0} = $bf[0];
@{$bits{socket}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{sockpair}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
-@{$bits{sort}}{7,6,4,3,2,1,0} = ('OPpSORT_UNSTABLE', 'OPpSORT_STABLE', 'OPpSORT_DESCEND', 'OPpSORT_INPLACE', 'OPpSORT_REVERSE', 'OPpSORT_INTEGER', 'OPpSORT_NUMERIC');
+@{$bits{sort}}{4,3,2,1,0} = ('OPpSORT_DESCEND', 'OPpSORT_INPLACE', 'OPpSORT_REVERSE', 'OPpSORT_INTEGER', 'OPpSORT_NUMERIC');
@{$bits{splice}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{split}}{4,3,2} = ('OPpSPLIT_ASSIGN', 'OPpSPLIT_LEX', 'OPpSPLIT_IMPLIM');
@{$bits{sprintf}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@@ -575,16 +578,18 @@ $bits{tied}{0} = $bf[0];
$bits{uc}{0} = $bf[0];
$bits{ucfirst}{0} = $bf[0];
@{$bits{umask}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
-$bits{undef}{0} = $bf[0];
+@{$bits{undef}}{5,0} = ('OPpUNDEF_KEEP_PV', $bf[0]);
@{$bits{unlink}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{unpack}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{unshift}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{untie}{0} = $bf[0];
+$bits{unweaken}{0} = $bf[0];
@{$bits{utime}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{values}{0} = $bf[0];
@{$bits{vec}}{1,0} = ($bf[1], $bf[1]);
@{$bits{waitpid}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{warn}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
+$bits{weaken}{0} = $bf[0];
@{$bits{xor}}{1,0} = ($bf[1], $bf[1]);
@@ -598,6 +603,8 @@ our %defines = (
OPpARGELEM_HV => 4,
OPpARGELEM_MASK => 6,
OPpARGELEM_SV => 0,
+ OPpARG_IF_FALSE => 64,
+ OPpARG_IF_UNDEF => 128,
OPpASSIGN_BACKWARDS => 64,
OPpASSIGN_COMMON_AGG => 16,
OPpASSIGN_COMMON_RC1 => 32,
@@ -615,12 +622,14 @@ our %defines = (
OPpCOREARGS_DEREF2 => 2,
OPpCOREARGS_PUSHMARK => 128,
OPpCOREARGS_SCALARMOD => 64,
+ OPpDEFER_FINALLY => 128,
OPpDEREF => 48,
OPpDEREF_AV => 16,
OPpDEREF_HV => 32,
OPpDEREF_SV => 48,
OPpDONT_INIT_GV => 4,
OPpEARLY_CV => 32,
+ OPpEMPTYAVHV_IS_HV => 32,
OPpENTERSUB_AMPER => 8,
OPpENTERSUB_DB => 64,
OPpENTERSUB_HASTARG => 4,
@@ -628,6 +637,7 @@ our %defines = (
OPpENTERSUB_NOPAREN => 128,
OPpEVAL_BYTES => 8,
OPpEVAL_COPHH => 16,
+ OPpEVAL_EVALSV => 64,
OPpEVAL_HAS_HH => 2,
OPpEVAL_RE_REPARSING => 32,
OPpEVAL_UNICODE => 4,
@@ -637,9 +647,13 @@ our %defines = (
OPpFT_AFTER_t => 16,
OPpFT_STACKED => 4,
OPpFT_STACKING => 8,
+ OPpHELEMEXISTSOR_DELETE => 128,
OPpHINT_STRICT_REFS => 2,
OPpHUSH_VMSISH => 32,
OPpINDEX_BOOLNEG => 64,
+ OPpINITFIELDS => 128,
+ OPpINITFIELD_AV => 2,
+ OPpINITFIELD_HV => 4,
OPpITER_DEF => 8,
OPpITER_REVERSED => 2,
OPpKVSLICE => 32,
@@ -684,8 +698,6 @@ our %defines = (
OPpSORT_INTEGER => 2,
OPpSORT_NUMERIC => 1,
OPpSORT_REVERSE => 4,
- OPpSORT_STABLE => 64,
- OPpSORT_UNSTABLE => 128,
OPpSPLIT_ASSIGN => 16,
OPpSPLIT_IMPLIM => 4,
OPpSPLIT_LEX => 8,
@@ -699,6 +711,8 @@ our %defines = (
OPpTRANS_SQUASH => 8,
OPpTRANS_USE_SVOP => 2,
OPpTRUEBOOL => 32,
+ OPpUNDEF_KEEP_PV => 32,
+ OPpUSEINT => 4,
);
our %labels = (
@@ -706,6 +720,8 @@ our %labels = (
OPpARGELEM_AV => 'AV',
OPpARGELEM_HV => 'HV',
OPpARGELEM_SV => 'SV',
+ OPpARG_IF_FALSE => 'IF_FALSE',
+ OPpARG_IF_UNDEF => 'IF_UNDEF',
OPpASSIGN_BACKWARDS => 'BKWARD',
OPpASSIGN_COMMON_AGG => 'COM_AGG',
OPpASSIGN_COMMON_RC1 => 'COM_RC1',
@@ -722,11 +738,13 @@ our %labels = (
OPpCOREARGS_DEREF2 => 'DEREF2',
OPpCOREARGS_PUSHMARK => 'MARK',
OPpCOREARGS_SCALARMOD => '$MOD',
+ OPpDEFER_FINALLY => 'FINALLY',
OPpDEREF_AV => 'DREFAV',
OPpDEREF_HV => 'DREFHV',
OPpDEREF_SV => 'DREFSV',
OPpDONT_INIT_GV => 'NOINIT',
OPpEARLY_CV => 'EARLYCV',
+ OPpEMPTYAVHV_IS_HV => 'ANONHASH',
OPpENTERSUB_AMPER => 'AMPER',
OPpENTERSUB_DB => 'DBG',
OPpENTERSUB_HASTARG => 'TARG',
@@ -734,6 +752,7 @@ our %labels = (
OPpENTERSUB_NOPAREN => 'NO()',
OPpEVAL_BYTES => 'BYTES',
OPpEVAL_COPHH => 'COPHH',
+ OPpEVAL_EVALSV => 'EVALSV',
OPpEVAL_HAS_HH => 'HAS_HH',
OPpEVAL_RE_REPARSING => 'REPARSE',
OPpEVAL_UNICODE => 'UNI',
@@ -743,9 +762,13 @@ our %labels = (
OPpFT_AFTER_t => 'FTAFTERt',
OPpFT_STACKED => 'FTSTACKED',
OPpFT_STACKING => 'FTSTACKING',
+ OPpHELEMEXISTSOR_DELETE => 'DELETE',
OPpHINT_STRICT_REFS => 'STRICT',
OPpHUSH_VMSISH => 'HUSH',
OPpINDEX_BOOLNEG => 'NEG',
+ OPpINITFIELDS => 'INITFIELDS',
+ OPpINITFIELD_AV => 'INITFIELD_AV',
+ OPpINITFIELD_HV => 'INITFIELD_HV',
OPpITER_DEF => 'DEF',
OPpITER_REVERSED => 'REVERSED',
OPpKVSLICE => 'KVSLICE',
@@ -787,8 +810,6 @@ our %labels = (
OPpSORT_INTEGER => 'INT',
OPpSORT_NUMERIC => 'NUM',
OPpSORT_REVERSE => 'REV',
- OPpSORT_STABLE => 'STABLE',
- OPpSORT_UNSTABLE => 'UNSTABLE',
OPpSPLIT_ASSIGN => 'ASSIGN',
OPpSPLIT_IMPLIM => 'IMPLIM',
OPpSPLIT_LEX => 'LEX',
@@ -802,17 +823,22 @@ our %labels = (
OPpTRANS_SQUASH => 'SQUASH',
OPpTRANS_USE_SVOP => 'USE_SVOP',
OPpTRUEBOOL => 'BOOL',
+ OPpUNDEF_KEEP_PV => 'KEEP_PV',
+ OPpUSEINT => 'USEINT',
);
our %ops_using = (
OPpALLOW_FAKE => [qw(rv2gv)],
+ OPpARG_IF_FALSE => [qw(argdefelem)],
OPpASSIGN_BACKWARDS => [qw(sassign)],
OPpASSIGN_COMMON_AGG => [qw(aassign)],
OPpCONCAT_NESTED => [qw(concat)],
OPpCONST_BARE => [qw(const)],
OPpCOREARGS_DEREF1 => [qw(coreargs)],
+ OPpDEFER_FINALLY => [qw(pushdefer)],
OPpEARLY_CV => [qw(gv)],
+ OPpEMPTYAVHV_IS_HV => [qw(emptyavhv)],
OPpENTERSUB_AMPER => [qw(entersub rv2cv)],
OPpENTERSUB_INARGS => [qw(entersub)],
OPpENTERSUB_NOPAREN => [qw(rv2cv)],
@@ -821,26 +847,29 @@ our %ops_using = (
OPpFLIP_LINENUM => [qw(flip flop)],
OPpFT_ACCESS => [qw(fteexec fteread ftewrite ftrexec ftrread ftrwrite)],
OPpFT_AFTER_t => [qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero)],
+ OPpHELEMEXISTSOR_DELETE => [qw(helemexistsor)],
OPpHINT_STRICT_REFS => [qw(entersub multideref rv2av rv2cv rv2gv rv2hv rv2sv)],
OPpHUSH_VMSISH => [qw(dbstate nextstate)],
OPpINDEX_BOOLNEG => [qw(index rindex)],
+ OPpINITFIELDS => [qw(methstart)],
+ OPpINITFIELD_AV => [qw(initfield)],
OPpITER_DEF => [qw(enteriter)],
OPpITER_REVERSED => [qw(enteriter iter)],
OPpKVSLICE => [qw(delete)],
OPpLIST_GUESSED => [qw(list)],
OPpLVALUE => [qw(leave leaveloop)],
OPpLVAL_DEFER => [qw(aelem helem multideref)],
- OPpLVAL_INTRO => [qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split)],
+ OPpLVAL_INTRO => [qw(aelem aslice cond_expr delete emptyavhv enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv padsv_store pushmark refassign rv2av rv2gv rv2hv rv2sv split undef)],
OPpLVREF_ELEM => [qw(lvref refassign)],
OPpMAYBE_LVSUB => [qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec)],
- OPpMAYBE_TRUEBOOL => [qw(padhv ref rv2hv)],
+ OPpMAYBE_TRUEBOOL => [qw(blessed padhv ref rv2hv)],
OPpMULTICONCAT_APPEND => [qw(multiconcat)],
OPpMULTIDEREF_DELETE => [qw(multideref)],
OPpOFFBYONE => [qw(caller runcv wantarray)],
OPpOPEN_IN_CRLF => [qw(backtick open)],
OPpOUR_INTRO => [qw(enteriter gvsv rv2av rv2hv rv2sv split)],
OPpPADHV_ISKEYS => [qw(padhv)],
- OPpPAD_STATE => [qw(lvavref lvref padav padhv padsv pushmark refassign)],
+ OPpPAD_STATE => [qw(emptyavhv lvavref lvref padav padhv padsv padsv_store pushmark refassign undef)],
OPpPV_IS_UTF8 => [qw(dump goto last next redo)],
OPpREFCOUNTED => [qw(leave leaveeval leavesub leavesublv leavewrite)],
OPpREPEAT_DOLIST => [qw(repeat)],
@@ -850,11 +879,14 @@ our %ops_using = (
OPpSORT_DESCEND => [qw(sort)],
OPpSPLIT_ASSIGN => [qw(split)],
OPpSUBSTR_REPL_FIRST => [qw(substr)],
- OPpTARGET_MY => [qw(abs add atan2 chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid)],
+ OPpTARGET_MY => [qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide emptyavhv exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time undef unlink unshift utime wait waitpid)],
OPpTRANS_CAN_FORCE_UTF8 => [qw(trans transr)],
- OPpTRUEBOOL => [qw(grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst)],
+ OPpTRUEBOOL => [qw(blessed grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst)],
+ OPpUNDEF_KEEP_PV => [qw(undef)],
+ OPpUSEINT => [qw(bit_and bit_or bit_xor complement left_shift nbit_and nbit_or nbit_xor ncomplement right_shift sbit_and sbit_or sbit_xor)],
);
+$ops_using{OPpARG_IF_UNDEF} = $ops_using{OPpARG_IF_FALSE};
$ops_using{OPpASSIGN_COMMON_RC1} = $ops_using{OPpASSIGN_COMMON_AGG};
$ops_using{OPpASSIGN_COMMON_SCALAR} = $ops_using{OPpASSIGN_COMMON_AGG};
$ops_using{OPpASSIGN_CV_TO_GV} = $ops_using{OPpASSIGN_BACKWARDS};
@@ -870,11 +902,13 @@ $ops_using{OPpDONT_INIT_GV} = $ops_using{OPpALLOW_FAKE};
$ops_using{OPpENTERSUB_DB} = $ops_using{OPpENTERSUB_AMPER};
$ops_using{OPpENTERSUB_HASTARG} = $ops_using{OPpENTERSUB_AMPER};
$ops_using{OPpEVAL_COPHH} = $ops_using{OPpEVAL_BYTES};
+$ops_using{OPpEVAL_EVALSV} = $ops_using{OPpEVAL_BYTES};
$ops_using{OPpEVAL_HAS_HH} = $ops_using{OPpEVAL_BYTES};
$ops_using{OPpEVAL_RE_REPARSING} = $ops_using{OPpEVAL_BYTES};
$ops_using{OPpEVAL_UNICODE} = $ops_using{OPpEVAL_BYTES};
$ops_using{OPpFT_STACKED} = $ops_using{OPpFT_AFTER_t};
$ops_using{OPpFT_STACKING} = $ops_using{OPpFT_AFTER_t};
+$ops_using{OPpINITFIELD_HV} = $ops_using{OPpINITFIELD_AV};
$ops_using{OPpLVREF_ITER} = $ops_using{OPpLVREF_ELEM};
$ops_using{OPpMAY_RETURN_CONSTANT} = $ops_using{OPpENTERSUB_NOPAREN};
$ops_using{OPpMULTICONCAT_FAKE} = $ops_using{OPpMULTICONCAT_APPEND};
@@ -888,8 +922,6 @@ $ops_using{OPpSORT_INPLACE} = $ops_using{OPpSORT_DESCEND};
$ops_using{OPpSORT_INTEGER} = $ops_using{OPpSORT_DESCEND};
$ops_using{OPpSORT_NUMERIC} = $ops_using{OPpSORT_DESCEND};
$ops_using{OPpSORT_REVERSE} = $ops_using{OPpSORT_DESCEND};
-$ops_using{OPpSORT_STABLE} = $ops_using{OPpSORT_DESCEND};
-$ops_using{OPpSORT_UNSTABLE} = $ops_using{OPpSORT_DESCEND};
$ops_using{OPpSPLIT_IMPLIM} = $ops_using{OPpSPLIT_ASSIGN};
$ops_using{OPpSPLIT_LEX} = $ops_using{OPpSPLIT_ASSIGN};
$ops_using{OPpTRANS_COMPLEMENT} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
@@ -899,4 +931,4 @@ $ops_using{OPpTRANS_IDENTICAL} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
$ops_using{OPpTRANS_SQUASH} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
$ops_using{OPpTRANS_USE_SVOP} = $ops_using{OPpTRANS_CAN_FORCE_UTF8};
-# ex: set ro:
+# ex: set ro ft=perl: