diff options
Diffstat (limited to 'systems/texlive/tlnet/tlpkg/tlperl/lib/B')
-rw-r--r-- | systems/texlive/tlnet/tlpkg/tlperl/lib/B/Concise.pm | 17 | ||||
-rw-r--r-- | systems/texlive/tlnet/tlpkg/tlperl/lib/B/Deparse.pm | 418 | ||||
-rw-r--r-- | systems/texlive/tlnet/tlpkg/tlperl/lib/B/Op_private.pm | 104 |
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: |