2 # Copyright (c) 1998-2000, 2002, 2003, 2004, 2005, 2006 Stephen McCamant.
4 # This module is free software; you can redistribute and/or modify
5 # it under the same terms as Perl itself.
7 # This is based on the module of the same name by Malcolm Beattie,
8 # but essentially none of his code remains.
12 use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
13 OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
14 OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS
15 OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
16 OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
17 OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST
18 OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE
19 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
20 SVs_PADTMP SVpad_TYPED
22 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
23 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED PMf_EXTENDED_MORE
26 MDEREF_AV_pop_rv2av_aelem
27 MDEREF_AV_gvsv_vivify_rv2av_aelem
28 MDEREF_AV_padsv_vivify_rv2av_aelem
29 MDEREF_AV_vivify_rv2av_aelem
32 MDEREF_HV_pop_rv2hv_helem
33 MDEREF_HV_gvsv_vivify_rv2hv_helem
34 MDEREF_HV_padsv_vivify_rv2hv_helem
35 MDEREF_HV_vivify_rv2hv_helem
51 use vars qw/$AUTOLOAD/;
56 # List version-specific constants here.
57 # Easiest way to keep this code portable between version looks to
58 # be to fake up a dummy constant that will never actually be true.
59 foreach (qw(OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED OPpCONST_NOVER
60 OPpPAD_STATE PMf_SKIPWHITE RXf_SKIPWHITE
61 RXf_PMf_CHARSET RXf_PMf_KEEPCOPY CVf_ANONCONST
62 CVf_LOCKED OPpREVERSE_INPLACE OPpSUBSTR_REPL_FIRST
63 PMf_NONDESTRUCT OPpCONST_ARYBASE OPpEVAL_BYTES
64 OPpLVREF_TYPE OPpLVREF_SV OPpLVREF_AV OPpLVREF_HV
65 OPpLVREF_CV OPpLVREF_ELEM SVpad_STATE)) {
68 *{$_} = sub () {0} unless *{$_}{CODE};
72 # Changes between 0.50 and 0.51:
73 # - fixed nulled leave with live enter in sort { }
74 # - fixed reference constants (\"str")
75 # - handle empty programs gracefully
76 # - handle infinite loops (for (;;) {}, while (1) {})
77 # - differentiate between 'for my $x ...' and 'my $x; for $x ...'
78 # - various minor cleanups
79 # - moved globals into an object
80 # - added '-u', like B::C
81 # - package declarations using cop_stash
82 # - subs, formats and code sorted by cop_seq
83 # Changes between 0.51 and 0.52:
84 # - added pp_threadsv (special variables under USE_5005THREADS)
85 # - added documentation
86 # Changes between 0.52 and 0.53:
87 # - many changes adding precedence contexts and associativity
88 # - added '-p' and '-s' output style options
89 # - various other minor fixes
90 # Changes between 0.53 and 0.54:
91 # - added support for new 'for (1..100)' optimization,
93 # Changes between 0.54 and 0.55:
94 # - added support for new qr// construct
95 # - added support for new pp_regcreset OP
96 # Changes between 0.55 and 0.56:
97 # - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
98 # - fixed $# on non-lexicals broken in last big rewrite
99 # - added temporary fix for change in opcode of OP_STRINGIFY
100 # - fixed problem in 0.54's for() patch in 'for (@ary)'
101 # - fixed precedence in conditional of ?:
102 # - tweaked list paren elimination in 'my($x) = @_'
103 # - made continue-block detection trickier wrt. null ops
104 # - fixed various prototype problems in pp_entersub
105 # - added support for sub prototypes that never get GVs
106 # - added unquoting for special filehandle first arg in truncate
107 # - print doubled rv2gv (a bug) as '*{*GV}' instead of illegal '**GV'
108 # - added semicolons at the ends of blocks
109 # - added -l '#line' declaration option -- fixes cmd/subval.t 27,28
110 # Changes between 0.56 and 0.561:
111 # - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
112 # - used new B.pm symbolic constants (done by Nick Ing-Simmons)
113 # Changes between 0.561 and 0.57:
114 # - stylistic changes to symbolic constant stuff
115 # - handled scope in s///e replacement code
116 # - added unquote option for expanding "" into concats, etc.
117 # - split method and proto parts of pp_entersub into separate functions
118 # - various minor cleanups
119 # Changes after 0.57:
120 # - added parens in \&foo (patch by Albert Dvornik)
121 # Changes between 0.57 and 0.58:
122 # - fixed '0' statements that weren't being printed
123 # - added methods for use from other programs
124 # (based on patches from James Duncan and Hugo van der Sanden)
125 # - added -si and -sT to control indenting (also based on a patch from Hugo)
126 # - added -sv to print something else instead of '???'
127 # - preliminary version of utf8 tr/// handling
128 # Changes after 0.58:
129 # - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
130 # - added support for Hugo's new OP_SETSTATE (like nextstate)
131 # Changes between 0.58 and 0.59
132 # - added support for Chip's OP_METHOD_NAMED
133 # - added support for Ilya's OPpTARGET_MY optimization
134 # - elided arrows before '()' subscripts when possible
135 # Changes between 0.59 and 0.60
136 # - support for method attributes was added
137 # - some warnings fixed
138 # - separate recognition of constant subs
139 # - rewrote continue block handling, now recognizing for loops
140 # - added more control of expanding control structures
141 # Changes between 0.60 and 0.61 (mostly by Robin Houston)
143 # - support for pragmas and 'use'
144 # - support for the little-used $[ variable
145 # - support for __DATA__ sections
147 # - BEGIN, CHECK, INIT and END blocks
148 # - scoping of subroutine declarations fixed
149 # - compile-time output from the input program can be suppressed, so that the
150 # output is just the deparsed code. (a change to O.pm in fact)
151 # - our() declarations
152 # - *all* the known bugs are now listed in the BUGS section
153 # - comprehensive test mechanism (TEST -deparse)
154 # Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
157 # - support for command-line switches (-l, -0, etc.)
158 # Changes between 0.63 and 0.64
159 # - support for //, CHECK blocks, and assertions
160 # - improved handling of foreach loops and lexicals
161 # - option to use Data::Dumper for constants
163 # - discovered lots more bugs not yet fixed
167 # Changes between 0.72 and 0.73
168 # - support new switch constructs
171 # (See also BUGS section at the end of this file)
173 # - finish tr/// changes
174 # - add option for even more parens (generalize \&foo change)
175 # - left/right context
176 # - copy comments (look at real text with $^P?)
177 # - avoid semis in one-statement blocks
178 # - associativity of &&=, ||=, ?:
179 # - ',' => '=>' (auto-unquote?)
180 # - break long lines ("\r" as discretionary break?)
181 # - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
182 # - more style options: brace style, hex vs. octal, quotes, ...
183 # - print big ints as hex/octal instead of decimal (heuristic?)
184 # - handle 'my $x if 0'?
185 # - version using op_next instead of op_first/sibling?
186 # - avoid string copies (pass arrays, one big join?)
189 # Current test.deparse failures
190 # comp/hints 6 - location of BEGIN blocks wrt. block openings
191 # run/switchI 1 - missing -I switches entirely
192 # perl -Ifoo -e 'print @INC'
193 # op/caller 2 - warning mask propagates backwards before warnings::register
194 # 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register'
195 # op/getpid 2 - can't assign to shared my() declaration (threads only)
196 # 'my $x : shared = 5'
197 # op/override 7 - parens on overridden require change v-string interpretation
198 # 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6'
199 # c.f. 'BEGIN { *f = sub {0} }; f 2'
200 # op/pat 774 - losing Unicode-ness of Latin1-only strings
201 # 'use charnames ":short"; $x="\N{latin:a with acute}"'
202 # op/recurse 12 - missing parens on recursive call makes it look like method
204 # op/subst 90 - inconsistent handling of utf8 under "use utf8"
205 # op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open
206 # op/tiehandle compile - "use strict" deparsed in the wrong place
208 # ext/B/t/xref 11 - line numbers when we add newlines to one-line subs
209 # ext/Data/Dumper/t/dumper compile
210 # ext/DB_file/several
212 # ext/Ernno/Errno warnings
213 # ext/IO/lib/IO/t/io_sel 23
214 # ext/PerlIO/t/encoding compile
215 # ext/POSIX/t/posix 6
216 # ext/Socket/Socket 8
217 # ext/Storable/t/croak compile
218 # lib/Attribute/Handlers/t/multi compile
219 # lib/bignum/ several
223 # lib/ExtUtils/t/bytes 4
224 # lib/File/DosGlob compile
225 # lib/Filter/Simple/t/data 1
226 # lib/Math/BigInt/t/constant 1
227 # lib/Net/t/config Deparse-warning
228 # lib/overload compile
229 # lib/Switch/ several
231 # lib/Test/Simple several
233 # lib/Tie/File/t/29_downcopy 5
239 # True when deparsing via $deparse->coderef2text; false when deparsing the
243 # (local($a), local($b)) and local($a, $b) have the same internal
244 # representation but the short form looks better. We notice we can
245 # use a large-scale local when checking the list, but need to prevent
246 # individual locals too. This hash holds the addresses of OPs that
247 # have already had their local-ness accounted for. The same thing
251 # CV for current sub (or main program) being deparsed
254 # Cached hash of lexical variables for curcv: keys are
255 # names prefixed with "m" or "o" (representing my/our), and
256 # each value is an array with two elements indicating the cop_seq
257 # of scopes in which a var of that name is valid and a third ele-
258 # ment referencing the pad name.
261 # COP for statement being deparsed
264 # name of the current package for deparsed code
267 # array of [cop_seq, CV, is_format?, name] for subs and formats we still
268 # want to deparse. The fourth element is a pad name thingy for lexical
269 # subs or a string for special blocks. For other subs, it is undef. For
270 # lexical subs, CV may be undef, indicating a stub declaration.
273 # as above, but [name, prototype] for subs that never got a GV
275 # subs_done, forms_done:
276 # keys are addresses of GVs for subs and formats we've already
277 # deparsed (or at least put into subs_todo)
280 # keys are names of subs for which we've printed declarations.
281 # That means we can omit parentheses from the arguments. It also means we
282 # need to put CORE:: on core functions of the same name.
285 # True when deparsing the replacement part of a substitution.
288 # True when deparsing the argument to \.
293 # cuddle: ' ' or '\n', depending on -sC
298 # A little explanation of how precedence contexts and associativity
301 # deparse() calls each per-op subroutine with an argument $cx (short
302 # for context, but not the same as the cx* in the perl core), which is
303 # a number describing the op's parents in terms of precedence, whether
304 # they're inside an expression or at statement level, etc. (see
305 # chart below). When ops with children call deparse on them, they pass
306 # along their precedence. Fractional values are used to implement
307 # associativity ('($x + $y) + $z' => '$x + $y + $y') and related
308 # parentheses hacks. The major disadvantage of this scheme is that
309 # it doesn't know about right sides and left sides, so say if you
310 # assign a listop to a variable, it can't tell it's allowed to leave
311 # the parens off the listop.
314 # 26 [TODO] inside interpolation context ("")
315 # 25 left terms and list operators (leftward)
319 # 21 right ! ~ \ and unary + and -
324 # 16 nonassoc named unary operators
325 # 15 nonassoc < > <= >= lt gt le ge
326 # 14 nonassoc == != <=> eq ne cmp
333 # 7 right = += -= *= etc.
335 # 5 nonassoc list operators (rightward)
339 # 1 statement modifiers
340 # 0.5 statements, but still print scopes as do { ... }
344 # Nonprinting characters with special meaning:
345 # \cS - steal parens (see maybe_parens_unop)
346 # \n - newline and indent
347 # \t - increase indent
348 # \b - decrease indent ('outdent')
349 # \f - flush left (no indent)
350 # \cK - kill following semicolon, if any
352 # Semicolon handling:
353 # - Individual statements are not deparsed with trailing semicolons.
354 # (If necessary, \cK is tacked on to the end.)
355 # - Whatever code joins statements together or emits them (lineseq,
356 # scopeop, deparse_root) is responsible for adding semicolons where
358 # - use statements are deparsed with trailing semicolons because they are
359 # immediately concatenated with the following statement.
360 # - indent() removes semicolons wherever it sees \cK.
363 BEGIN { for (qw[ const stringify rv2sv list glob pushmark null aelem
364 nextstate dbstate rv2av rv2hv helem custom ]) {
365 eval "sub OP_\U$_ () { " . opnumber($_) . "}"
368 # _pessimise_walk(): recursively walk the optree of a sub,
369 # possibly undoing optimisations along the way.
371 sub _pessimise_walk {
372 my ($self, $startop) = @_;
374 return unless $$startop;
376 for ($op = $startop; $$op; $prevop = $op, $op = $op->sibling) {
377 my $ppname = $op->name;
379 # pessimisations start here
381 if ($ppname eq "padrange") {
383 # the original optimisation either (1) changed this:
384 # pushmark -> (various pad and list and null ops) -> the_rest
385 # or (2), for the = @_ case, changed this:
386 # pushmark -> gv[_] -> rv2av -> (pad stuff) -> the_rest
388 # padrange ----------------------------------------> the_rest
389 # so we just need to convert the padrange back into a
390 # pushmark, and in case (1), set its op_next to op_sibling,
391 # which is the head of the original chain of optimised-away
392 # pad ops, or for (2), set it to sibling->first, which is
393 # the original gv[_].
395 $B::overlay->{$$op} = {
398 private => ($op->private & OPpLVAL_INTRO),
402 # pessimisations end here
404 if (class($op) eq 'PMOP'
405 && ref($op->pmreplroot)
406 && ${$op->pmreplroot}
407 && $op->pmreplroot->isa( 'B::OP' ))
409 $self-> _pessimise_walk($op->pmreplroot);
412 if ($op->flags & OPf_KIDS) {
413 $self-> _pessimise_walk($op->first);
420 # _pessimise_walk_exe(): recursively walk the op_next chain of a sub,
421 # possibly undoing optimisations along the way.
423 sub _pessimise_walk_exe {
424 my ($self, $startop, $visited) = @_;
426 return unless $$startop;
427 return if $visited->{$$startop};
429 for ($op = $startop; $$op; $prevop = $op, $op = $op->next) {
430 last if $visited->{$$op};
431 $visited->{$$op} = 1;
432 my $ppname = $op->name;
434 /^((and|d?or)(assign)?|(map|grep)while|range|cond_expr|once)$/
435 # entertry is also a logop, but its op_other invariably points
436 # into the same chain as the main execution path, so we skip it
438 $self->_pessimise_walk_exe($op->other, $visited);
440 elsif ($ppname eq "subst") {
441 $self->_pessimise_walk_exe($op->pmreplstart, $visited);
443 elsif ($ppname =~ /^(enter(loop|iter))$/) {
444 # redoop and nextop will already be covered by the main block
446 $self->_pessimise_walk_exe($op->lastop, $visited);
449 # pessimisations start here
453 # Go through an optree and "remove" some optimisations by using an
454 # overlay to selectively modify or un-null some ops. Deparsing in the
455 # absence of those optimisations is then easier.
457 # Note that older optimisations are not removed, as Deparse was already
458 # written to recognise them before the pessimise/overlay system was added.
461 my ($self, $root, $start) = @_;
463 # walk tree in root-to-branch order
464 $self->_pessimise_walk($root);
467 # walk tree in execution order
468 $self->_pessimise_walk_exe($start, \%visited);
474 return class($op) eq "NULL";
479 my($cv, $is_form, $name) = @_;
480 my $cvfile = $cv->FILE//'';
481 return unless ($cvfile eq $0 || exists $self->{files}{$cvfile});
483 if ($cv->OUTSIDE_SEQ) {
484 $seq = $cv->OUTSIDE_SEQ;
485 } elsif (!null($cv->START) and is_state($cv->START)) {
486 $seq = $cv->START->cop_seq;
490 push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form, $name];
495 my $ent = shift @{$self->{'subs_todo'}};
497 if (ref $ent->[3]) { # lexical sub
500 # At this point, we may not yet have deparsed the hints that allow
501 # lexical subroutines to be recognized. So adjust the current
502 # hints and deparse them.
503 # When lex subs cease being experimental, we should be able to
506 local $^H = $self->{'hints'};
507 local %^H = %{ $self->{'hinthash'} || {} };
508 local ${^WARNING_BITS} = $self->{'warnings'};
509 feature->import("lexical_subs");
510 warnings->unimport("experimental::lexical_subs");
511 # Here we depend on the fact that individual features
512 # will always set the feature bundle to ‘custom’
513 # (== $feature::hint_mask). If we had another specific bundle
514 # enabled previously, normalise it.
515 if (($self->{'hints'} & $feature::hint_mask)
516 != $feature::hint_mask)
518 if ($self->{'hinthash'}) {
519 delete $self->{'hinthash'}{$_}
520 for grep /^feature_/, keys %{$self->{'hinthash'}};
522 else { $self->{'hinthash'} = {} }
524 = _features_from_bundle(@$self{'hints','hinthash'});
526 push @text, $self->declare_hinthash($self->{'hinthash'}, \%^H,
527 $self->{indent_size}, $^H);
528 push @text, $self->declare_warnings($self->{'warnings'},
530 unless ($self->{'warnings'} // 'u')
531 eq (${^WARNING_BITS } // 'u');
532 $self->{'warnings'} = ${^WARNING_BITS};
533 $self->{'hints'} = $^H;
534 $self->{'hinthash'} = {%^H};
537 # Now emit the sub itself.
538 my $padname = $ent->[3];
539 my $flags = $padname->FLAGS;
541 !$cv || $ent->[0] <= $padname->COP_SEQ_RANGE_LOW
542 ? $self->keyword($flags & SVpad_OUR
544 : $flags & SVpad_STATE
548 # XXX We would do $self->keyword("sub"), but ‘my CORE::sub’
549 # doesn’t work and ‘my sub’ ignores a &sub in scope. I.e.,
550 # we have a core bug here.
551 push @text, "sub " . substr $padname->PVX, 1;
554 push @text, " " . $self->deparse_sub($cv);
555 $text[-1] =~ s/ ;$/;/;
561 return join "", @text;
564 my $name = $ent->[3] // $self->gv_name($gv);
566 return $self->keyword("format") . " $name =\n"
567 . $self->deparse_format($ent->[1]). "\n";
570 if ($name eq "BEGIN") {
571 $use_dec = $self->begin_is_use($cv);
572 if (defined ($use_dec) and $self->{'expand'} < 5) {
573 return () if 0 == length($use_dec);
574 $use_dec =~ s/^(use|no)\b/$self->keyword($1)/e;
578 if ($self->{'linenums'}) {
579 my $line = $gv->LINE;
580 my $file = $gv->FILE;
581 $l = "\n\f#line $line \"$file\"\n";
585 if (class($cv->STASH) ne "SPECIAL") {
586 $stash = $cv->STASH->NAME;
587 if ($stash ne $self->{'curstash'}) {
588 $p = $self->keyword("package") . " $stash;\n";
589 $name = "$self->{'curstash'}::$name" unless $name =~ /::/;
590 $self->{'curstash'} = $stash;
594 return "$p$l$use_dec";
596 if ( $name !~ /::/ and $self->lex_in_scope("&$name")
597 || $self->lex_in_scope("&$name", 1) )
599 $name = "$self->{'curstash'}::$name";
600 } elsif (defined $stash) {
601 $name =~ s/^\Q$stash\E::(?!\z|.*::)//;
603 my $ret = "${p}${l}" . $self->keyword("sub") . " $name "
604 . $self->deparse_sub($cv);
605 $self->{'subs_declared'}{$name} = 1;
610 # Return a "use" declaration for this BEGIN block, if appropriate
612 my ($self, $cv) = @_;
613 my $root = $cv->ROOT;
614 local @$self{qw'curcv curcvlex'} = ($cv);
615 local $B::overlay = {};
616 $self->pessimise($root, $cv->START);
618 #B::walkoptree($cv->ROOT, "debug");
619 my $lineseq = $root->first;
620 return if $lineseq->name ne "lineseq";
622 my $req_op = $lineseq->first->sibling;
623 return if $req_op->name ne "require";
626 if ($req_op->first->private & OPpCONST_BARE) {
627 # Actually it should always be a bareword
628 $module = $self->const_sv($req_op->first)->PV;
629 $module =~ s[/][::]g;
633 $module = $self->const($self->const_sv($req_op->first), 6);
637 my $version_op = $req_op->sibling;
638 return if class($version_op) eq "NULL";
639 if ($version_op->name eq "lineseq") {
640 # We have a version parameter; skip nextstate & pushmark
641 my $constop = $version_op->first->next->next;
643 return unless $self->const_sv($constop)->PV eq $module;
644 $constop = $constop->sibling;
645 $version = $self->const_sv($constop);
646 if (class($version) eq "IV") {
647 $version = $version->int_value;
648 } elsif (class($version) eq "NV") {
649 $version = $version->NV;
650 } elsif (class($version) ne "PVMG") {
651 # Includes PVIV and PVNV
652 $version = $version->PV;
654 # version specified as a v-string
655 $version = 'v'.join '.', map ord, split //, $version->PV;
657 $constop = $constop->sibling;
658 return if $constop->name ne "method_named";
659 return if $self->meth_sv($constop)->PV ne "VERSION";
662 $lineseq = $version_op->sibling;
663 return if $lineseq->name ne "lineseq";
664 my $entersub = $lineseq->first->sibling;
665 if ($entersub->name eq "stub") {
666 return "use $module $version ();\n" if defined $version;
667 return "use $module ();\n";
669 return if $entersub->name ne "entersub";
671 # See if there are import arguments
674 my $svop = $entersub->first->sibling; # Skip over pushmark
675 return unless $self->const_sv($svop)->PV eq $module;
677 # Pull out the arguments
678 for ($svop=$svop->sibling; index($svop->name, "method_") != 0;
679 $svop = $svop->sibling) {
680 $args .= ", " if length($args);
681 $args .= $self->deparse($svop, 6);
685 my $method_named = $svop;
686 return if $method_named->name ne "method_named";
687 my $method_name = $self->meth_sv($method_named)->PV;
689 if ($method_name eq "unimport") {
693 # Certain pragmas are dealt with using hint bits,
694 # so we ignore them here
695 if ($module eq 'strict' || $module eq 'integer'
696 || $module eq 'bytes' || $module eq 'warnings'
697 || $module eq 'feature') {
701 if (defined $version && length $args) {
702 return "$use $module $version ($args);\n";
703 } elsif (defined $version) {
704 return "$use $module $version;\n";
705 } elsif (length $args) {
706 return "$use $module ($args);\n";
708 return "$use $module;\n";
713 my ($self, $pack, $seen) = @_;
715 if (!defined $pack) {
720 $pack =~ s/(::)?$/::/;
722 $stash = \%{"main::$pack"};
726 $INC{"overload.pm"} ? overload::StrVal($stash) : $stash
728 my %stash = svref_2object($stash)->ARRAY;
729 while (my ($key, $val) = each %stash) {
730 my $flags = $val->FLAGS;
731 if ($flags & SVf_ROK) {
732 # A reference. Dump this if it is a reference to a CV. If it
733 # is a constant acting as a proxy for a full subroutine, then
734 # we may or may not have to dump it. If some form of perl-
735 # space visible code must have created it, be it a use
736 # statement, or some direct symbol-table manipulation code that
737 # we will deparse, then we don’t want to dump it. If it is the
738 # result of a declaration like sub f () { 42 } then we *do*
739 # want to dump it. The only way to distinguish these seems
740 # to be the SVs_PADTMP flag on the constant, which is admit-
742 my $class = class(my $referent = $val->RV);
743 if ($class eq "CV") {
744 $self->todo($referent, 0);
746 $class !~ /^(AV|HV|CV|FM|IO|SPECIAL)\z/
747 # A more robust way to write that would be this, but B does
748 # not provide the SVt_ constants:
749 # ($referent->FLAGS & B::SVTYPEMASK) < B::SVt_PVAV
750 and $referent->FLAGS & SVs_PADTMP
752 push @{$self->{'protos_todo'}}, [$pack . $key, $val];
754 } elsif ($flags & (SVf_POK|SVf_IOK)) {
755 # Just a prototype. As an ugly but fairly effective way
756 # to find out if it belongs here is to see if the AUTOLOAD
757 # (if any) for the stash was defined in one of our files.
758 my $A = $stash{"AUTOLOAD"};
759 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
760 && class($A->CV) eq "CV") {
762 next unless $AF eq $0 || exists $self->{'files'}{$AF};
764 push @{$self->{'protos_todo'}},
765 [$pack . $key, $flags & SVf_POK ? $val->PV: undef];
766 } elsif (class($val) eq "GV") {
767 if (class(my $cv = $val->CV) ne "SPECIAL") {
768 next if $self->{'subs_done'}{$$val}++;
769 next if $$val != ${$cv->GV}; # Ignore imposters
772 if (class(my $cv = $val->FORM) ne "SPECIAL") {
773 next if $self->{'forms_done'}{$$val}++;
774 next if $$val != ${$cv->GV}; # Ignore imposters
777 if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
778 $self->stash_subs($pack . $key, $seen);
788 foreach $ar (@{$self->{'protos_todo'}}) {
789 my $body = defined $ar->[1]
791 ? " () {\n " . $self->const($ar->[1]->RV,0) . ";\n}"
792 : " (". $ar->[1] . ");"
794 push @ret, "sub " . $ar->[0] . "$body\n";
796 delete $self->{'protos_todo'};
804 while (length($opt = substr($opts, 0, 1))) {
806 $self->{'cuddle'} = " ";
807 $opts = substr($opts, 1);
808 } elsif ($opt eq "i") {
809 $opts =~ s/^i(\d+)//;
810 $self->{'indent_size'} = $1;
811 } elsif ($opt eq "T") {
812 $self->{'use_tabs'} = 1;
813 $opts = substr($opts, 1);
814 } elsif ($opt eq "v") {
815 $opts =~ s/^v([^.]*)(.|$)//;
816 $self->{'ex_const'} = $1;
823 my $self = bless {}, $class;
824 $self->{'cuddle'} = "\n";
825 $self->{'curcop'} = undef;
826 $self->{'curstash'} = "main";
827 $self->{'ex_const'} = "'???'";
828 $self->{'expand'} = 0;
829 $self->{'files'} = {};
830 $self->{'indent_size'} = 4;
831 $self->{'linenums'} = 0;
832 $self->{'parens'} = 0;
833 $self->{'subs_todo'} = [];
834 $self->{'unquote'} = 0;
835 $self->{'use_dumper'} = 0;
836 $self->{'use_tabs'} = 0;
838 $self->{'ambient_arybase'} = 0;
839 $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
840 $self->{'ambient_hints'} = 0;
841 $self->{'ambient_hinthash'} = undef;
844 while (my $arg = shift @_) {
846 $self->{'use_dumper'} = 1;
847 require Data::Dumper;
848 } elsif ($arg =~ /^-f(.*)/) {
849 $self->{'files'}{$1} = 1;
850 } elsif ($arg eq "-l") {
851 $self->{'linenums'} = 1;
852 } elsif ($arg eq "-p") {
853 $self->{'parens'} = 1;
854 } elsif ($arg eq "-P") {
855 $self->{'noproto'} = 1;
856 } elsif ($arg eq "-q") {
857 $self->{'unquote'} = 1;
858 } elsif (substr($arg, 0, 2) eq "-s") {
859 $self->style_opts(substr $arg, 2);
860 } elsif ($arg =~ /^-x(\d)$/) {
861 $self->{'expand'} = $1;
868 # Mask out the bits that L<warnings::register> uses
871 $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
878 # Initialise the contextual information, either from
879 # defaults provided with the ambient_pragmas method,
880 # or from perl's own defaults otherwise.
884 $self->{'arybase'} = $self->{'ambient_arybase'};
885 $self->{'warnings'} = defined ($self->{'ambient_warnings'})
886 ? $self->{'ambient_warnings'} & WARN_MASK
888 $self->{'hints'} = $self->{'ambient_hints'};
889 $self->{'hints'} &= 0xFF if $] < 5.009;
890 $self->{'hinthash'} = $self->{'ambient_hinthash'};
892 # also a convenient place to clear out subs_declared
893 delete $self->{'subs_declared'};
899 my $self = B::Deparse->new(@args);
900 # First deparse command-line args
901 if (defined $^I) { # deparse -i
902 print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
904 if ($^W) { # deparse -w
905 print qq(BEGIN { \$^W = $^W; }\n);
907 if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
908 my $fs = perlstring($/) || 'undef';
909 my $bs = perlstring($O::savebackslash) || 'undef';
910 print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
912 my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
913 my @UNITCHECKs = B::unitcheck_av->isa("B::AV")
914 ? B::unitcheck_av->ARRAY
916 my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
917 my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
918 my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
919 my @names = qw(BEGIN UNITCHECK CHECK INIT END);
920 my @blocks = \(@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs);
922 my ($name, $blocks) = (shift @names, shift @blocks);
923 for my $block (@$blocks) {
924 $self->todo($block, 0, $name);
928 local($SIG{"__DIE__"}) =
930 if ($self->{'curcop'}) {
931 my $cop = $self->{'curcop'};
932 my($line, $file) = ($cop->line, $cop->file);
933 print STDERR "While deparsing $file near line $line,\n";
936 $self->{'curcv'} = main_cv;
937 $self->{'curcvlex'} = undef;
938 print $self->print_protos;
939 @{$self->{'subs_todo'}} =
940 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
941 my $root = main_root;
942 local $B::overlay = {};
943 unless (null $root) {
944 $self->pad_subs($self->{'curcv'});
945 # Check for a stub-followed-by-ex-cop, resulting from a program
946 # consisting solely of sub declarations. For backward-compati-
947 # bility (and sane output) we don’t want to emit the stub.
951 # ex-nextstate (or ex-dbstate)
953 if ( $root->name eq 'leave'
954 and ($kid = $root->first)->name eq 'enter'
955 and !null($kid = $kid->sibling) and $kid->name eq 'stub'
956 and !null($kid = $kid->sibling) and $kid->name eq 'null'
957 and class($kid) eq 'COP' and null $kid->sibling )
961 $self->pessimise($root, main_start);
962 print $self->indent($self->deparse_root($root)), "\n";
966 while (scalar(@{$self->{'subs_todo'}})) {
967 push @text, $self->next_todo;
969 print $self->indent(join("", @text)), "\n" if @text;
971 # Print __DATA__ section, if necessary
973 my $laststash = defined $self->{'curcop'}
974 ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
975 if (defined *{$laststash."::DATA"}{IO}) {
976 print $self->keyword("package") . " $laststash;\n"
977 unless $laststash eq $self->{'curstash'};
978 print $self->keyword("__DATA__") . "\n";
979 print readline(*{$laststash."::DATA"});
987 croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
990 local $self->{in_coderef2text} = 1;
991 return $self->indent($self->deparse_sub(svref_2object($sub)));
994 my %strict_bits = do {
996 map +($_ => strict::bits($_)), qw/refs subs vars/
999 sub ambient_pragmas {
1001 my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0);
1007 if ($name eq 'strict') {
1010 if ($val eq 'none') {
1011 $hint_bits &= $strict_bits{$_} for qw/refs subs vars/;
1016 if ($val eq "all") {
1017 @names = qw/refs subs vars/;
1023 @names = split' ', $val;
1025 $hint_bits |= $strict_bits{$_} for @names;
1028 elsif ($name eq '$[') {
1029 if (OPpCONST_ARYBASE) {
1032 croak "\$[ can't be non-zero on this perl" unless $val == 0;
1036 elsif ($name eq 'integer'
1038 || $name eq 'utf8') {
1041 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
1044 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
1048 elsif ($name eq 're') {
1050 if ($val eq 'none') {
1051 $hint_bits &= ~re::bits(qw/taint eval/);
1056 if ($val eq 'all') {
1057 @names = qw/taint eval/;
1063 @names = split' ',$val;
1065 $hint_bits |= re::bits(@names);
1068 elsif ($name eq 'warnings') {
1069 if ($val eq 'none') {
1070 $warning_bits = $warnings::NONE;
1079 @names = split/\s+/, $val;
1082 $warning_bits = $warnings::NONE if !defined ($warning_bits);
1083 $warning_bits |= warnings::bits(@names);
1086 elsif ($name eq 'warning_bits') {
1087 $warning_bits = $val;
1090 elsif ($name eq 'hint_bits') {
1094 elsif ($name eq '%^H') {
1099 croak "Unknown pragma type: $name";
1103 croak "The ambient_pragmas method expects an even number of args";
1106 $self->{'ambient_arybase'} = $arybase;
1107 $self->{'ambient_warnings'} = $warning_bits;
1108 $self->{'ambient_hints'} = $hint_bits;
1109 $self->{'ambient_hinthash'} = $hinthash;
1112 # This method is the inner loop, so try to keep it simple
1117 Carp::confess("Null op in deparse") if !defined($op)
1118 || class($op) eq "NULL";
1119 my $meth = "pp_" . $op->name;
1120 return $self->$meth($op, $cx);
1126 # \cK also swallows a preceding line break when followed by a
1128 $txt =~ s/\n\cK;//g;
1129 my @lines = split(/\n/, $txt);
1133 for $line (@lines) {
1134 my $cmd = substr($line, 0, 1);
1135 if ($cmd eq "\t" or $cmd eq "\b") {
1136 $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
1137 if ($self->{'use_tabs'}) {
1138 $leader = "\t" x ($level / 8) . " " x ($level % 8);
1140 $leader = " " x $level;
1142 $line = substr($line, 1);
1144 if (index($line, "\f") > 0) {
1147 if (substr($line, 0, 1) eq "\f") {
1148 $line = substr($line, 1); # no indent
1150 $line = $leader . $line;
1152 $line =~ s/\cK;?//g;
1154 return join("\n", @lines);
1158 my ($self, $cv) = @_;
1159 my $padlist = $cv->PADLIST;
1160 my @names = $padlist->ARRAYelt(0)->ARRAY;
1161 my @values = $padlist->ARRAYelt(1)->ARRAY;
1164 for my $ix (0.. $#names) { for $_ ($names[$ix]) {
1165 next if class($_) eq "SPECIAL";
1167 if (defined $name && $name =~ /^&./) {
1168 my $low = $_->COP_SEQ_RANGE_LOW;
1169 my $flags = $_->FLAGS;
1170 my $outer = $flags & PADNAMEt_OUTER;
1171 if ($flags & SVpad_OUR) {
1172 push @todo, [$low, undef, 0, $_]
1173 # [seq, no cv, not format, padname]
1177 my $protocv = $flags & SVpad_STATE
1180 if (class ($protocv) ne 'CV') {
1184 while ($flags & PADNAMEt_OUTER && class ($protocv) ne 'CV')
1187 next PADENTRY if class($cv) eq 'SPECIAL'; # XXX freed?
1188 my $padlist = $cv->PADLIST;
1189 my $ix = $name->PARENT_PAD_INDEX;
1190 $name = $padlist->NAMES->ARRAYelt($ix);
1191 $flags = $name->FLAGS;
1192 $protocv = $flags & SVpad_STATE
1193 ? $padlist->ARRAYelt(1)->ARRAYelt($ix)
1197 my $defined_in_this_sub = ${$protocv->OUTSIDE} == $$cv || do {
1198 my $other = $protocv->PADLIST;
1199 $$other && $other->outid == $padlist->id;
1201 if ($flags & PADNAMEt_OUTER) {
1202 next unless $defined_in_this_sub;
1203 push @todo, [$protocv->OUTSIDE_SEQ, $protocv, 0, $_];
1206 my $outseq = $protocv->OUTSIDE_SEQ;
1207 if ($outseq <= $low) {
1208 # defined before its name is visible, so it’s gotta be
1209 # declared and defined at once: my sub foo { ... }
1210 push @todo, [$low, $protocv, 0, $_];
1213 # declared and defined separately: my sub f; sub f { ... }
1214 push @todo, [$low, undef, 0, $_];
1215 push @todo, [$outseq, $protocv, 0, $_]
1216 if $defined_in_this_sub;
1220 @{$self->{'subs_todo'}} =
1221 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}}, @todo
1228 Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
1229 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
1230 local $self->{'curcop'} = $self->{'curcop'};
1231 if ($cv->FLAGS & SVf_POK) {
1232 $proto = "(". $cv->PV . ") ";
1234 if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) {
1236 $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
1237 $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
1238 $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
1239 $proto .= "const " if $cv->CvFLAGS & CVf_ANONCONST;
1242 local($self->{'curcv'}) = $cv;
1243 local($self->{'curcvlex'});
1244 local(@$self{qw'curstash warnings hints hinthash'})
1245 = @$self{qw'curstash warnings hints hinthash'};
1247 my $root = $cv->ROOT;
1248 local $B::overlay = {};
1249 if (not null $root) {
1250 $self->pad_subs($cv);
1251 $self->pessimise($root, $cv->START);
1252 my $lineseq = $root->first;
1253 if ($lineseq->name eq "lineseq") {
1255 for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
1258 $body = $self->lineseq(undef, 0, @ops).";";
1259 my $scope_en = $self->find_scope_en($lineseq);
1260 if (defined $scope_en) {
1261 my $subs = join"", $self->seq_subs($scope_en);
1262 $body .= ";\n$subs" if length($subs);
1266 $body = $self->deparse($root->first, 0);
1270 my $sv = $cv->const_sv;
1272 # uh-oh. inlinable sub... format it differently
1273 return $proto . "{ " . $self->const($sv, 0) . " }\n";
1274 } else { # XSUB? (or just a declaration)
1278 return $proto ."{\n\t$body\n\b}" ."\n";
1281 sub deparse_format {
1285 local($self->{'curcv'}) = $form;
1286 local($self->{'curcvlex'});
1287 local($self->{'in_format'}) = 1;
1288 local(@$self{qw'curstash warnings hints hinthash'})
1289 = @$self{qw'curstash warnings hints hinthash'};
1290 my $op = $form->ROOT;
1291 local $B::overlay = {};
1292 $self->pessimise($op, $form->START);
1294 return "\f." if $op->first->name eq 'stub'
1295 || $op->first->name eq 'nextstate';
1296 $op = $op->first->first; # skip leavewrite, lineseq
1297 while (not null $op) {
1298 $op = $op->sibling; # skip nextstate
1300 $kid = $op->first->sibling; # skip pushmark
1301 push @text, "\f".$self->const_sv($kid)->PV;
1302 $kid = $kid->sibling;
1303 for (; not null $kid; $kid = $kid->sibling) {
1304 push @exprs, $self->deparse($kid, -1);
1305 $exprs[-1] =~ s/;\z//;
1307 push @text, "\f".join(", ", @exprs)."\n" if @exprs;
1310 return join("", @text) . "\f.";
1315 return $op->name eq "leave" || $op->name eq "scope"
1316 || $op->name eq "lineseq"
1317 || ($op->name eq "null" && class($op) eq "UNOP"
1318 && (is_scope($op->first) || $op->first->name eq "enter"));
1322 my $name = $_[0]->name;
1323 return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
1326 sub is_miniwhile { # check for one-line loop ('foo() while $y--')
1328 return (!null($op) and null($op->sibling)
1329 and $op->name eq "null" and class($op) eq "UNOP"
1330 and (($op->first->name =~ /^(and|or)$/
1331 and $op->first->first->sibling->name eq "lineseq")
1332 or ($op->first->name eq "lineseq"
1333 and not null $op->first->first->sibling
1334 and $op->first->first->sibling->name eq "unstack")
1338 # Check if the op and its sibling are the initialization and the rest of a
1339 # for (..;..;..) { ... } loop
1342 # This OP might be almost anything, though it won't be a
1343 # nextstate. (It's the initialization, so in the canonical case it
1344 # will be an sassign.) The sibling is (old style) a lineseq whose
1345 # first child is a nextstate and whose second is a leaveloop, or
1346 # (new style) an unstack whose sibling is a leaveloop.
1347 my $lseq = $op->sibling;
1348 return 0 unless !is_state($op) and !null($lseq);
1349 if ($lseq->name eq "lineseq") {
1350 if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
1351 && (my $sib = $lseq->first->sibling)) {
1352 return (!null($sib) && $sib->name eq "leaveloop");
1354 } elsif ($lseq->name eq "unstack" && ($lseq->flags & OPf_SPECIAL)) {
1355 my $sib = $lseq->sibling;
1356 return $sib && !null($sib) && $sib->name eq "leaveloop";
1363 return ($op->name eq "rv2sv" or
1364 $op->name eq "padsv" or
1365 $op->name eq "gv" or # only in array/hash constructs
1366 $op->flags & OPf_KIDS && !null($op->first)
1367 && $op->first->name eq "gvsv");
1372 my($text, $cx, $prec) = @_;
1373 if ($prec < $cx # unary ops nest just fine
1374 or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
1375 or $self->{'parens'})
1378 # In a unop, let parent reuse our parens; see maybe_parens_unop
1379 $text = "\cS" . $text if $cx == 16;
1386 # same as above, but get around the 'if it looks like a function' rule
1387 sub maybe_parens_unop {
1389 my($name, $kid, $cx) = @_;
1390 if ($cx > 16 or $self->{'parens'}) {
1391 $kid = $self->deparse($kid, 1);
1392 if ($name eq "umask" && $kid =~ /^\d+$/) {
1393 $kid = sprintf("%#o", $kid);
1395 return $self->keyword($name) . "($kid)";
1397 $kid = $self->deparse($kid, 16);
1398 if ($name eq "umask" && $kid =~ /^\d+$/) {
1399 $kid = sprintf("%#o", $kid);
1401 $name = $self->keyword($name);
1402 if (substr($kid, 0, 1) eq "\cS") {
1404 return $name . substr($kid, 1);
1405 } elsif (substr($kid, 0, 1) eq "(") {
1406 # avoid looks-like-a-function trap with extra parens
1407 # ('+' can lead to ambiguities)
1408 return "$name(" . $kid . ")";
1410 return "$name $kid";
1415 sub maybe_parens_func {
1417 my($func, $text, $cx, $prec) = @_;
1418 if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
1419 return "$func($text)";
1421 return "$func $text";
1426 my ($self, $name) = @_;
1427 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1428 my $seq = $self->{'curcop'} ? $self->{'curcop'}->cop_seq : 0;
1429 for my $a (@{$self->{'curcvlex'}{"o$name"}}) {
1430 my ($st, undef, $padname) = @$a;
1431 if ($st >= $seq && $padname->FLAGS & SVpad_TYPED) {
1432 return $padname->SvSTASH->NAME;
1440 my($op, $cx, $text) = @_;
1441 my $name = $op->name;
1442 my $our_intro = ($name =~ /^(?:(?:gv|rv2)[ash]v|split|refassign
1446 my $lval_intro = $name eq 'split' ? 0 : OPpLVAL_INTRO;
1447 # The @a in \(@a) isn't in ref context, but only when the
1449 my $need_parens = $self->{'in_refgen'} && $name =~ /[ah]v\z/
1450 && ($op->flags & (OPf_PARENS|OPf_REF)) == OPf_PARENS;
1451 if ((my $priv = $op->private) & ($lval_intro|$our_intro)) {
1453 push @our_local, "local" if $priv & $lval_intro;
1454 push @our_local, "our" if $priv & $our_intro;
1455 my $our_local = join " ", map $self->keyword($_), @our_local;
1456 if( $our_local[-1] eq 'our' ) {
1457 if ( $text !~ /^\W(\w+::)*\w+\z/
1458 and !utf8::decode($text) || $text !~ /^\W(\w+::)*\w+\z/
1460 die "Unexpected our($text)\n";
1462 $text =~ s/(\w+::)+//;
1464 if (my $type = $self->find_our_type($text)) {
1465 $our_local .= ' ' . $type;
1468 return $need_parens ? "($text)" : $text
1469 if $self->{'avoid_local'}{$$op};
1471 return "$our_local($text)";
1472 } elsif (want_scalar($op)) {
1473 return "$our_local $text";
1475 return $self->maybe_parens_func("$our_local", $text, $cx, 16);
1478 return $need_parens ? "($text)" : $text;
1484 my($op, $cx, $func, @args) = @_;
1485 if ($op->private & OPpTARGET_MY) {
1486 my $var = $self->padname($op->targ);
1487 my $val = $func->($self, $op, 7, @args);
1488 return $self->maybe_parens("$var = $val", $cx, 7);
1490 return $func->($self, $op, $cx, @args);
1497 return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
1502 my($op, $cx, $text, $padname, $forbid_parens) = @_;
1503 # The @a in \(@a) isn't in ref context, but only when the
1505 my $need_parens = !$forbid_parens && $self->{'in_refgen'}
1506 && $op->name =~ /[ah]v\z/
1507 && ($op->flags & (OPf_PARENS|OPf_REF)) == OPf_PARENS;
1508 # The @a in \my @a must not have parens.
1509 if (!$need_parens && $self->{'in_refgen'}) {
1512 if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
1513 # Check $padname->FLAGS for statehood, rather than $op->private,
1514 # because enteriter ops do not carry the flag.
1516 $self->keyword($padname->FLAGS & SVpad_STATE ? "state" : "my");
1517 if ($padname->FLAGS & SVpad_TYPED) {
1518 $my .= ' ' . $padname->SvSTASH->NAME;
1521 return "$my($text)";
1522 } elsif ($forbid_parens || want_scalar($op)) {
1525 return $self->maybe_parens_func($my, $text, $cx, 16);
1528 return $need_parens ? "($text)" : $text;
1532 # The following OPs don't have functions:
1534 # pp_padany -- does not exist after parsing
1537 if ($AUTOLOAD =~ s/^.*::pp_//) {
1538 warn "unexpected OP_".
1539 ($_[1]->type == OP_CUSTOM ? "CUSTOM ($AUTOLOAD)" : uc $AUTOLOAD);
1542 die "Undefined subroutine $AUTOLOAD called";
1546 sub DESTROY {} # Do not AUTOLOAD
1548 # $root should be the op which represents the root of whatever
1549 # we're sequencing here. If it's undefined, then we don't append
1550 # any subroutine declarations to the deparsed ops, otherwise we
1551 # append appropriate declarations.
1553 my($self, $root, $cx, @ops) = @_;
1556 my $out_cop = $self->{'curcop'};
1557 my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
1559 if (defined $root) {
1560 $limit_seq = $out_seq;
1562 $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
1563 $limit_seq = $nseq if !defined($limit_seq)
1564 or defined($nseq) && $nseq < $limit_seq;
1566 $limit_seq = $self->{'limit_seq'}
1567 if defined($self->{'limit_seq'})
1568 && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
1569 local $self->{'limit_seq'} = $limit_seq;
1571 $self->walk_lineseq($root, \@ops,
1572 sub { push @exprs, $_[0]} );
1574 my $sep = $cx ? '; ' : ";\n";
1575 my $body = join($sep, grep {length} @exprs);
1577 if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
1578 $subs = join "\n", $self->seq_subs($limit_seq);
1580 return join($sep, grep {length} $body, $subs);
1584 my($real_block, $self, $op, $cx) = @_;
1588 local(@$self{qw'curstash warnings hints hinthash'})
1589 = @$self{qw'curstash warnings hints hinthash'} if $real_block;
1591 $kid = $op->first->sibling; # skip enter
1592 if (is_miniwhile($kid)) {
1593 my $top = $kid->first;
1594 my $name = $top->name;
1595 if ($name eq "and") {
1596 $name = $self->keyword("while");
1597 } elsif ($name eq "or") {
1598 $name = $self->keyword("until");
1599 } else { # no conditional -> while 1 or until 0
1600 return $self->deparse($top->first, 1) . " "
1601 . $self->keyword("while") . " 1";
1603 my $cond = $top->first;
1604 my $body = $cond->sibling->first; # skip lineseq
1605 $cond = $self->deparse($cond, 1);
1606 $body = $self->deparse($body, 1);
1607 return "$body $name $cond";
1612 for (; !null($kid); $kid = $kid->sibling) {
1615 if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
1616 my $body = $self->lineseq($op, 0, @kids);
1617 return is_lexical_subs(@kids)
1619 : ($self->lex_in_scope("&do") ? "CORE::do" : "do")
1620 . " {\n\t$body\n\b}";
1622 my $lineseq = $self->lineseq($op, $cx, @kids);
1623 return (length ($lineseq) ? "$lineseq;" : "");
1627 sub pp_scope { scopeop(0, @_); }
1628 sub pp_lineseq { scopeop(0, @_); }
1629 sub pp_leave { scopeop(1, @_); }
1631 # This is a special case of scopeop and lineseq, for the case of the
1632 # main_root. The difference is that we print the output statements as
1633 # soon as we get them, for the sake of impatient users.
1637 local(@$self{qw'curstash warnings hints hinthash'})
1638 = @$self{qw'curstash warnings hints hinthash'};
1640 return if null $op->first; # Can happen, e.g., for Bytecode without -k
1641 for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
1644 $self->walk_lineseq($op, \@kids,
1645 sub { return unless length $_[0];
1646 print $self->indent($_[0].';');
1648 unless $_[1] == $#kids;
1653 my ($self, $op, $kids, $callback) = @_;
1655 for (my $i = 0; $i < @kids; $i++) {
1657 if (is_state $kids[$i]) {
1658 $expr = $self->deparse($kids[$i++], 0);
1660 $callback->($expr, $i);
1664 if (is_for_loop($kids[$i])) {
1665 $callback->($expr . $self->for_loop($kids[$i], 0),
1666 $i += $kids[$i]->sibling->name eq "unstack" ? 2 : 1);
1669 my $expr2 = $self->deparse($kids[$i], (@kids != 1)/2);
1670 $expr2 =~ s/^sub :(?!:)/+sub :/; # statement label otherwise
1672 $callback->($expr, $i);
1676 # The BEGIN {} is used here because otherwise this code isn't executed
1677 # when you run B::Deparse on itself.
1679 BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1680 "ENV", "ARGV", "ARGVOUT", "_"); }
1686 #Carp::confess() unless ref($gv) eq "B::GV";
1687 my $cv = $gv->FLAGS & SVf_ROK ? $gv->RV : 0;
1688 my $stash = ($cv || $gv)->STASH->NAME;
1690 ? $cv ? $cv->NAME_HEK || $cv->GV->NAME : $gv->NAME
1692 ? B::safename($cv->NAME_HEK || $cv->GV->NAME)
1694 if ($stash eq 'main' && $name =~ /^::/) {
1697 elsif (($stash eq 'main'
1698 && ($globalnames{$name} || $name =~ /^[^A-Za-z_:]/))
1699 or ($stash eq $self->{'curstash'} && !$globalnames{$name}
1700 && ($stash eq 'main' || $name !~ /::/))
1705 $stash = $stash . "::";
1707 if (!$raw and $name =~ /^(\^..|{)/) {
1708 $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
1710 return $stash . $name;
1713 # Return the name to use for a stash variable.
1714 # If a lexical with the same name is in scope, or
1715 # if strictures are enabled, it may need to be
1717 sub stash_variable {
1718 my ($self, $prefix, $name, $cx) = @_;
1720 return "$prefix$name" if $name =~ /::/;
1722 unless ($prefix eq '$' || $prefix eq '@' || $prefix eq '&' || #'
1723 $prefix eq '%' || $prefix eq '$#') {
1724 return "$prefix$name";
1727 if ($name =~ /^[^[:alpha:]_+-]$/) {
1728 if (defined $cx && $cx == 26) {
1729 if ($prefix eq '@') {
1730 return "$prefix\{$name}";
1732 elsif ($name eq '#') { return '${#}' } # "${#}a" vs "$#a"
1734 if ($prefix eq '$#') {
1735 return "\$#{$name}";
1739 return $prefix . $self->maybe_qualify($prefix, $name);
1742 my %unctrl = # portable to EBCDIC
1744 "\c@" => '@', # unused
1771 "\c[" => '[', # unused
1772 "\c\\" => '\\', # unused
1773 "\c]" => ']', # unused
1774 "\c_" => '_', # unused
1777 # Return just the name, without the prefix. It may be returned as a quoted
1778 # string. The second return value is a boolean indicating that.
1779 sub stash_variable_name {
1780 my($self, $prefix, $gv) = @_;
1781 my $name = $self->gv_name($gv, 1);
1782 $name = $self->maybe_qualify($prefix,$name);
1783 if ($name =~ /^(?:\S|(?!\d)[\ca-\cz]?(?:\w|::)*|\d+)\z/) {
1784 $name =~ s/^([\ca-\cz])/'^' . $unctrl{$1}/e;
1785 $name =~ /^(\^..|{)/ and $name = "{$name}";
1786 return $name, 0; # not quoted
1789 single_delim("q", "'", $name, $self), 1;
1794 my ($self,$prefix,$name) = @_;
1795 my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1796 return $name if !$prefix || $name =~ /::/;
1797 return $self->{'curstash'}.'::'. $name
1799 $name =~ /^(?!\d)\w/ # alphabetic
1800 && $v !~ /^\$[ab]\z/ # not $a or $b
1801 && !$globalnames{$name} # not a global name
1802 && $self->{hints} & $strict_bits{vars} # strict vars
1803 && !$self->lex_in_scope($v,1) # no "our"
1804 or $self->lex_in_scope($v); # conflicts with "my" variable
1809 my ($self, $name, $our) = @_;
1810 substr $name, 0, 0, = $our ? 'o' : 'm'; # our/my
1811 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1813 return 0 if !defined($self->{'curcop'});
1814 my $seq = $self->{'curcop'}->cop_seq;
1815 return 0 if !exists $self->{'curcvlex'}{$name};
1816 for my $a (@{$self->{'curcvlex'}{$name}}) {
1817 my ($st, $en) = @$a;
1818 return 1 if $seq > $st && $seq <= $en;
1823 sub populate_curcvlex {
1825 for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
1826 my $padlist = $cv->PADLIST;
1827 # an undef CV still in lexical chain
1828 next if class($padlist) eq "SPECIAL";
1829 my @padlist = $padlist->ARRAY;
1830 my @ns = $padlist[0]->ARRAY;
1832 for (my $i=0; $i<@ns; ++$i) {
1833 next if class($ns[$i]) eq "SPECIAL";
1834 if (class($ns[$i]) eq "PV") {
1835 # Probably that pesky lexical @_
1838 my $name = $ns[$i]->PVX;
1839 next unless defined $name;
1840 my ($seq_st, $seq_en) =
1841 ($ns[$i]->FLAGS & SVf_FAKE)
1843 : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
1845 push @{$self->{'curcvlex'}{
1846 ($ns[$i]->FLAGS & SVpad_OUR ? 'o' : 'm') . $name
1847 }}, [$seq_st, $seq_en, $ns[$i]];
1852 sub find_scope_st { ((find_scope(@_))[0]); }
1853 sub find_scope_en { ((find_scope(@_))[1]); }
1855 # Recurses down the tree, looking for pad variable introductions and COPs
1857 my ($self, $op, $scope_st, $scope_en) = @_;
1858 carp("Undefined op in find_scope") if !defined $op;
1859 return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1862 while(my $op = shift @queue ) {
1863 for (my $o=$op->first; $$o; $o=$o->sibling) {
1864 if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1865 my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW);
1866 my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH;
1867 $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1868 $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1869 return ($scope_st, $scope_en);
1871 elsif (is_state($o)) {
1872 my $c = $o->cop_seq;
1873 $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1874 $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1875 return ($scope_st, $scope_en);
1877 elsif ($o->flags & OPf_KIDS) {
1878 unshift (@queue, $o);
1883 return ($scope_st, $scope_en);
1886 # Returns a list of subs which should be inserted before the COP
1888 my ($self, $op, $out_seq) = @_;
1889 my $seq = $op->cop_seq;
1890 if ($] < 5.021006) {
1891 # If we have nephews, then our sequence number indicates
1892 # the cop_seq of the end of some sort of scope.
1893 if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
1894 and my $nseq = $self->find_scope_st($op->sibling) ) {
1898 $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1899 return $self->seq_subs($seq);
1903 my ($self, $seq) = @_;
1905 #push @text, "# ($seq)\n";
1907 return "" if !defined $seq;
1909 while (scalar(@{$self->{'subs_todo'}})
1910 and $seq > $self->{'subs_todo'}[0][0]) {
1911 my $cv = $self->{'subs_todo'}[0][1];
1912 # Skip the OUTSIDE check for lexical subs. We may be deparsing a
1913 # cloned anon sub with lexical subs declared in it, in which case
1914 # the OUTSIDE pointer points to the anon protosub.
1915 my $lexical = ref $self->{'subs_todo'}[0][3];
1916 my $outside = !$lexical && $cv && $cv->OUTSIDE;
1917 if (!$lexical and $cv
1918 and ${$cv->OUTSIDE || \0} != ${$self->{'curcv'}})
1920 push @pending, shift @{$self->{'subs_todo'}};
1923 push @text, $self->next_todo;
1925 unshift @{$self->{'subs_todo'}}, @pending;
1929 sub _features_from_bundle {
1930 my ($hints, $hh) = @_;
1931 foreach (@{$feature::feature_bundle{@feature::hint_bundles[$hints >> $feature::hint_shift]}}) {
1932 $hh->{$feature::feature{$_}} = 1;
1937 # Notice how subs and formats are inserted between statements here;
1938 # also $[ assignments and pragmas.
1942 $self->{'curcop'} = $op;
1944 push @text, $self->cop_subs($op);
1946 # Special marker to swallow up the semicolon
1949 my $stash = $op->stashpv;
1950 if ($stash ne $self->{'curstash'}) {
1951 push @text, $self->keyword("package") . " $stash;\n";
1952 $self->{'curstash'} = $stash;
1955 if (OPpCONST_ARYBASE && $self->{'arybase'} != $op->arybase) {
1956 push @text, '$[ = '. $op->arybase .";\n";
1957 $self->{'arybase'} = $op->arybase;
1960 my $warnings = $op->warnings;
1962 if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
1963 $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
1965 elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
1966 $warning_bits = $warnings::NONE;
1968 elsif ($warnings->isa("B::SPECIAL")) {
1969 $warning_bits = undef;
1972 $warning_bits = $warnings->PV & WARN_MASK;
1975 if (defined ($warning_bits) and
1976 !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
1978 $self->declare_warnings($self->{'warnings'}, $warning_bits);
1979 $self->{'warnings'} = $warning_bits;
1982 my $hints = $] < 5.008009 ? $op->private : $op->hints;
1983 my $old_hints = $self->{'hints'};
1984 if ($self->{'hints'} != $hints) {
1985 push @text, $self->declare_hints($self->{'hints'}, $hints);
1986 $self->{'hints'} = $hints;
1991 $newhh = $op->hints_hash->HASH;
1994 if ($] >= 5.015006) {
1995 # feature bundle hints
1996 my $from = $old_hints & $feature::hint_mask;
1997 my $to = $ hints & $feature::hint_mask;
1999 if ($to == $feature::hint_mask) {
2000 if ($self->{'hinthash'}) {
2001 delete $self->{'hinthash'}{$_}
2002 for grep /^feature_/, keys %{$self->{'hinthash'}};
2004 else { $self->{'hinthash'} = {} }
2006 = _features_from_bundle($from, $self->{'hinthash'});
2010 $feature::hint_bundles[$to >> $feature::hint_shift];
2011 $bundle =~ s/(\d[13579])\z/$1+1/e; # 5.11 => 5.12
2013 $self->keyword("no") . " feature ':all';\n",
2014 $self->keyword("use") . " feature ':$bundle';\n";
2020 push @text, $self->declare_hinthash(
2021 $self->{'hinthash'}, $newhh,
2022 $self->{indent_size}, $self->{hints},
2024 $self->{'hinthash'} = $newhh;
2027 # This should go after of any branches that add statements, to
2028 # increase the chances that it refers to the same line it did in
2029 # the original program.
2030 if ($self->{'linenums'} && $cx != .5) { # $cx == .5 means in a format
2031 push @text, "\f#line " . $op->line .
2032 ' "' . $op->file, qq'"\n';
2035 push @text, $op->label . ": " if $op->label;
2037 return join("", @text);
2040 sub declare_warnings {
2041 my ($self, $from, $to) = @_;
2042 if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
2043 return $self->keyword("use") . " warnings;\n";
2045 elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
2046 return $self->keyword("no") . " warnings;\n";
2048 return "BEGIN {\${^WARNING_BITS} = \""
2049 . join("", map { sprintf("\\x%02x", ord $_) } split "", $to)
2054 my ($self, $from, $to) = @_;
2055 my $use = $to & ~$from;
2056 my $no = $from & ~$to;
2058 for my $pragma (hint_pragmas($use)) {
2059 $decls .= $self->keyword("use") . " $pragma;\n";
2061 for my $pragma (hint_pragmas($no)) {
2062 $decls .= $self->keyword("no") . " $pragma;\n";
2067 # Internal implementation hints that the core sets automatically, so don't need
2068 # (or want) to be passed back to the user
2069 my %ignored_hints = (
2080 sub declare_hinthash {
2081 my ($self, $from, $to, $indent, $hints) = @_;
2082 my $doing_features =
2083 ($hints & $feature::hint_mask) == $feature::hint_mask;
2086 my @unfeatures; # bugs?
2087 for my $key (sort keys %$to) {
2088 next if $ignored_hints{$key};
2089 my $is_feature = $key =~ /^feature_/ && $^V ge 5.15.6;
2090 next if $is_feature and not $doing_features;
2091 if (!exists $from->{$key} or $from->{$key} ne $to->{$key}) {
2092 push(@features, $key), next if $is_feature;
2094 qq(\$^H{) . single_delim("q", "'", $key, $self) . qq(} = )
2097 ? single_delim("q", "'", $to->{$key}, $self)
2103 for my $key (sort keys %$from) {
2104 next if $ignored_hints{$key};
2105 my $is_feature = $key =~ /^feature_/ && $^V ge 5.15.6;
2106 next if $is_feature and not $doing_features;
2107 if (!exists $to->{$key}) {
2108 push(@unfeatures, $key), next if $is_feature;
2109 push @decls, qq(delete \$^H{'$key'};);
2113 if (@features || @unfeatures) {
2114 if (!%rev_feature) { %rev_feature = reverse %feature::feature }
2117 push @ret, $self->keyword("use") . " feature "
2118 . join(", ", map "'$rev_feature{$_}'", @features) . ";\n";
2121 push @ret, $self->keyword("no") . " feature "
2122 . join(", ", map "'$rev_feature{$_}'", @unfeatures)
2127 join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n\cK";
2133 my (@pragmas, @strict);
2134 push @pragmas, "integer" if $bits & 0x1;
2135 for (sort keys %strict_bits) {
2136 push @strict, "'$_'" if $bits & $strict_bits{$_};
2138 if (@strict == keys %strict_bits) {
2139 push @pragmas, "strict";
2142 push @pragmas, "strict " . join ', ', @strict;
2144 push @pragmas, "bytes" if $bits & 0x8;
2148 sub pp_dbstate { pp_nextstate(@_) }
2149 sub pp_setstate { pp_nextstate(@_) }
2151 sub pp_unstack { return "" } # see also leaveloop
2153 my %feature_keywords = (
2154 # keyword => 'feature',
2159 default => 'switch',
2161 evalbytes=>'evalbytes',
2162 __SUB__ => '__SUB__',
2166 # keywords that are strong and also have a prototype
2168 my %strong_proto_keywords = map { $_ => 1 } qw(
2176 sub feature_enabled {
2177 my($self,$name) = @_;
2179 my $hints = $self->{hints} & $feature::hint_mask;
2180 if ($hints && $hints != $feature::hint_mask) {
2181 $hh = _features_from_bundle($hints);
2183 elsif ($hints) { $hh = $self->{'hinthash'} }
2184 return $hh && $hh->{"feature_$feature_keywords{$name}"}
2190 return $name if $name =~ /^CORE::/; # just in case
2191 if (exists $feature_keywords{$name}) {
2192 return "CORE::$name" if not $self->feature_enabled($name);
2194 # This sub may be called for a program that has no nextstate ops. In
2195 # that case we may have a lexical sub named no/use/sub in scope but
2196 # but $self->lex_in_scope will return false because it depends on the
2197 # current nextstate op. So we need this alternate method if there is
2199 if (!$self->{'curcop'}) {
2200 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
2201 return "CORE::$name" if exists $self->{'curcvlex'}{"m&$name"}
2202 || exists $self->{'curcvlex'}{"o&$name"};
2203 } elsif ($self->lex_in_scope("&$name")
2204 || $self->lex_in_scope("&$name", 1)) {
2205 return "CORE::$name";
2207 if ($strong_proto_keywords{$name}
2208 || ($name !~ /^(?:chom?p|do|exec|glob|s(?:elect|ystem))\z/
2209 && !defined eval{prototype "CORE::$name"})
2212 exists $self->{subs_declared}{$name}
2214 exists &{"$self->{curstash}::$name"}
2216 return "CORE::$name"
2223 my($op, $cx, $name) = @_;
2224 return $self->keyword($name);
2227 sub pp_stub { "()" }
2228 sub pp_wantarray { baseop(@_, "wantarray") }
2229 sub pp_fork { baseop(@_, "fork") }
2230 sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
2231 sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
2232 sub pp_time { maybe_targmy(@_, \&baseop, "time") }
2233 sub pp_tms { baseop(@_, "times") }
2234 sub pp_ghostent { baseop(@_, "gethostent") }
2235 sub pp_gnetent { baseop(@_, "getnetent") }
2236 sub pp_gprotoent { baseop(@_, "getprotoent") }
2237 sub pp_gservent { baseop(@_, "getservent") }
2238 sub pp_ehostent { baseop(@_, "endhostent") }
2239 sub pp_enetent { baseop(@_, "endnetent") }
2240 sub pp_eprotoent { baseop(@_, "endprotoent") }
2241 sub pp_eservent { baseop(@_, "endservent") }
2242 sub pp_gpwent { baseop(@_, "getpwent") }
2243 sub pp_spwent { baseop(@_, "setpwent") }
2244 sub pp_epwent { baseop(@_, "endpwent") }
2245 sub pp_ggrent { baseop(@_, "getgrent") }
2246 sub pp_sgrent { baseop(@_, "setgrent") }
2247 sub pp_egrent { baseop(@_, "endgrent") }
2248 sub pp_getlogin { baseop(@_, "getlogin") }
2250 sub POSTFIX () { 1 }
2252 # I couldn't think of a good short name, but this is the category of
2253 # symbolic unary operators with interesting precedence
2257 my($op, $cx, $name, $prec, $flags) = (@_, 0);
2258 my $kid = $op->first;
2259 $kid = $self->deparse($kid, $prec);
2260 return $self->maybe_parens(($flags & POSTFIX)
2262 # avoid confusion with filetests
2264 && $kid =~ /^[a-zA-Z](?!\w)/
2270 sub pp_preinc { pfixop(@_, "++", 23) }
2271 sub pp_predec { pfixop(@_, "--", 23) }
2272 sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
2273 sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
2274 sub pp_i_preinc { pfixop(@_, "++", 23) }
2275 sub pp_i_predec { pfixop(@_, "--", 23) }
2276 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
2277 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
2278 sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
2279 *pp_ncomplement = *pp_complement;
2280 sub pp_scomplement { maybe_targmy(@_, \&pfixop, "~.", 21) }
2282 sub pp_negate { maybe_targmy(@_, \&real_negate) }
2286 if ($op->first->name =~ /^(i_)?negate$/) {
2288 $self->pfixop($op, $cx, "-", 21.5);
2290 $self->pfixop($op, $cx, "-", 21);
2293 sub pp_i_negate { pp_negate(@_) }
2299 $self->listop($op, $cx, "not", $op->first);
2301 $self->pfixop($op, $cx, "!", 21);
2307 my($op, $cx, $name, $nollafr) = @_;
2309 if ($op->flags & OPf_KIDS) {
2312 # this deals with 'boolkeys' right now
2313 return $self->deparse($kid,$cx);
2315 my $builtinname = $name;
2316 $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name";
2317 if (defined prototype($builtinname)
2318 && $builtinname ne 'CORE::readline'
2319 && prototype($builtinname) =~ /^;?\*/
2320 && $kid->name eq "rv2gv") {
2325 if (($kid = $self->deparse($kid, 16)) !~ s/^\cS//) {
2326 # require foo() is a syntax error.
2327 $kid =~ /^(?!\d)\w/ and $kid = "($kid)";
2329 return $self->maybe_parens(
2330 $self->keyword($name) . " $kid", $cx, 16
2333 return $self->maybe_parens_unop($name, $kid, $cx);
2335 return $self->maybe_parens(
2336 $self->keyword($name) . ($op->flags & OPf_SPECIAL ? "()" : ""),
2342 sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
2343 sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
2344 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
2345 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
2346 sub pp_defined { unop(@_, "defined") }
2347 sub pp_undef { unop(@_, "undef") }
2348 sub pp_study { unop(@_, "study") }
2349 sub pp_ref { unop(@_, "ref") }
2350 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
2352 sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
2353 sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
2354 sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
2355 sub pp_srand { unop(@_, "srand") }
2356 sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
2357 sub pp_log { maybe_targmy(@_, \&unop, "log") }
2358 sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
2359 sub pp_int { maybe_targmy(@_, \&unop, "int") }
2360 sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
2361 sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
2362 sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
2364 sub pp_length { maybe_targmy(@_, \&unop, "length") }
2365 sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
2366 sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
2368 sub pp_each { unop(@_, "each") }
2369 sub pp_values { unop(@_, "values") }
2370 sub pp_keys { unop(@_, "keys") }
2371 { no strict 'refs'; *{"pp_r$_"} = *{"pp_$_"} for qw< keys each values >; }
2373 # no name because its an optimisation op that has no keyword
2376 sub pp_aeach { unop(@_, "each") }
2377 sub pp_avalues { unop(@_, "values") }
2378 sub pp_akeys { unop(@_, "keys") }
2379 sub pp_pop { unop(@_, "pop") }
2380 sub pp_shift { unop(@_, "shift") }
2382 sub pp_caller { unop(@_, "caller") }
2383 sub pp_reset { unop(@_, "reset") }
2384 sub pp_exit { unop(@_, "exit") }
2385 sub pp_prototype { unop(@_, "prototype") }
2387 sub pp_close { unop(@_, "close") }
2388 sub pp_fileno { unop(@_, "fileno") }
2389 sub pp_umask { unop(@_, "umask") }
2390 sub pp_untie { unop(@_, "untie") }
2391 sub pp_tied { unop(@_, "tied") }
2392 sub pp_dbmclose { unop(@_, "dbmclose") }
2393 sub pp_getc { unop(@_, "getc") }
2394 sub pp_eof { unop(@_, "eof") }
2395 sub pp_tell { unop(@_, "tell") }
2396 sub pp_getsockname { unop(@_, "getsockname") }
2397 sub pp_getpeername { unop(@_, "getpeername") }
2400 my ($self, $op, $cx) = @_;
2401 if (($op->flags & (OPf_SPECIAL|OPf_KIDS)) == (OPf_SPECIAL|OPf_KIDS)) {
2402 my $kw = $self->keyword("chdir");
2403 my $kid = $self->const_sv($op->first)->PV;
2405 . ($cx >= 16 || $self->{'parens'} ? "($kid)" : " $kid");
2406 maybe_targmy(@_, sub { $_[3] }, $code);
2408 maybe_targmy(@_, \&unop, "chdir")
2412 sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
2413 sub pp_readlink { unop(@_, "readlink") }
2414 sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
2415 sub pp_readdir { unop(@_, "readdir") }
2416 sub pp_telldir { unop(@_, "telldir") }
2417 sub pp_rewinddir { unop(@_, "rewinddir") }
2418 sub pp_closedir { unop(@_, "closedir") }
2419 sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
2420 sub pp_localtime { unop(@_, "localtime") }
2421 sub pp_gmtime { unop(@_, "gmtime") }
2422 sub pp_alarm { unop(@_, "alarm") }
2423 sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
2426 my $code = unop(@_, "do", 1); # llafr does not apply
2427 if ($code =~ s/^((?:CORE::)?do) \{/$1({/) { $code .= ')' }
2433 $_[1]->private & OPpEVAL_BYTES ? 'evalbytes' : "eval"
2437 sub pp_ghbyname { unop(@_, "gethostbyname") }
2438 sub pp_gnbyname { unop(@_, "getnetbyname") }
2439 sub pp_gpbyname { unop(@_, "getprotobyname") }
2440 sub pp_shostent { unop(@_, "sethostent") }
2441 sub pp_snetent { unop(@_, "setnetent") }
2442 sub pp_sprotoent { unop(@_, "setprotoent") }
2443 sub pp_sservent { unop(@_, "setservent") }
2444 sub pp_gpwnam { unop(@_, "getpwnam") }
2445 sub pp_gpwuid { unop(@_, "getpwuid") }
2446 sub pp_ggrnam { unop(@_, "getgrnam") }
2447 sub pp_ggrgid { unop(@_, "getgrgid") }
2449 sub pp_lock { unop(@_, "lock") }
2451 sub pp_continue { unop(@_, "continue"); }
2452 sub pp_break { unop(@_, "break"); }
2456 my($op, $cx, $givwhen) = @_;
2458 my $enterop = $op->first;
2460 if ($enterop->flags & OPf_SPECIAL) {
2461 $head = $self->keyword("default");
2462 $block = $self->deparse($enterop->first, 0);
2465 my $cond = $enterop->first;
2466 my $cond_str = $self->deparse($cond, 1);
2467 $head = "$givwhen ($cond_str)";
2468 $block = $self->deparse($cond->sibling, 0);
2476 sub pp_leavegiven { givwhen(@_, $_[0]->keyword("given")); }
2477 sub pp_leavewhen { givwhen(@_, $_[0]->keyword("when")); }
2483 my $name = $self->keyword("exists");
2484 if ($op->private & OPpEXISTS_SUB) {
2485 # Checking for the existence of a subroutine
2486 return $self->maybe_parens_func($name,
2487 $self->pp_rv2cv($op->first, 16), $cx, 16);
2489 if ($op->flags & OPf_SPECIAL) {
2490 # Array element, not hash element
2491 return $self->maybe_parens_func($name,
2492 $self->pp_aelem($op->first, 16), $cx, 16);
2494 return $self->maybe_parens_func($name, $self->pp_helem($op->first, 16),
2502 my $name = $self->keyword("delete");
2503 if ($op->private & OPpSLICE) {
2504 if ($op->flags & OPf_SPECIAL) {
2505 # Deleting from an array, not a hash
2506 return $self->maybe_parens_func($name,
2507 $self->pp_aslice($op->first, 16),
2510 return $self->maybe_parens_func($name,
2511 $self->pp_hslice($op->first, 16),
2514 if ($op->flags & OPf_SPECIAL) {
2515 # Deleting from an array, not a hash
2516 return $self->maybe_parens_func($name,
2517 $self->pp_aelem($op->first, 16),
2520 return $self->maybe_parens_func($name,
2521 $self->pp_helem($op->first, 16),
2529 my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
2530 my $kid = $op->first;
2531 if ($kid->name eq 'const') {
2532 my $priv = $kid->private;
2533 my $sv = $self->const_sv($kid);
2535 if ($priv & OPpCONST_BARE) {
2539 } elsif ($priv & OPpCONST_NOVER) {
2540 $opname = $self->keyword('no');
2541 $arg = $self->const($sv, 16);
2542 } elsif ((my $tmp = $self->const($sv, 16)) =~ /^v/) {
2546 return $self->maybe_parens("$opname $arg", $cx, 16);
2552 1, # llafr does not apply
2559 my $kid = $op->first;
2560 if (not null $kid->sibling) {
2561 # XXX Was a here-doc
2562 return $self->dquote($op);
2564 $self->unop(@_, "scalar");
2571 return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
2574 sub anon_hash_or_list {
2578 my($pre, $post) = @{{"anonlist" => ["[","]"],
2579 "anonhash" => ["{","}"]}->{$op->name}};
2581 $op = $op->first->sibling; # skip pushmark
2582 for (; !null($op); $op = $op->sibling) {
2583 $expr = $self->deparse($op, 6);
2586 if ($pre eq "{" and $cx < 1) {
2587 # Disambiguate that it's not a block
2590 return $pre . join(", ", @exprs) . $post;
2596 if ($op->flags & OPf_SPECIAL) {
2597 return $self->anon_hash_or_list($op, $cx);
2599 warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
2603 *pp_anonhash = \&pp_anonlist;
2608 my $kid = $op->first;
2609 if ($kid->name eq "null") {
2610 my $anoncode = $kid = $kid->first;
2611 if ($anoncode->name eq "anonconst") {
2612 $anoncode = $anoncode->first->first->sibling;
2614 if ($anoncode->name eq "anoncode"
2615 or !null($anoncode = $kid->sibling) and
2616 $anoncode->name eq "anoncode") {
2617 return $self->e_anoncode({ code => $self->padval($anoncode->targ) });
2618 } elsif ($kid->name eq "pushmark") {
2619 my $sib_name = $kid->sibling->name;
2620 if ($sib_name eq 'entersub') {
2621 my $text = $self->deparse($kid->sibling, 1);
2622 # Always show parens for \(&func()), but only with -p otherwise
2623 $text = "($text)" if $self->{'parens'}
2624 or $kid->sibling->private & OPpENTERSUB_AMPER;
2629 local $self->{'in_refgen'} = 1;
2630 $self->pfixop($op, $cx, "\\", 20);
2634 my ($self, $info) = @_;
2635 my $text = $self->deparse_sub($info->{code});
2636 return $self->keyword("sub") . " $text";
2639 sub pp_srefgen { pp_refgen(@_) }
2644 my $kid = $op->first;
2645 if (is_scalar($kid)) {
2646 my $kid_deparsed = $self->deparse($kid, 1);
2647 return '<<>>' if $op->flags & OPf_SPECIAL and $kid_deparsed eq 'ARGV';
2648 return "<$kid_deparsed>";
2650 return $self->unop($op, $cx, "readline");
2656 return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
2659 # Unary operators that can occur as pseudo-listops inside double quotes
2662 my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
2664 if ($op->flags & OPf_KIDS) {
2666 # If there's more than one kid, the first is an ex-pushmark.
2667 $kid = $kid->sibling if not null $kid->sibling;
2668 return $self->maybe_parens_unop($name, $kid, $cx);
2670 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
2674 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
2675 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
2676 sub pp_uc { dq_unop(@_, "uc") }
2677 sub pp_lc { dq_unop(@_, "lc") }
2678 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
2679 sub pp_fc { dq_unop(@_, "fc") }
2683 my ($op, $cx, $name) = @_;
2684 if (class($op) eq "PVOP") {
2685 $name .= " " . $op->pv;
2686 } elsif (class($op) eq "OP") {
2688 } elsif (class($op) eq "UNOP") {
2689 (my $kid = $self->deparse($op->first, 7)) =~ s/^\cS//;
2690 # last foo() is a syntax error.
2691 $kid =~ /^(?!\d)\w/ and $kid = "($kid)";
2694 return $self->maybe_parens($name, $cx, 7);
2697 sub pp_last { loopex(@_, "last") }
2698 sub pp_next { loopex(@_, "next") }
2699 sub pp_redo { loopex(@_, "redo") }
2700 sub pp_goto { loopex(@_, "goto") }
2701 sub pp_dump { loopex(@_, "CORE::dump") }
2705 my($op, $cx, $name) = @_;
2706 if (class($op) eq "UNOP") {
2707 # Genuine '-X' filetests are exempt from the LLAFR, but not
2709 if ($name =~ /^-/) {
2710 (my $kid = $self->deparse($op->first, 16)) =~ s/^\cS//;
2711 return $self->maybe_parens("$name $kid", $cx, 16);
2713 return $self->maybe_parens_unop($name, $op->first, $cx);
2714 } elsif (class($op) =~ /^(SV|PAD)OP$/) {
2715 return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
2716 } else { # I don't think baseop filetests ever survive ck_ftst, but...
2721 sub pp_lstat { ftst(@_, "lstat") }
2722 sub pp_stat { ftst(@_, "stat") }
2723 sub pp_ftrread { ftst(@_, "-R") }
2724 sub pp_ftrwrite { ftst(@_, "-W") }
2725 sub pp_ftrexec { ftst(@_, "-X") }
2726 sub pp_fteread { ftst(@_, "-r") }
2727 sub pp_ftewrite { ftst(@_, "-w") }
2728 sub pp_fteexec { ftst(@_, "-x") }
2729 sub pp_ftis { ftst(@_, "-e") }
2730 sub pp_fteowned { ftst(@_, "-O") }
2731 sub pp_ftrowned { ftst(@_, "-o") }
2732 sub pp_ftzero { ftst(@_, "-z") }
2733 sub pp_ftsize { ftst(@_, "-s") }
2734 sub pp_ftmtime { ftst(@_, "-M") }
2735 sub pp_ftatime { ftst(@_, "-A") }
2736 sub pp_ftctime { ftst(@_, "-C") }
2737 sub pp_ftsock { ftst(@_, "-S") }
2738 sub pp_ftchr { ftst(@_, "-c") }
2739 sub pp_ftblk { ftst(@_, "-b") }
2740 sub pp_ftfile { ftst(@_, "-f") }
2741 sub pp_ftdir { ftst(@_, "-d") }
2742 sub pp_ftpipe { ftst(@_, "-p") }
2743 sub pp_ftlink { ftst(@_, "-l") }
2744 sub pp_ftsuid { ftst(@_, "-u") }
2745 sub pp_ftsgid { ftst(@_, "-g") }
2746 sub pp_ftsvtx { ftst(@_, "-k") }
2747 sub pp_fttty { ftst(@_, "-t") }
2748 sub pp_fttext { ftst(@_, "-T") }
2749 sub pp_ftbinary { ftst(@_, "-B") }
2751 sub SWAP_CHILDREN () { 1 }
2752 sub ASSIGN () { 2 } # has OP= variant
2753 sub LIST_CONTEXT () { 4 } # Assignment is in list context
2759 my $name = $op->name;
2760 if ($name eq "concat" and $op->first->name eq "concat") {
2761 # avoid spurious '=' -- see comment in pp_concat
2764 if ($name eq "null" and class($op) eq "UNOP"
2765 and $op->first->name =~ /^(and|x?or)$/
2766 and null $op->first->sibling)
2768 # Like all conditional constructs, OP_ANDs and OP_ORs are topped
2769 # with a null that's used as the common end point of the two
2770 # flows of control. For precedence purposes, ignore it.
2771 # (COND_EXPRs have these too, but we don't bother with
2772 # their associativity).
2773 return assoc_class($op->first);
2775 return $name . ($op->flags & OPf_STACKED ? "=" : "");
2778 # Left associative operators, like '+', for which
2779 # $a + $b + $c is equivalent to ($a + $b) + $c
2782 %left = ('multiply' => 19, 'i_multiply' => 19,
2783 'divide' => 19, 'i_divide' => 19,
2784 'modulo' => 19, 'i_modulo' => 19,
2786 'add' => 18, 'i_add' => 18,
2787 'subtract' => 18, 'i_subtract' => 18,
2789 'left_shift' => 17, 'right_shift' => 17,
2790 'bit_and' => 13, 'nbit_and' => 13, 'sbit_and' => 13,
2791 'bit_or' => 12, 'bit_xor' => 12,
2792 'sbit_or' => 12, 'sbit_xor' => 12,
2793 'nbit_or' => 12, 'nbit_xor' => 12,
2795 'or' => 2, 'xor' => 2,
2799 sub deparse_binop_left {
2801 my($op, $left, $prec) = @_;
2802 if ($left{assoc_class($op)} && $left{assoc_class($left)}
2803 and $left{assoc_class($op)} == $left{assoc_class($left)})
2805 return $self->deparse($left, $prec - .00001);
2807 return $self->deparse($left, $prec);
2811 # Right associative operators, like '=', for which
2812 # $a = $b = $c is equivalent to $a = ($b = $c)
2815 %right = ('pow' => 22,
2816 'sassign=' => 7, 'aassign=' => 7,
2817 'multiply=' => 7, 'i_multiply=' => 7,
2818 'divide=' => 7, 'i_divide=' => 7,
2819 'modulo=' => 7, 'i_modulo=' => 7,
2820 'repeat=' => 7, 'refassign' => 7, 'refassign=' => 7,
2821 'add=' => 7, 'i_add=' => 7,
2822 'subtract=' => 7, 'i_subtract=' => 7,
2824 'left_shift=' => 7, 'right_shift=' => 7,
2825 'bit_and=' => 7, 'sbit_and=' => 7, 'nbit_and=' => 7,
2826 'nbit_or=' => 7, 'nbit_xor=' => 7,
2827 'sbit_or=' => 7, 'sbit_xor=' => 7,
2833 sub deparse_binop_right {
2835 my($op, $right, $prec) = @_;
2836 if ($right{assoc_class($op)} && $right{assoc_class($right)}
2837 and $right{assoc_class($op)} == $right{assoc_class($right)})
2839 return $self->deparse($right, $prec - .00001);
2841 return $self->deparse($right, $prec);
2847 my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
2848 my $left = $op->first;
2849 my $right = $op->last;
2851 if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
2855 if ($flags & SWAP_CHILDREN) {
2856 ($left, $right) = ($right, $left);
2859 $left = $self->deparse_binop_left($op, $left, $prec);
2860 $left = "($left)" if $flags & LIST_CONTEXT
2861 and $left !~ /^(my|our|local|)[\@\(]/
2863 # Parenthesize if the left argument is a
2865 my $left = $leftop->first->sibling;
2866 $left->name eq 'repeat'
2867 && null($left->sibling);
2869 $right = $self->deparse_binop_right($op, $right, $prec);
2870 return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
2873 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2874 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2875 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
2876 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2877 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2878 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2879 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2880 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
2881 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2882 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2883 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
2885 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
2886 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
2887 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
2888 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
2889 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
2890 *pp_nbit_and = *pp_bit_and;
2891 *pp_nbit_or = *pp_bit_or;
2892 *pp_nbit_xor = *pp_bit_xor;
2893 sub pp_sbit_and { maybe_targmy(@_, \&binop, "&.", 13, ASSIGN) }
2894 sub pp_sbit_or { maybe_targmy(@_, \&binop, "|.", 12, ASSIGN) }
2895 sub pp_sbit_xor { maybe_targmy(@_, \&binop, "^.", 12, ASSIGN) }
2897 sub pp_eq { binop(@_, "==", 14) }
2898 sub pp_ne { binop(@_, "!=", 14) }
2899 sub pp_lt { binop(@_, "<", 15) }
2900 sub pp_gt { binop(@_, ">", 15) }
2901 sub pp_ge { binop(@_, ">=", 15) }
2902 sub pp_le { binop(@_, "<=", 15) }
2903 sub pp_ncmp { binop(@_, "<=>", 14) }
2904 sub pp_i_eq { binop(@_, "==", 14) }
2905 sub pp_i_ne { binop(@_, "!=", 14) }
2906 sub pp_i_lt { binop(@_, "<", 15) }
2907 sub pp_i_gt { binop(@_, ">", 15) }
2908 sub pp_i_ge { binop(@_, ">=", 15) }
2909 sub pp_i_le { binop(@_, "<=", 15) }
2910 sub pp_i_ncmp { maybe_targmy(@_, \&binop, "<=>", 14) }
2912 sub pp_seq { binop(@_, "eq", 14) }
2913 sub pp_sne { binop(@_, "ne", 14) }
2914 sub pp_slt { binop(@_, "lt", 15) }
2915 sub pp_sgt { binop(@_, "gt", 15) }
2916 sub pp_sge { binop(@_, "ge", 15) }
2917 sub pp_sle { binop(@_, "le", 15) }
2918 sub pp_scmp { maybe_targmy(@_, \&binop, "cmp", 14) }
2920 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
2921 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
2924 my ($self, $op, $cx) = @_;
2925 if ($op->flags & OPf_SPECIAL) {
2926 return $self->deparse($op->last, $cx);
2929 binop(@_, "~~", 14);
2933 # '.' is special because concats-of-concats are optimized to save copying
2934 # by making all but the first concat stacked. The effect is as if the
2935 # programmer had written '($a . $b) .= $c', except legal.
2936 sub pp_concat { maybe_targmy(@_, \&real_concat) }
2940 my $left = $op->first;
2941 my $right = $op->last;
2944 if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
2948 $left = $self->deparse_binop_left($op, $left, $prec);
2949 $right = $self->deparse_binop_right($op, $right, $prec);
2950 return $self->maybe_parens("$left .$eq $right", $cx, $prec);
2953 sub pp_repeat { maybe_targmy(@_, \&repeat) }
2955 # 'x' is weird when the left arg is a list
2959 my $left = $op->first;
2960 my $right = $op->last;
2963 if ($op->flags & OPf_STACKED) {
2967 if (null($right)) { # list repeat; count is inside left-side ex-list
2968 # in 5.21.5 and earlier
2969 my $kid = $left->first->sibling; # skip pushmark
2971 for (; !null($kid->sibling); $kid = $kid->sibling) {
2972 push @exprs, $self->deparse($kid, 6);
2975 $left = "(" . join(", ", @exprs). ")";
2977 my $dolist = $op->private & OPpREPEAT_DOLIST;
2978 $left = $self->deparse_binop_left($op, $left, $dolist ? 1 : $prec);
2983 $right = $self->deparse_binop_right($op, $right, $prec);
2984 return $self->maybe_parens("$left x$eq $right", $cx, $prec);
2989 my ($op, $cx, $type) = @_;
2990 my $left = $op->first;
2991 my $right = $left->sibling;
2992 $left = $self->deparse($left, 9);
2993 $right = $self->deparse($right, 9);
2994 return $self->maybe_parens("$left $type $right", $cx, 9);
3000 my $flip = $op->first;
3001 my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
3002 return $self->range($flip->first, $cx, $type);
3005 # one-line while/until is handled in pp_leave
3009 my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
3010 my $left = $op->first;
3011 my $right = $op->first->sibling;
3012 $blockname &&= $self->keyword($blockname);
3013 if ($cx < 1 and is_scope($right) and $blockname
3014 and $self->{'expand'} < 7)
3016 $left = $self->deparse($left, 1);
3017 $right = $self->deparse($right, 0);
3018 return "$blockname ($left) {\n\t$right\n\b}\cK";
3019 } elsif ($cx < 1 and $blockname and not $self->{'parens'}
3020 and $self->{'expand'} < 7) { # $b if $a
3021 $right = $self->deparse($right, 1);
3022 $left = $self->deparse($left, 1);
3023 return "$right $blockname $left";
3024 } elsif ($cx > $lowprec and $highop) { # $a && $b
3025 $left = $self->deparse_binop_left($op, $left, $highprec);
3026 $right = $self->deparse_binop_right($op, $right, $highprec);
3027 return $self->maybe_parens("$left $highop $right", $cx, $highprec);
3028 } else { # $a and $b
3029 $left = $self->deparse_binop_left($op, $left, $lowprec);
3030 $right = $self->deparse_binop_right($op, $right, $lowprec);
3031 return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
3035 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
3036 sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
3037 sub pp_dor { logop(@_, "//", 10) }
3039 # xor is syntactically a logop, but it's really a binop (contrary to
3040 # old versions of opcode.pl). Syntax is what matters here.
3041 sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
3045 my ($op, $cx, $opname) = @_;
3046 my $left = $op->first;
3047 my $right = $op->first->sibling->first; # skip sassign
3048 $left = $self->deparse($left, 7);
3049 $right = $self->deparse($right, 7);
3050 return $self->maybe_parens("$left $opname $right", $cx, 7);
3053 sub pp_andassign { logassignop(@_, "&&=") }
3054 sub pp_orassign { logassignop(@_, "||=") }
3055 sub pp_dorassign { logassignop(@_, "//=") }
3057 sub rv2gv_or_string {
3059 if ($op->name eq "gv") { # could be open("open") or open("###")
3061 $self->stash_variable_name("", $self->gv_or_padgv($op));
3062 $quoted ? $name : "*$name";
3065 $self->deparse($op, 6);
3071 my($op, $cx, $name, $kid, $nollafr) = @_;
3073 my $parens = ($cx >= 5) || $self->{'parens'};
3074 $kid ||= $op->first->sibling;
3075 # If there are no arguments, add final parentheses (or parenthesize the
3076 # whole thing if the llafr does not apply) to account for cases like
3077 # (return)+1 or setpgrp()+1. When the llafr does not apply, we use a
3078 # precedence of 6 (< comma), as "return, 1" does not need parentheses.
3081 ? $self->maybe_parens($self->keyword($name), $cx, 7)
3082 : $self->keyword($name) . '()' x (7 < $cx);
3085 my $fullname = $self->keyword($name);
3086 my $proto = prototype("CORE::$name");
3088 ( (defined $proto && $proto =~ /^;?\*/)
3089 || $name eq 'select' # select(F) doesn't have a proto
3091 && $kid->name eq "rv2gv"
3092 && !($kid->private & OPpLVAL_INTRO)
3094 $first = $self->rv2gv_or_string($kid->first);
3097 $first = $self->deparse($kid, 6);
3099 if ($name eq "chmod" && $first =~ /^\d+$/) {
3100 $first = sprintf("%#o", $first);
3103 if not $parens and not $nollafr and substr($first, 0, 1) eq "(";
3104 push @exprs, $first;
3105 $kid = $kid->sibling;
3106 if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv"
3107 && !($kid->private & OPpLVAL_INTRO)) {
3108 push @exprs, $first = $self->rv2gv_or_string($kid->first);
3109 $kid = $kid->sibling;
3111 for (; !null($kid); $kid = $kid->sibling) {
3112 push @exprs, $self->deparse($kid, 6);
3114 if ($name eq "reverse" && ($op->private & OPpREVERSE_INPLACE)) {
3115 return "$exprs[0] = $fullname"
3116 . ($parens ? "($exprs[0])" : " $exprs[0]");
3119 if ($parens && $nollafr) {
3120 return "($fullname " . join(", ", @exprs) . ")";
3122 return "$fullname(" . join(", ", @exprs) . ")";
3124 return "$fullname " . join(", ", @exprs);
3128 sub pp_bless { listop(@_, "bless") }
3129 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
3131 my ($self,$op,$cx) = @_;
3132 if ($op->private & OPpSUBSTR_REPL_FIRST) {
3134 listop($self, $op, 7, "substr", $op->first->sibling->sibling)
3136 . $self->deparse($op->first->sibling, 7);
3138 maybe_local(@_, listop(@_, "substr"))
3140 sub pp_vec { maybe_targmy(@_, \&maybe_local, listop(@_, "vec")) }
3141 sub pp_index { maybe_targmy(@_, \&listop, "index") }
3142 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
3143 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
3144 sub pp_formline { listop(@_, "formline") } # see also deparse_format
3145 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
3146 sub pp_unpack { listop(@_, "unpack") }
3147 sub pp_pack { listop(@_, "pack") }
3148 sub pp_join { maybe_targmy(@_, \&listop, "join") }
3149 sub pp_splice { listop(@_, "splice") }
3150 sub pp_push { maybe_targmy(@_, \&listop, "push") }
3151 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
3152 sub pp_reverse { listop(@_, "reverse") }
3153 sub pp_warn { listop(@_, "warn") }
3154 sub pp_die { listop(@_, "die") }
3155 sub pp_return { listop(@_, "return", undef, 1) } # llafr does not apply
3156 sub pp_open { listop(@_, "open") }
3157 sub pp_pipe_op { listop(@_, "pipe") }
3158 sub pp_tie { listop(@_, "tie") }
3159 sub pp_binmode { listop(@_, "binmode") }
3160 sub pp_dbmopen { listop(@_, "dbmopen") }
3161 sub pp_sselect { listop(@_, "select") }
3162 sub pp_select { listop(@_, "select") }
3163 sub pp_read { listop(@_, "read") }
3164 sub pp_sysopen { listop(@_, "sysopen") }
3165 sub pp_sysseek { listop(@_, "sysseek") }
3166 sub pp_sysread { listop(@_, "sysread") }
3167 sub pp_syswrite { listop(@_, "syswrite") }
3168 sub pp_send { listop(@_, "send") }
3169 sub pp_recv { listop(@_, "recv") }
3170 sub pp_seek { listop(@_, "seek") }
3171 sub pp_fcntl { listop(@_, "fcntl") }
3172 sub pp_ioctl { listop(@_, "ioctl") }
3173 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
3174 sub pp_socket { listop(@_, "socket") }
3175 sub pp_sockpair { listop(@_, "socketpair") }
3176 sub pp_bind { listop(@_, "bind") }
3177 sub pp_connect { listop(@_, "connect") }
3178 sub pp_listen { listop(@_, "listen") }
3179 sub pp_accept { listop(@_, "accept") }
3180 sub pp_shutdown { listop(@_, "shutdown") }
3181 sub pp_gsockopt { listop(@_, "getsockopt") }
3182 sub pp_ssockopt { listop(@_, "setsockopt") }
3183 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
3184 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
3185 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
3186 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
3187 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
3188 sub pp_link { maybe_targmy(@_, \&listop, "link") }
3189 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
3190 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
3191 sub pp_open_dir { listop(@_, "opendir") }
3192 sub pp_seekdir { listop(@_, "seekdir") }
3193 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
3194 sub pp_system { maybe_targmy(@_, \&indirop, "system") }
3195 sub pp_exec { maybe_targmy(@_, \&indirop, "exec") }
3196 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
3197 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
3198 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
3199 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
3200 sub pp_shmget { listop(@_, "shmget") }
3201 sub pp_shmctl { listop(@_, "shmctl") }
3202 sub pp_shmread { listop(@_, "shmread") }
3203 sub pp_shmwrite { listop(@_, "shmwrite") }
3204 sub pp_msgget { listop(@_, "msgget") }
3205 sub pp_msgctl { listop(@_, "msgctl") }
3206 sub pp_msgsnd { listop(@_, "msgsnd") }
3207 sub pp_msgrcv { listop(@_, "msgrcv") }
3208 sub pp_semget { listop(@_, "semget") }
3209 sub pp_semctl { listop(@_, "semctl") }
3210 sub pp_semop { listop(@_, "semop") }
3211 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
3212 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
3213 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
3214 sub pp_gsbyname { listop(@_, "getservbyname") }
3215 sub pp_gsbyport { listop(@_, "getservbyport") }
3216 sub pp_syscall { listop(@_, "syscall") }
3221 my $kid = $op->first->sibling; # skip pushmark
3223 $op->flags & OPf_SPECIAL ? 'glob' : $self->keyword('glob');
3225 if ($keyword =~ /^CORE::/
3226 or $kid->name ne 'const'
3227 or ($text = $self->dq($kid))
3228 =~ /^\$?(\w|::|\`)+$/ # could look like a readline
3229 or $text =~ /[<>]/) {
3230 $text = $self->deparse($kid);
3231 return $cx >= 5 || $self->{'parens'}
3235 return '<' . $text . '>';
3239 # Truncate is special because OPf_SPECIAL makes a bareword first arg
3240 # be a filehandle. This could probably be better fixed in the core
3241 # by moving the GV lookup into ck_truc.
3247 my $parens = ($cx >= 5) || $self->{'parens'};
3248 my $kid = $op->first->sibling;
3250 if ($op->flags & OPf_SPECIAL) {
3251 # $kid is an OP_CONST
3252 $fh = $self->const_sv($kid)->PV;
3254 $fh = $self->deparse($kid, 6);
3255 $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
3257 my $len = $self->deparse($kid->sibling, 6);
3258 my $name = $self->keyword('truncate');
3260 return "$name($fh, $len)";
3262 return "$name $fh, $len";
3268 my($op, $cx, $name) = @_;
3270 my $firstkid = my $kid = $op->first->sibling;
3272 if ($op->flags & OPf_STACKED) {
3274 $indir = $indir->first; # skip rv2gv
3275 if (is_scope($indir)) {
3276 $indir = "{" . $self->deparse($indir, 0) . "}";
3277 $indir = "{;}" if $indir eq "{}";
3278 } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
3279 $indir = $self->const_sv($indir)->PV;
3281 $indir = $self->deparse($indir, 24);
3283 $indir = $indir . " ";
3284 $kid = $kid->sibling;
3286 if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
3287 $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
3290 elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
3291 $indir = '{$b cmp $a} ';
3293 for (; !null($kid); $kid = $kid->sibling) {
3294 $expr = $self->deparse($kid, !$indir && $kid == $firstkid && $name eq "sort" && $firstkid->name eq "entersub" ? 16 : 6);
3298 if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
3299 $name2 = $self->keyword('reverse') . ' ' . $self->keyword('sort');
3301 else { $name2 = $self->keyword($name) }
3302 if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
3303 return "$exprs[0] = $name2 $indir $exprs[0]";
3306 my $args = $indir . join(", ", @exprs);
3307 if ($indir ne "" && $name eq "sort") {
3308 # We don't want to say "sort(f 1, 2, 3)", since perl -w will
3309 # give bareword warnings in that case. Therefore if context
3310 # requires, we'll put parens around the outside "(sort f 1, 2,
3311 # 3)". Unfortunately, we'll currently think the parens are
3312 # necessary more often that they really are, because we don't
3313 # distinguish which side of an assignment we're on.
3315 return "($name2 $args)";
3317 return "$name2 $args";
3320 !$indir && $name eq "sort"
3321 && !null($op->first->sibling)
3322 && $op->first->sibling->name eq 'entersub'
3324 # We cannot say sort foo(bar), as foo will be interpreted as a
3325 # comparison routine. We have to say sort(...) in that case.
3326 return "$name2($args)";
3329 ? $self->maybe_parens_func($name2, $args, $cx, 5)
3330 : $name2 . '()' x (7 < $cx);
3335 sub pp_prtf { indirop(@_, "printf") }
3336 sub pp_print { indirop(@_, "print") }
3337 sub pp_say { indirop(@_, "say") }
3338 sub pp_sort { indirop(@_, "sort") }
3342 my($op, $cx, $name) = @_;
3344 my $kid = $op->first; # this is the (map|grep)start
3345 $kid = $kid->first->sibling; # skip a pushmark
3346 my $code = $kid->first; # skip a null
3347 if (is_scope $code) {
3348 $code = "{" . $self->deparse($code, 0) . "} ";
3350 $code = $self->deparse($code, 24);
3351 $code .= ", " if !null($kid->sibling);
3353 $kid = $kid->sibling;
3354 for (; !null($kid); $kid = $kid->sibling) {
3355 $expr = $self->deparse($kid, 6);
3356 push @exprs, $expr if defined $expr;
3358 return $self->maybe_parens_func($self->keyword($name),
3359 $code . join(", ", @exprs), $cx, 5);
3362 sub pp_mapwhile { mapop(@_, "map") }
3363 sub pp_grepwhile { mapop(@_, "grep") }
3364 sub pp_mapstart { baseop(@_, "map") }
3365 sub pp_grepstart { baseop(@_, "grep") }
3370 eval { require B::Op_private }
3371 ? @{$B::Op_private::ops_using{OPpLVAL_INTRO}}
3372 : qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice
3373 hslice delete padsv padav padhv enteriter entersub padrange
3374 pushmark cond_expr refassign list)
3376 delete @uses_intro{qw( lvref lvrefslice lvavref entersub )};
3383 my $kid = $op->first->sibling; # skip pushmark
3384 return '' if class($kid) eq 'NULL';
3386 my $local = "either"; # could be local(...), my(...), state(...) or our(...)
3388 for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
3389 my $lopname = $lop->name;
3390 my $loppriv = $lop->private;
3392 if ($lopname =~ /^pad[ash]v$/ && $loppriv & OPpLVAL_INTRO) {
3393 if ($loppriv & OPpPAD_STATE) { # state()
3394 ($local = "", last) if $local !~ /^(?:either|state)$/;
3397 ($local = "", last) if $local !~ /^(?:either|my)$/;
3400 my $padname = $self->padname_sv($lop->targ);
3401 if ($padname->FLAGS & SVpad_TYPED) {
3402 $newtype = $padname->SvSTASH->NAME;
3404 } elsif ($lopname =~ /^(?:gv|rv2)([ash])v$/
3405 && $loppriv & OPpOUR_INTRO
3406 or $lopname eq "null" && class($lop) eq 'UNOP'
3407 && $lop->first->name eq "gvsv"
3408 && $lop->first->private & OPpOUR_INTRO) { # our()
3409 my $newlocal = "local " x !!($loppriv & OPpLVAL_INTRO) . "our";
3411 if $local ne 'either' && $local ne $newlocal;
3413 my $funny = !$1 || $1 eq 's' ? '$' : $1 eq 'a' ? '@' : '%';
3414 if (my $t = $self->find_our_type(
3415 $funny . $self->gv_or_padgv($lop->first)->NAME
3419 } elsif ($lopname ne 'undef'
3420 and !($loppriv & OPpLVAL_INTRO)
3421 || !exists $uses_intro{$lopname eq 'null'
3422 ? substr B::ppname($lop->targ), 3
3425 $local = ""; # or not
3427 } elsif ($lopname ne "undef")
3430 ($local = "", last) if $local !~ /^(?:either|local)$/;
3433 if (defined $type && defined $newtype && $newtype ne $type) {
3439 $local = "" if $local eq "either"; # no point if it's all undefs
3440 $local &&= join ' ', map $self->keyword($_), split / /, $local;
3441 $local .= " $type " if $local && length $type;
3442 return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
3443 for (; !null($kid); $kid = $kid->sibling) {
3445 if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
3450 $self->{'avoid_local'}{$$lop}++;
3451 $expr = $self->deparse($kid, 6);
3452 delete $self->{'avoid_local'}{$$lop};
3454 $expr = $self->deparse($kid, 6);
3459 return "$local(" . join(", ", @exprs) . ")";
3461 return $self->maybe_parens( join(", ", @exprs), $cx, 6);
3465 sub is_ifelse_cont {
3467 return ($op->name eq "null" and class($op) eq "UNOP"
3468 and $op->first->name =~ /^(and|cond_expr)$/
3469 and is_scope($op->first->first->sibling));
3475 my $cond = $op->first;
3476 my $true = $cond->sibling;
3477 my $false = $true->sibling;
3478 my $cuddle = $self->{'cuddle'};
3479 unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
3480 (is_scope($false) || is_ifelse_cont($false))
3481 and $self->{'expand'} < 7) {
3482 $cond = $self->deparse($cond, 8);
3483 $true = $self->deparse($true, 6);
3484 $false = $self->deparse($false, 8);
3485 return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
3488 $cond = $self->deparse($cond, 1);
3489 $true = $self->deparse($true, 0);
3490 my $head = $self->keyword("if") . " ($cond) {\n\t$true\n\b}";
3493 while (!null($false) and is_ifelse_cont($false)) {
3494 my $newop = $false->first;
3495 my $newcond = $newop->first;
3496 my $newtrue = $newcond->sibling;
3497 $false = $newtrue->sibling; # last in chain is OP_AND => no else
3498 if ($newcond->name eq "lineseq")
3500 # lineseq to ensure correct line numbers in elsif()
3501 # Bug #37302 fixed by change #33710.
3502 $newcond = $newcond->first->sibling;
3504 $newcond = $self->deparse($newcond, 1);
3505 $newtrue = $self->deparse($newtrue, 0);
3506 $elsif ||= $self->keyword("elsif");
3507 push @elsifs, "$elsif ($newcond) {\n\t$newtrue\n\b}";
3509 if (!null($false)) {
3510 $false = $cuddle . $self->keyword("else") . " {\n\t" .
3511 $self->deparse($false, 0) . "\n\b}\cK";
3515 return $head . join($cuddle, "", @elsifs) . $false;
3519 my ($self, $op, $cx) = @_;
3520 my $cond = $op->first;
3521 my $true = $cond->sibling;
3523 my $ret = $self->deparse($true, $cx);
3524 $ret =~ s/^(\(?)\$/$1 . $self->keyword("state") . ' $'/e;
3530 my($op, $cx, $init) = @_;
3531 my $enter = $op->first;
3532 my $kid = $enter->sibling;
3533 local(@$self{qw'curstash warnings hints hinthash'})
3534 = @$self{qw'curstash warnings hints hinthash'};
3540 if ($kid->name eq "lineseq") { # bare or infinite loop
3541 if ($kid->last->name eq "unstack") { # infinite
3542 $head = "while (1) "; # Can't use for(;;) if there's a continue
3548 } elsif ($enter->name eq "enteriter") { # foreach
3549 my $ary = $enter->first->sibling; # first was pushmark
3550 my $var = $ary->sibling;
3551 if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
3552 # "reverse" was optimised away
3553 $ary = listop($self, $ary->first->sibling, 1, 'reverse');
3554 } elsif ($enter->flags & OPf_STACKED
3555 and not null $ary->first->sibling->sibling)
3557 $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
3558 $self->deparse($ary->first->sibling->sibling, 9);
3560 $ary = $self->deparse($ary, 1);
3563 $var = $self->pp_padsv($enter, 1, 1);
3564 } elsif ($var->name eq "rv2gv") {
3565 $var = $self->pp_rv2sv($var, 1);
3566 if ($enter->private & OPpOUR_INTRO) {
3567 # our declarations don't have package names
3568 $var =~ s/^(.).*::/$1/;
3571 } elsif ($var->name eq "gv") {
3572 $var = "\$" . $self->deparse($var, 1);
3574 $var = $self->deparse($var, 1);
3576 $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
3577 if (!is_state $body->first and $body->first->name !~ /^(?:stub|leave|scope)$/) {
3578 confess unless $var eq '$_';
3579 $body = $body->first;
3580 return $self->deparse($body, 2) . " "
3581 . $self->keyword("foreach") . " ($ary)";
3583 $head = "foreach $var ($ary) ";
3584 } elsif ($kid->name eq "null") { # while/until
3586 $name = {"and" => "while", "or" => "until"}->{$kid->name};
3587 $cond = $kid->first;
3588 $body = $kid->first->sibling;
3589 } elsif ($kid->name eq "stub") { # bare and empty
3590 return "{;}"; # {} could be a hashref
3592 # If there isn't a continue block, then the next pointer for the loop
3593 # will point to the unstack, which is kid's last child, except
3594 # in a bare loop, when it will point to the leaveloop. When neither of
3595 # these conditions hold, then the second-to-last child is the continue
3596 # block (or the last in a bare loop).
3597 my $cont_start = $enter->nextop;
3601 if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
3603 $cont = $body->last;
3605 $cont = $body->first;
3606 while (!null($cont->sibling->sibling)) {
3607 $cont = $cont->sibling;
3610 my $state = $body->first;
3611 my $cuddle = $self->{'cuddle'};
3613 for (; $$state != $$cont; $state = $state->sibling) {
3614 push @states, $state;
3616 $body = $self->lineseq(undef, 0, @states);
3617 if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
3618 $precond = "for ($init; ";
3619 $postcond = "; " . $self->deparse($cont, 1) .") ";
3622 $cont = $cuddle . "continue {\n\t" .
3623 $self->deparse($cont, 0) . "\n\b}\cK";
3626 return "" if !defined $body;
3628 $precond = "for ($init; ";
3632 $body = $self->deparse($body, 0);
3634 if ($precond) { # for(;;)
3635 $cond &&= $name eq 'until'
3636 ? listop($self, undef, 1, "not", $cond->first)
3637 : $self->deparse($cond, 1);
3638 $head = "$precond$cond$postcond";
3640 if ($name && !$head) {
3641 ref $cond and $cond = $self->deparse($cond, 1);
3642 $head = "$name ($cond) ";
3644 $head =~ s/^(for(?:each)?|while|until)/$self->keyword($1)/e;
3645 $body =~ s/;?$/;\n/;
3647 return $head . "{\n\t" . $body . "\b}" . $cont;
3650 sub pp_leaveloop { shift->loop_common(@_, "") }
3655 my $init = $self->deparse($op, 1);
3656 my $s = $op->sibling;
3657 my $ll = $s->name eq "unstack" ? $s->sibling : $s->first->sibling;
3658 return $self->loop_common($ll, $cx, $init);
3663 return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
3667 my ($op, $expect_type) = @_;
3668 my $type = $op->type;
3669 return($type == $expect_type
3670 || ($type == OP_NULL && $op->targ == $expect_type));
3674 my($self, $op, $cx) = @_;
3675 if (class($op) eq "OP") {
3677 return $self->{'ex_const'} if $op->targ == OP_CONST;
3678 } elsif (class ($op) eq "COP") {
3679 return &pp_nextstate;
3680 } elsif ($op->first->name eq 'pushmark'
3681 or $op->first->name eq 'null'
3682 && $op->first->targ == OP_PUSHMARK
3683 && _op_is_or_was($op, OP_LIST)) {
3684 return $self->pp_list($op, $cx);
3685 } elsif ($op->first->name eq "enter") {
3686 return $self->pp_leave($op, $cx);
3687 } elsif ($op->first->name eq "leave") {
3688 return $self->pp_leave($op->first, $cx);
3689 } elsif ($op->first->name eq "scope") {
3690 return $self->pp_scope($op->first, $cx);
3691 } elsif ($op->targ == OP_STRINGIFY) {
3692 return $self->dquote($op, $cx);
3693 } elsif ($op->targ == OP_GLOB) {
3694 return $self->pp_glob(
3695 $op->first # entersub
3701 } elsif (!null($op->first->sibling) and
3702 $op->first->sibling->name eq "readline" and
3703 $op->first->sibling->flags & OPf_STACKED) {
3704 return $self->maybe_parens($self->deparse($op->first, 7) . " = "
3705 . $self->deparse($op->first->sibling, 7),
3707 } elsif (!null($op->first->sibling) and
3708 $op->first->sibling->name =~ /^transr?\z/ and
3709 $op->first->sibling->flags & OPf_STACKED) {
3710 return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
3711 . $self->deparse($op->first->sibling, 20),
3713 } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
3714 return ($self->lex_in_scope("&do") ? "CORE::do" : "do")
3715 . " {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
3716 } elsif (!null($op->first->sibling) and
3717 $op->first->sibling->name eq "null" and
3718 class($op->first->sibling) eq "UNOP" and
3719 $op->first->sibling->first->flags & OPf_STACKED and
3720 $op->first->sibling->first->name eq "rcatline") {
3721 return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
3722 . $self->deparse($op->first->sibling, 18),
3725 return $self->deparse($op->first, $cx);
3732 return $self->padname_sv($targ)->PVX;
3738 return substr($self->padname($op->targ), 1); # skip $/@/%
3743 my($op, $cx, $forbid_parens) = @_;
3744 my $targ = $op->targ;
3745 return $self->maybe_my($op, $cx, $self->padname($targ),
3746 $self->padname_sv($targ),
3750 sub pp_padav { pp_padsv(@_) }
3751 sub pp_padhv { pp_padsv(@_) }
3756 if (class($op) eq "PADOP") {
3757 return $self->padval($op->padix);
3758 } else { # class($op) eq "SVOP"
3766 my $gv = $self->gv_or_padgv($op);
3767 return $self->maybe_local($op, $cx, $self->stash_variable("\$",
3768 $self->gv_name($gv), $cx));
3774 my $gv = $self->gv_or_padgv($op);
3775 return $self->gv_name($gv);
3778 sub pp_aelemfast_lex {
3781 my $name = $self->padname($op->targ);
3783 my $i = $op->private;
3784 $i -= 256 if $i > 127;
3785 return $name . "[" . ($i + $self->{'arybase'}) . "]";
3791 # optimised PADAV, pre 5.15
3792 return $self->pp_aelemfast_lex(@_) if ($op->flags & OPf_SPECIAL);
3794 my $gv = $self->gv_or_padgv($op);
3795 my($name,$quoted) = $self->stash_variable_name('@',$gv);
3796 $name = $quoted ? "$name->" : '$' . $name;
3797 my $i = $op->private;
3798 $i -= 256 if $i > 127;
3799 return $name . "[" . ($i + $self->{'arybase'}) . "]";
3804 my($op, $cx, $type) = @_;
3806 if (class($op) eq 'NULL' || !$op->can("first")) {
3807 carp("Unexpected op in pp_rv2x");
3810 my $kid = $op->first;
3811 if ($kid->name eq "gv") {
3812 return $self->stash_variable($type, $self->deparse($kid, 0), $cx);
3813 } elsif (is_scalar $kid) {
3814 my $str = $self->deparse($kid, 0);
3815 if ($str =~ /^\$([^\w\d])\z/) {
3816 # "$$+" isn't a legal way to write the scalar dereference
3817 # of $+, since the lexer can't tell you aren't trying to
3818 # do something like "$$ + 1" to get one more than your
3819 # PID. Either "${$+}" or "$${+}" are workable
3820 # disambiguations, but if the programmer did the former,
3821 # they'd be in the "else" clause below rather than here.
3822 # It's not clear if this should somehow be unified with
3823 # the code in dq and re_dq that also adds lexer
3824 # disambiguation braces.
3825 $str = '$' . "{$1}"; #'
3827 return $type . $str;
3829 return $type . "{" . $self->deparse($kid, 0) . "}";
3833 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
3834 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
3835 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
3841 if ($op->first->name eq "padav") {
3842 return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
3844 return $self->maybe_local($op, $cx,
3845 $self->rv2x($op->first, $cx, '$#'));
3849 # skip down to the old, ex-rv2cv
3851 my ($self, $op, $cx) = @_;
3852 if (!null($op->first) && $op->first->name eq 'null' &&
3853 $op->first->targ == OP_LIST)
3855 return $self->rv2x($op->first->first->sibling, $cx, "&")
3858 return $self->rv2x($op, $cx, "")
3864 my($cx, @list) = @_;
3865 my @a = map $self->const($_, 6), @list;
3870 } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
3871 # collapse (-1,0,1,2) into (-1..2)
3872 my ($s, $e) = @a[0,-1];
3874 return $self->maybe_parens("$s..$e", $cx, 9)
3875 unless grep $i++ != $_, @a;
3877 return $self->maybe_parens(join(", ", @a), $cx, 6);
3883 my $kid = $op->first;
3884 if ($kid->name eq "const") { # constant list
3885 my $av = $self->const_sv($kid);
3886 return $self->list_const($cx, $av->ARRAY);
3888 return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
3892 sub is_subscriptable {
3894 if ($op->name =~ /^([ahg]elem|multideref$)/) {
3896 } elsif ($op->name eq "entersub") {
3897 my $kid = $op->first;
3898 return 0 unless null $kid->sibling;
3900 $kid = $kid->sibling until null $kid->sibling;
3901 return 0 if is_scope($kid);
3903 return 0 if $kid->name eq "gv" || $kid->name eq "padcv";
3904 return 0 if is_scalar($kid);
3905 return is_subscriptable($kid);
3911 sub elem_or_slice_array_name
3914 my ($array, $left, $padname, $allow_arrow) = @_;
3916 if ($array->name eq $padname) {
3917 return $self->padany($array);
3918 } elsif (is_scope($array)) { # ${expr}[0]
3919 return "{" . $self->deparse($array, 0) . "}";
3920 } elsif ($array->name eq "gv") {
3921 ($array, my $quoted) =
3922 $self->stash_variable_name(
3923 $left eq '[' ? '@' : '%', $self->gv_or_padgv($array)
3925 if (!$allow_arrow && $quoted) {
3926 # This cannot happen.
3927 die "Invalid variable name $array for slice";
3929 return $quoted ? "$array->" : $array;
3930 } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
3931 return $self->deparse($array, 24);
3937 sub elem_or_slice_single_index
3942 $idx = $self->deparse($idx, 1);
3944 # Outer parens in an array index will confuse perl
3945 # if we're interpolating in a regular expression, i.e.
3946 # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
3948 # If $self->{parens}, then an initial '(' will
3949 # definitely be paired with a final ')'. If
3950 # !$self->{parens}, the misleading parens won't
3951 # have been added in the first place.
3953 # [You might think that we could get "(...)...(...)"
3954 # where the initial and final parens do not match
3955 # each other. But we can't, because the above would
3956 # only happen if there's an infix binop between the
3957 # two pairs of parens, and *that* means that the whole
3958 # expression would be parenthesized as well.]
3960 $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
3962 # Hash-element braces will autoquote a bareword inside themselves.
3963 # We need to make sure that C<$hash{warn()}> doesn't come out as
3964 # C<$hash{warn}>, which has a quite different meaning. Currently
3965 # B::Deparse will always quote strings, even if the string was a
3966 # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
3967 # for constant strings.) So we can cheat slightly here - if we see
3968 # a bareword, we know that it is supposed to be a function call.
3970 $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
3977 my ($op, $cx, $left, $right, $padname) = @_;
3978 my($array, $idx) = ($op->first, $op->first->sibling);
3980 $idx = $self->elem_or_slice_single_index($idx);
3982 unless ($array->name eq $padname) { # Maybe this has been fixed
3983 $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
3985 if (my $array_name=$self->elem_or_slice_array_name
3986 ($array, $left, $padname, 1)) {
3987 return ($array_name =~ /->\z/
3989 : $array_name eq '#' ? '${#}' : "\$" . $array_name)
3990 . $left . $idx . $right;
3992 # $x[20][3]{hi} or expr->[20]
3993 my $arrow = is_subscriptable($array) ? "" : "->";
3994 return $self->deparse($array, 24) . $arrow . $left . $idx . $right;
3999 # a simplified version of elem_or_slice_array_name()
4000 # for the use of pp_multideref
4002 sub multideref_var_name {
4004 my ($gv, $is_hash) = @_;
4006 my ($name, $quoted) =
4007 $self->stash_variable_name( $is_hash ? '%' : '@', $gv);
4008 return $quoted ? "$name->"
4010 ? '${#}' # avoid ${#}[1] => $#[1]
4020 if ($op->private & OPpMULTIDEREF_EXISTS) {
4021 $text = $self->keyword("exists"). " ";
4023 elsif ($op->private & OPpMULTIDEREF_DELETE) {
4024 $text = $self->keyword("delete"). " ";
4026 elsif ($op->private & OPpLVAL_INTRO) {
4027 $text = $self->keyword("local"). " ";
4030 if ($op->first && ($op->first->flags & OPf_KIDS)) {
4031 # arbitrary initial expression, e.g. f(1,2,3)->[...]
4032 $text .= $self->deparse($op->first, 24);
4035 my @items = $op->aux_list($self->{curcv});
4036 my $actions = shift @items;
4042 if (($actions & MDEREF_ACTION_MASK) == MDEREF_reload) {
4043 $actions = shift @items;
4048 ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_pop_rv2hv_helem
4049 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvsv_vivify_rv2hv_helem
4050 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padsv_vivify_rv2hv_helem
4051 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_vivify_rv2hv_helem
4052 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padhv_helem
4053 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvhv_helem
4056 if ( ($actions & MDEREF_ACTION_MASK) == MDEREF_AV_padav_aelem
4057 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padhv_helem)
4060 $text .= '$' . substr($self->padname(shift @items), 1);
4062 elsif ( ($actions & MDEREF_ACTION_MASK) == MDEREF_AV_gvav_aelem
4063 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvhv_helem)
4066 $text .= $self->multideref_var_name(shift @items, $is_hash);
4069 if ( ($actions & MDEREF_ACTION_MASK) ==
4070 MDEREF_AV_padsv_vivify_rv2av_aelem
4071 || ($actions & MDEREF_ACTION_MASK) ==
4072 MDEREF_HV_padsv_vivify_rv2hv_helem)
4074 $text .= $self->padname(shift @items);
4076 elsif ( ($actions & MDEREF_ACTION_MASK) ==
4077 MDEREF_AV_gvsv_vivify_rv2av_aelem
4078 || ($actions & MDEREF_ACTION_MASK) ==
4079 MDEREF_HV_gvsv_vivify_rv2hv_helem)
4081 $text .= $self->multideref_var_name(shift @items, $is_hash);
4083 elsif ( ($actions & MDEREF_ACTION_MASK) ==
4084 MDEREF_AV_pop_rv2av_aelem
4085 || ($actions & MDEREF_ACTION_MASK) ==
4086 MDEREF_HV_pop_rv2hv_helem)
4088 if ( ($op->flags & OPf_KIDS)
4089 && ( _op_is_or_was($op->first, OP_RV2AV)
4090 || _op_is_or_was($op->first, OP_RV2HV))
4091 && ($op->first->flags & OPf_KIDS)
4092 && ( _op_is_or_was($op->first->first, OP_AELEM)
4093 || _op_is_or_was($op->first->first, OP_HELEM))
4100 $text .= '->' if !$derefs++;
4104 if (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_none) {
4108 $text .= $is_hash ? '{' : '[';
4110 if (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_const) {
4111 my $key = shift @items;
4113 $text .= $self->const($key, $cx);
4119 elsif (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_padsv) {
4120 $text .= $self->padname(shift @items);
4122 elsif (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_gvsv) {
4123 $text .= '$' . ($self->stash_variable_name('$', shift @items))[0];
4126 $text .= $is_hash ? '}' : ']';
4128 if ($actions & MDEREF_FLAG_last) {
4131 $actions >>= MDEREF_SHIFT;
4138 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
4139 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
4144 my($glob, $part) = ($op->first, $op->last);
4145 $glob = $glob->first; # skip rv2gv
4146 $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
4147 my $scope = is_scope($glob);
4148 $glob = $self->deparse($glob, 0);
4149 $part = $self->deparse($part, 1);
4150 return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
4155 my ($op, $cx, $left, $right, $regname, $padname) = @_;
4157 my(@elems, $kid, $array, $list);
4158 if (class($op) eq "LISTOP") {
4160 } else { # ex-hslice inside delete()
4161 for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
4165 $array = $array->first
4166 if $array->name eq $regname or $array->name eq "null";
4167 $array = $self->elem_or_slice_array_name($array,$left,$padname,0);
4168 $kid = $op->first->sibling; # skip pushmark
4169 if ($kid->name eq "list") {
4170 $kid = $kid->first->sibling; # skip list, pushmark
4171 for (; !null $kid; $kid = $kid->sibling) {
4172 push @elems, $self->deparse($kid, 6);
4174 $list = join(", ", @elems);
4176 $list = $self->elem_or_slice_single_index($kid);
4179 $lead = '%' if $op->name =~ /^kv/i;
4180 return $lead . $array . $left . $list . $right;
4183 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
4184 sub pp_kvaslice { slice(@_, "[", "]", "rv2av", "padav") }
4185 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
4186 sub pp_kvhslice { slice(@_, "{", "}", "rv2hv", "padhv") }
4191 my $idx = $op->first;
4192 my $list = $op->last;
4194 $list = $self->deparse($list, 1);
4195 $idx = $self->deparse($idx, 1);
4196 return "($list)" . "[$idx]";
4201 return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
4206 return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
4212 my $kid = $op->first->sibling; # skip pushmark
4213 my($meth, $obj, @exprs);
4214 if ($kid->name eq "list" and want_list $kid) {
4215 # When an indirect object isn't a bareword but the args are in
4216 # parens, the parens aren't part of the method syntax (the LLAFR
4217 # doesn't apply), but they make a list with OPf_PARENS set that
4218 # doesn't get flattened by the append_elem that adds the method,
4219 # making a (object, arg1, arg2, ...) list where the object
4220 # usually is. This can be distinguished from
4221 # '($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
4222 # object) because in the later the list is in scalar context
4223 # as the left side of -> always is, while in the former
4224 # the list is in list context as method arguments always are.
4225 # (Good thing there aren't method prototypes!)
4226 $meth = $kid->sibling;
4227 $kid = $kid->first->sibling; # skip pushmark
4229 $kid = $kid->sibling;
4230 for (; not null $kid; $kid = $kid->sibling) {
4235 $kid = $kid->sibling;
4236 for (; !null ($kid->sibling) && $kid->name!~/^method(?:_named)?\z/;
4237 $kid = $kid->sibling) {
4243 if ($meth->name eq "method_named") {
4244 $meth = $self->meth_sv($meth)->PV;
4245 } elsif ($meth->name eq "method_super") {
4246 $meth = "SUPER::".$self->meth_sv($meth)->PV;
4247 } elsif ($meth->name eq "method_redir") {
4248 $meth = $self->meth_rclass_sv($meth)->PV.'::'.$self->meth_sv($meth)->PV;
4249 } elsif ($meth->name eq "method_redir_super") {
4250 $meth = $self->meth_rclass_sv($meth)->PV.'::SUPER::'.
4251 $self->meth_sv($meth)->PV;
4253 $meth = $meth->first;
4254 if ($meth->name eq "const") {
4255 # As of 5.005_58, this case is probably obsoleted by the
4256 # method_named case above
4257 $meth = $self->const_sv($meth)->PV; # needs to be bare
4261 return { method => $meth, variable_method => ref($meth),
4262 object => $obj, args => \@exprs },
4266 # compat function only
4269 my $info = $self->_method(@_);
4270 return $self->e_method( $self->_method(@_) );
4274 my ($self, $info, $cx) = @_;
4275 my $obj = $self->deparse($info->{object}, 24);
4277 my $meth = $info->{method};
4278 $meth = $self->deparse($meth, 1) if $info->{variable_method};
4279 my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} );
4280 if ($info->{object}->name eq 'scope' && want_list $info->{object}) {
4281 # method { $object }
4282 # This must be deparsed this way to preserve list context
4284 my $need_paren = $cx >= 6;
4285 return '(' x $need_paren
4286 . $meth . substr($obj,2) # chop off the "do"
4288 . ')' x $need_paren;
4290 my $kid = $obj . "->" . $meth;
4292 return $kid . "(" . $args . ")"; # parens mandatory
4298 # returns "&" if the prototype doesn't match the args,
4299 # or ("", $args_after_prototype_demunging) if it does.
4302 return "&" if $self->{'noproto'};
4303 my($proto, @args) = @_;
4307 # An unbackslashed @ or % gobbles up the rest of the args
4308 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
4311 $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;|)\s*//;
4314 return "&" if @args;
4315 } elsif ($chr eq ";") {
4317 } elsif ($chr eq "@" or $chr eq "%") {
4318 push @reals, map($self->deparse($_, 6), @args);
4323 if ($chr eq "\$" || $chr eq "_") {
4324 if (want_scalar $arg) {
4325 push @reals, $self->deparse($arg, 6);
4329 } elsif ($chr eq "&") {
4330 if ($arg->name =~ /^(s?refgen|undef)$/) {
4331 push @reals, $self->deparse($arg, 6);
4335 } elsif ($chr eq "*") {
4336 if ($arg->name =~ /^s?refgen$/
4337 and $arg->first->first->name eq "rv2gv")
4339 $real = $arg->first->first; # skip refgen, null
4340 if ($real->first->name eq "gv") {
4341 push @reals, $self->deparse($real, 6);
4343 push @reals, $self->deparse($real->first, 6);
4348 } elsif (substr($chr, 0, 1) eq "\\") {
4350 if ($arg->name =~ /^s?refgen$/ and
4351 !null($real = $arg->first) and
4352 ($chr =~ /\$/ && is_scalar($real->first)
4354 && class($real->first->sibling) ne 'NULL'
4355 && $real->first->sibling->name
4358 && class($real->first->sibling) ne 'NULL'
4359 && $real->first->sibling->name
4361 #or ($chr =~ /&/ # This doesn't work
4362 # && $real->first->name eq "rv2cv")
4364 && $real->first->name eq "rv2gv")))
4366 push @reals, $self->deparse($real, 6);
4373 return "&" if $proto and !$doneok; # too few args and no ';'
4374 return "&" if @args; # too many args
4375 return ("", join ", ", @reals);
4379 my $name = $_[0]->name;
4380 # XXX There has to be a better way of doing this scalar-op check.
4381 # Currently PL_opargs is not exposed.
4382 if ($name eq 'null') {
4383 $name = substr B::ppname($_[0]->targ), 3
4385 $name =~ /^(?:scalar|pushmark|wantarray|const|gvsv|gv|padsv|rv2gv
4386 |rv2sv|av2arylen|anoncode|prototype|srefgen|ref|bless
4387 |regcmaybe|regcreset|regcomp|qr|subst|substcont|trans
4388 |transr|sassign|chop|schop|chomp|schomp|defined|undef
4389 |study|pos|preinc|i_preinc|predec|i_predec|postinc
4390 |i_postinc|postdec|i_postdec|pow|multiply|i_multiply
4391 |divide|i_divide|modulo|i_modulo|add|i_add|subtract
4392 |i_subtract|concat|stringify|left_shift|right_shift|lt
4393 |i_lt|gt|i_gt|le|i_le|ge|i_ge|eq|i_eq|ne|i_ne|ncmp|i_ncmp
4394 |slt|sgt|sle|sge|seq|sne|scmp|[sn]?bit_(?:and|x?or)|negate
4395 |i_negate|not|[sn]?complement|smartmatch|atan2|sin|cos
4396 |rand|srand|exp|log|sqrt|int|hex|oct|abs|length|substr
4397 |vec|index|rindex|sprintf|formline|ord|chr|crypt|ucfirst
4398 |lcfirst|uc|lc|quotemeta|aelemfast|aelem|exists|helem
4399 |pack|join|anonlist|anonhash|push|pop|shift|unshift|xor
4400 |andassign|orassign|dorassign|warn|die|reset|nextstate
4401 |dbstate|unstack|last|next|redo|dump|goto|exit|open|close
4402 |pipe_op|fileno|umask|binmode|tie|untie|tied|dbmopen
4403 |dbmclose|select|getc|read|enterwrite|prtf|print|say
4404 |sysopen|sysseek|sysread|syswrite|eof|tell|seek|truncate
4405 |fcntl|ioctl|flock|send|recv|socket|sockpair|bind|connect
4406 |listen|accept|shutdown|gsockopt|ssockopt|getsockname
4407 |getpeername|ftrread|ftrwrite|ftrexec|fteread|ftewrite
4408 |fteexec|ftis|ftsize|ftmtime|ftatime|ftctime|ftrowned
4409 |fteowned|ftzero|ftsock|ftchr|ftblk|ftfile|ftdir|ftpipe
4410 |ftsuid|ftsgid|ftsvtx|ftlink|fttty|fttext|ftbinary|chdir
4411 |chown|chroot|unlink|chmod|utime|rename|link|symlink
4412 |readlink|mkdir|rmdir|open_dir|telldir|seekdir|rewinddir
4413 |closedir|fork|wait|waitpid|system|exec|kill|getppid
4414 |getpgrp|setpgrp|getpriority|setpriority|time|alarm|sleep
4415 |shmget|shmctl|shmread|shmwrite|msgget|msgctl|msgsnd
4416 |msgrcv|semop|semget|semctl|hintseval|shostent|snetent
4417 |sprotoent|sservent|ehostent|enetent|eprotoent|eservent
4418 |spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv
4425 return $self->e_method($self->_method($op, $cx))
4426 unless null $op->first->sibling;
4430 if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
4432 } elsif ($op->private & OPpENTERSUB_AMPER) {
4436 $kid = $kid->first->sibling; # skip ex-list, pushmark
4437 for (; not null $kid->sibling; $kid = $kid->sibling) {
4443 if (is_scope($kid)) {
4445 $kid = "{" . $self->deparse($kid, 0) . "}";
4446 } elsif ($kid->first->name eq "gv") {
4447 my $gv = $self->gv_or_padgv($kid->first);
4449 if (class($gv) eq 'GV' && class($cv = $gv->CV) ne "SPECIAL"
4450 || $gv->FLAGS & SVf_ROK && class($cv = $gv->RV) eq 'CV') {
4451 $proto = $cv->PV if $cv->FLAGS & SVf_POK;
4453 $simple = 1; # only calls of named functions can be prototyped
4454 $kid = $self->deparse($kid, 24);
4456 # Fully qualify any sub name that conflicts with a lexical.
4457 if ($self->lex_in_scope("&$kid")
4458 || $self->lex_in_scope("&$kid", 1))
4462 if ($kid eq 'main::') {
4466 if ($kid !~ /::/ && $kid ne 'x') {
4467 # Fully qualify any sub name that is also a keyword. While
4468 # we could check the import flag, we cannot guarantee that
4469 # the code deparsed so far would set that flag, so we qual-
4470 # ify the names regardless of importation.
4471 if (exists $feature_keywords{$kid}) {
4472 $fq++ if $self->feature_enabled($kid);
4473 } elsif (do { local $@; local $SIG{__DIE__};
4474 eval { () = prototype "CORE::$kid"; 1 } }) {
4478 if ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) {
4479 $kid = single_delim("q", "'", $kid, $self) . '->';
4483 $fq and substr $kid, 0, 0, = $self->{'curstash'}.'::';
4484 } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
4486 $kid = $self->deparse($kid, 24);
4489 my $grandkid = $kid->first;
4490 my $arrow = ($lexical = $grandkid->name eq "padcv")
4491 || is_subscriptable($grandkid)
4494 $kid = $self->deparse($kid, 24) . $arrow;
4496 my $padlist = $self->{'curcv'}->PADLIST;
4497 my $padoff = $grandkid->targ;
4498 my $padname = $padlist->ARRAYelt(0)->ARRAYelt($padoff);
4499 my $protocv = $padname->FLAGS & SVpad_STATE
4500 ? $padlist->ARRAYelt(1)->ARRAYelt($padoff)
4501 : $padname->PROTOCV;
4502 if ($protocv->FLAGS & SVf_POK) {
4503 $proto = $protocv->PV
4509 # Doesn't matter how many prototypes there are, if
4510 # they haven't happened yet!
4511 my $declared = $lexical || exists $self->{'subs_declared'}{$kid};
4512 if (not $declared and $self->{'in_coderef2text'}) {
4514 no warnings 'uninitialized';
4517 defined &{ ${$self->{'curstash'}."::"}{$kid} }
4519 $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
4520 && defined prototype $self->{'curstash'}."::".$kid
4523 if (!$declared && defined($proto)) {
4524 # Avoid "too early to check prototype" warning
4525 ($amper, $proto) = ('&');
4530 if ($declared and defined $proto and not $amper) {
4531 ($amper, $args) = $self->check_proto($proto, @exprs);
4535 $args = join(", ", map(
4536 ($_->flags & OPf_WANT) == OPf_WANT_SCALAR
4538 ? $self->maybe_parens_unop('scalar', $_, 6)
4539 : $self->deparse($_, 6),
4543 if ($prefix or $amper) {
4544 if ($kid eq '&') { $kid = "{$kid}" } # &{&} cannot be written as &&
4545 if ($op->flags & OPf_STACKED) {
4546 return $prefix . $amper . $kid . "(" . $args . ")";
4548 return $prefix . $amper. $kid;
4551 # It's a syntax error to call CORE::GLOBAL::foo with a prefix,
4552 # so it must have been translated from a keyword call. Translate
4554 $kid =~ s/^CORE::GLOBAL:://;
4556 my $dproto = defined($proto) ? $proto : "undefined";
4557 my $scalar_proto = $dproto =~ /^;*(?:[\$*_+]|\\.|\\\[[^]]\])\z/;
4559 return "$kid(" . $args . ")";
4560 } elsif ($dproto =~ /^\s*\z/) {
4562 } elsif ($scalar_proto and is_scalar($exprs[0])) {
4563 # is_scalar is an excessively conservative test here:
4564 # really, we should be comparing to the precedence of the
4565 # top operator of $exprs[0] (ala unop()), but that would
4566 # take some major code restructuring to do right.
4567 return $self->maybe_parens_func($kid, $args, $cx, 16);
4568 } elsif (not $scalar_proto and defined($proto) || $simple) { #'
4569 return $self->maybe_parens_func($kid, $args, $cx, 5);
4571 return "$kid(" . $args . ")";
4576 sub pp_enterwrite { unop(@_, "write") }
4578 # escape things that cause interpolation in double quotes,
4579 # but not character escapes
4582 $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
4590 # Matches any string which is balanced with respect to {braces}
4601 # the same, but treat $|, $), $( and $ at the end of the string differently
4602 # and leave comments unmangled for the sake of /x and (?x).
4616 ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
4617 | \#[^\n]* # (skip over comments)
4624 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
4630 # character escapes, but not delimiters that might need to be escaped
4631 sub escape_str { # ASCII, UTF8
4633 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
4635 # $str =~ s/\cH/\\b/g; # \b means something different in a regex; and \cH
4636 # isn't a backspace in EBCDIC
4642 $str =~ s/([\cA-\cZ])/'\\c' . $unctrl{$1}/ge;
4643 $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/age;
4647 # For regexes. Leave whitespace unmangled in case of /x or (?x).
4650 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
4651 $str =~ s/([[:^print:]])/
4652 ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/age;
4653 $str =~ s/\n/\n\f/g;
4657 # Don't do this for regexen
4660 $str =~ s/\\/\\\\/g;
4664 # Remove backslashes which precede literal control characters,
4665 # to avoid creating ambiguity when we escape the latter.
4669 # the insane complexity here is due to the behaviour of "\c\"
4670 $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
4674 sub balanced_delim {
4676 my @str = split //, $str;
4677 my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
4678 for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
4679 ($open, $close) = @$ar;
4680 $fail = 0; $cnt = 0; $last_bs = 0;
4683 $fail = 1 if $last_bs;
4685 } elsif ($c eq $close) {
4686 $fail = 1 if $last_bs;
4694 $last_bs = $c eq '\\';
4696 $fail = 1 if $cnt != 0;
4697 return ($open, "$open$str$close") if not $fail;
4703 my($q, $default, $str, $self) = @_;
4704 return "$default$str$default" if $default and index($str, $default) == -1;
4705 my $coreq = $self->keyword($q); # maybe CORE::q
4707 (my $succeed, $str) = balanced_delim($str);
4708 return "$coreq$str" if $succeed;
4710 for my $delim ('/', '"', '#') {
4711 return "$coreq$delim" . $str . $delim if index($str, $delim) == -1;
4714 $str =~ s/$default/\\$default/g;
4715 return "$default$str$default";
4718 return "$coreq/$str/";
4723 BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
4725 # Split a floating point number into an integer mantissa and a binary
4726 # exponent. Assumes you've already made sure the number isn't zero or
4727 # some weird infinity or NaN.
4731 if ($f == int($f)) {
4732 while ($f % 2 == 0) {
4737 while ($f != int($f)) {
4742 my $mantissa = sprintf("%.0f", $f);
4743 return ($mantissa, $exponent);
4749 if ($self->{'use_dumper'}) {
4750 return $self->const_dumper($sv, $cx);
4752 if (class($sv) eq "SPECIAL") {
4753 # sv_undef, sv_yes, sv_no
4754 return $$sv == 3 ? $self->maybe_parens("!1", $cx, 21)
4755 : ('undef', '1')[$$sv-1];
4757 if (class($sv) eq "NULL") {
4760 # convert a version object into the "v1.2.3" string in its V magic
4761 if ($sv->FLAGS & SVs_RMG) {
4762 for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
4763 return $mg->PTR if $mg->TYPE eq 'V';
4767 if ($sv->FLAGS & SVf_IOK) {
4768 my $str = $sv->int_value;
4769 $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
4771 } elsif ($sv->FLAGS & SVf_NOK) {
4774 if (pack("F", $nv) eq pack("F", 0)) {
4779 return $self->maybe_parens("-.0", $cx, 21);
4781 } elsif (1/$nv == 0) {
4784 return $self->maybe_parens("9**9**9", $cx, 22);
4787 return $self->maybe_parens("-9**9**9", $cx, 21);
4789 } elsif ($nv != $nv) {
4791 if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
4793 return "sin(9**9**9)";
4794 } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
4796 return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
4799 my $hex = unpack("h*", pack("F", $nv));
4800 return qq'unpack("F", pack("h*", "$hex"))';
4803 # first, try the default stringification
4806 # failing that, try using more precision
4807 $str = sprintf("%.${max_prec}g", $nv);
4808 # if (pack("F", $str) ne pack("F", $nv)) {
4810 # not representable in decimal with whatever sprintf()
4811 # and atof() Perl is using here.
4812 my($mant, $exp) = split_float($nv);
4813 return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
4816 $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
4818 } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
4820 my $class = class($ref);
4821 if ($class eq "AV") {
4822 return "[" . $self->list_const(2, $ref->ARRAY) . "]";
4823 } elsif ($class eq "HV") {
4824 my %hash = $ref->ARRAY;
4826 for my $k (sort keys %hash) {
4827 push @elts, "$k => " . $self->const($hash{$k}, 6);
4829 return "{" . join(", ", @elts) . "}";
4830 } elsif ($class eq "CV") {
4832 if ($] > 5.0150051) {
4833 require overloading;
4834 unimport overloading;
4837 if ($] > 5.0150051 && $self->{curcv} &&
4838 $self->{curcv}->object_2svref == $ref->object_2svref) {
4839 return $self->keyword("__SUB__");
4841 return "sub " . $self->deparse_sub($ref);
4843 if ($class ne 'SPECIAL' and $ref->FLAGS & SVs_SMG) {
4844 for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
4845 if ($mg->TYPE eq 'r') {
4846 my $re = re_uninterp(escape_re(re_unback($mg->precomp)));
4847 return single_delim("qr", "", $re, $self);
4852 my $const = $self->const($ref, 20);
4853 if ($self->{in_subst_repl} && $const =~ /^[0-9]/) {
4854 $const = "($const)";
4856 return $self->maybe_parens("\\$const", $cx, 20);
4857 } elsif ($sv->FLAGS & SVf_POK) {
4859 if ($str =~ /[[:^print:]]/a) {
4860 return single_delim("qq", '"',
4861 uninterp(escape_str unback $str), $self);
4863 return single_delim("q", "'", unback($str), $self);
4873 my $ref = $sv->object_2svref();
4874 my $dumper = Data::Dumper->new([$$ref], ['$v']);
4875 $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
4876 my $str = $dumper->Dump();
4877 if ($str =~ /^\$v/) {
4878 return '${my ' . $str . ' \$v}';
4888 # the constant could be in the pad (under useithreads)
4889 $sv = $self->padval($op->targ) unless $$sv;
4896 my $sv = $op->meth_sv;
4897 # the constant could be in the pad (under useithreads)
4898 $sv = $self->padval($op->targ) unless $$sv;
4902 sub meth_rclass_sv {
4905 my $sv = $op->rclass;
4906 # the constant could be in the pad (under useithreads)
4907 $sv = $self->padval($sv) unless ref $sv;
4914 if ($op->private & OPpCONST_ARYBASE) {
4917 # if ($op->private & OPpCONST_BARE) { # trouble with '=>' autoquoting
4918 # return $self->const_sv($op)->PV;
4920 my $sv = $self->const_sv($op);
4921 return $self->const($sv, $cx);
4927 my $type = $op->name;
4928 if ($type eq "const") {
4929 return '$[' if $op->private & OPpCONST_ARYBASE;
4930 return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
4931 } elsif ($type eq "concat") {
4932 my $first = $self->dq($op->first);
4933 my $last = $self->dq($op->last);
4935 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
4936 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
4937 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
4938 || ($last =~ /^[:'{\[\w_]/ && #'
4939 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
4941 return $first . $last;
4942 } elsif ($type eq "uc") {
4943 return '\U' . $self->dq($op->first->sibling) . '\E';
4944 } elsif ($type eq "lc") {
4945 return '\L' . $self->dq($op->first->sibling) . '\E';
4946 } elsif ($type eq "ucfirst") {
4947 return '\u' . $self->dq($op->first->sibling);
4948 } elsif ($type eq "lcfirst") {
4949 return '\l' . $self->dq($op->first->sibling);
4950 } elsif ($type eq "quotemeta") {
4951 return '\Q' . $self->dq($op->first->sibling) . '\E';
4952 } elsif ($type eq "fc") {
4953 return '\F' . $self->dq($op->first->sibling) . '\E';
4954 } elsif ($type eq "join") {
4955 return $self->deparse($op->last, 26); # was join($", @ary)
4957 return $self->deparse($op, 26);
4964 # skip pushmark if it exists (readpipe() vs ``)
4965 my $child = $op->first->sibling->isa('B::NULL')
4966 ? $op->first : $op->first->sibling;
4967 if ($self->pure_string($child)) {
4968 return single_delim("qx", '`', $self->dq($child, 1), $self);
4970 unop($self, @_, "readpipe");
4976 my $kid = $op->first->sibling; # skip ex-stringify, pushmark
4977 return $self->deparse($kid, $cx) if $self->{'unquote'};
4978 $self->maybe_targmy($kid, $cx,
4979 sub {single_delim("qq", '"', $self->dq($_[1]),
4983 # OP_STRINGIFY is a listop, but it only ever has one arg
4985 my ($self, $op, $cx) = @_;
4986 my $kid = $op->first->sibling;
4987 while ($kid->name eq 'null' && !null($kid->first)) {
4990 if ($kid->name =~ /^(?:const|padsv|rv2sv|av2arylen|gvsv|multideref
4991 |aelemfast(?:_lex)?|[ah]elem|join|concat)\z/x) {
4992 maybe_targmy(@_, \&dquote);
4995 # Actually an optimised join.
4996 my $result = listop(@_,"join");
4997 $result =~ s/join([( ])/join$1$self->{'ex_const'}, /;
5002 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
5003 # note that tr(from)/to/ is OK, but not tr/from/(to)
5005 my($from, $to) = @_;
5006 my($succeed, $delim);
5007 if ($from !~ m[/] and $to !~ m[/]) {
5008 return "/$from/$to/";
5009 } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
5010 if (($succeed, $to) = balanced_delim($to) and $succeed) {
5013 for $delim ('/', '"', '#') { # note no "'" -- s''' is special
5014 return "$from$delim$to$delim" if index($to, $delim) == -1;
5017 return "$from/$to/";
5020 for $delim ('/', '"', '#') { # note no '
5021 return "$delim$from$delim$to$delim"
5022 if index($to . $from, $delim) == -1;
5024 $from =~ s[/][\\/]g;
5026 return "/$from/$to/";
5030 # Only used by tr///, so backslashes hyphens
5033 if ($n == ord '\\') {
5035 } elsif ($n == ord "-") {
5037 } elsif (utf8::native_to_unicode($n) >= utf8::native_to_unicode(ord(' '))
5038 and utf8::native_to_unicode($n) <= utf8::native_to_unicode(ord('~')))
5040 # I'm presuming a regex is not ok here, otherwise we could have used
5041 # /[[:print:]]/a to get here
5043 } elsif ($n == ord "\a") {
5045 } elsif ($n == ord "\b") {
5047 } elsif ($n == ord "\t") {
5049 } elsif ($n == ord "\n") {
5051 } elsif ($n == ord "\e") {
5053 } elsif ($n == ord "\f") {
5055 } elsif ($n == ord "\r") {
5057 } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
5058 return '\\c' . unctrl{chr $n};
5060 # return '\x' . sprintf("%02x", $n);
5061 return '\\' . sprintf("%03o", $n);
5067 my($str, $c, $tr) = ("");
5068 for ($c = 0; $c < @chars; $c++) {
5071 if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
5072 $chars[$c + 2] == $tr + 2)
5074 for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
5077 $str .= pchr($chars[$c]);
5083 sub tr_decode_byte {
5084 my($table, $flags) = @_;
5085 my(@table) = unpack("s*", $table);
5086 splice @table, 0x100, 1; # Number of subsequent elements
5087 my($c, $tr, @from, @to, @delfrom, $delhyphen);
5088 if ($table[ord "-"] != -1 and
5089 $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
5091 $tr = $table[ord "-"];
5092 $table[ord "-"] = -1;
5096 } else { # -2 ==> delete
5100 for ($c = 0; $c < @table; $c++) {
5103 push @from, $c; push @to, $tr;
5104 } elsif ($tr == -2) {
5108 @from = (@from, @delfrom);
5109 if ($flags & OPpTRANS_COMPLEMENT) {
5112 @from{@from} = (1) x @from;
5113 for ($c = 0; $c < 256; $c++) {
5114 push @newfrom, $c unless $from{$c};
5118 unless ($flags & OPpTRANS_DELETE || !@to) {
5119 pop @to while $#to and $to[$#to] == $to[$#to -1];
5122 $from = collapse(@from);
5123 $to = collapse(@to);
5124 $from .= "-" if $delhyphen;
5125 return ($from, $to);
5130 if ($x == ord "-") {
5132 } elsif ($x == ord "\\") {
5139 # XXX This doesn't yet handle all cases correctly either
5141 sub tr_decode_utf8 {
5142 my($swash_hv, $flags) = @_;
5143 my %swash = $swash_hv->ARRAY;
5145 $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
5146 my $none = $swash{"NONE"}->IV;
5147 my $extra = $none + 1;
5148 my(@from, @delfrom, @to);
5150 foreach $line (split /\n/, $swash{'LIST'}->PV) {
5151 my($min, $max, $result) = split(/\t/, $line);
5158 $result = hex $result;
5159 if ($result == $extra) {
5160 push @delfrom, [$min, $max];
5162 push @from, [$min, $max];
5163 push @to, [$result, $result + $max - $min];
5166 for my $i (0 .. $#from) {
5167 if ($from[$i][0] == ord '-') {
5168 unshift @from, splice(@from, $i, 1);
5169 unshift @to, splice(@to, $i, 1);
5171 } elsif ($from[$i][1] == ord '-') {
5174 unshift @from, ord '-';
5175 unshift @to, ord '-';
5179 for my $i (0 .. $#delfrom) {
5180 if ($delfrom[$i][0] == ord '-') {
5181 push @delfrom, splice(@delfrom, $i, 1);
5183 } elsif ($delfrom[$i][1] == ord '-') {
5185 push @delfrom, ord '-';
5189 if (defined $final and $to[$#to][1] != $final) {
5190 push @to, [$final, $final];
5192 push @from, @delfrom;
5193 if ($flags & OPpTRANS_COMPLEMENT) {
5196 for my $i (0 .. $#from) {
5197 push @newfrom, [$next, $from[$i][0] - 1];
5198 $next = $from[$i][1] + 1;
5201 for my $range (@newfrom) {
5202 if ($range->[0] <= $range->[1]) {
5207 my($from, $to, $diff);
5208 for my $chunk (@from) {
5209 $diff = $chunk->[1] - $chunk->[0];
5211 $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
5212 } elsif ($diff == 1) {
5213 $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
5215 $from .= tr_chr($chunk->[0]);
5218 for my $chunk (@to) {
5219 $diff = $chunk->[1] - $chunk->[0];
5221 $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
5222 } elsif ($diff == 1) {
5223 $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
5225 $to .= tr_chr($chunk->[0]);
5228 #$final = sprintf("%04x", $final) if defined $final;
5229 #$none = sprintf("%04x", $none) if defined $none;
5230 #$extra = sprintf("%04x", $extra) if defined $extra;
5231 #print STDERR "final: $final\n none: $none\nextra: $extra\n";
5232 #print STDERR $swash{'LIST'}->PV;
5233 return (escape_str($from), escape_str($to));
5238 my($op, $cx, $morflags) = @_;
5240 my $class = class($op);
5241 my $priv_flags = $op->private;
5242 if ($class eq "PVOP") {
5243 ($from, $to) = tr_decode_byte($op->pv, $priv_flags);
5244 } elsif ($class eq "PADOP") {
5246 = tr_decode_utf8($self->padval($op->padix)->RV, $priv_flags);
5247 } else { # class($op) eq "SVOP"
5248 ($from, $to) = tr_decode_utf8($op->sv->RV, $priv_flags);
5251 $flags .= "c" if $priv_flags & OPpTRANS_COMPLEMENT;
5252 $flags .= "d" if $priv_flags & OPpTRANS_DELETE;
5253 $to = "" if $from eq $to and $flags eq "";
5254 $flags .= "s" if $priv_flags & OPpTRANS_SQUASH;
5255 $flags .= $morflags if defined $morflags;
5256 my $ret = $self->keyword("tr") . double_delim($from, $to) . $flags;
5257 if (my $targ = $op->targ) {
5258 return $self->maybe_parens($self->padname($targ) . " =~ $ret",
5264 sub pp_transr { push @_, 'r'; goto &pp_trans }
5266 sub re_dq_disambiguate {
5267 my ($first, $last) = @_;
5268 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
5269 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
5270 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
5271 || ($last =~ /^[{\[\w_]/ &&
5272 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
5273 return $first . $last;
5276 # Like dq(), but different
5281 my $type = $op->name;
5282 if ($type eq "const") {
5283 return '$[' if $op->private & OPpCONST_ARYBASE;
5284 my $unbacked = re_unback($self->const_sv($op)->as_string);
5285 return re_uninterp(escape_re($unbacked));
5286 } elsif ($type eq "concat") {
5287 my $first = $self->re_dq($op->first);
5288 my $last = $self->re_dq($op->last);
5289 return re_dq_disambiguate($first, $last);
5290 } elsif ($type eq "uc") {
5291 return '\U' . $self->re_dq($op->first->sibling) . '\E';
5292 } elsif ($type eq "lc") {
5293 return '\L' . $self->re_dq($op->first->sibling) . '\E';
5294 } elsif ($type eq "ucfirst") {
5295 return '\u' . $self->re_dq($op->first->sibling);
5296 } elsif ($type eq "lcfirst") {
5297 return '\l' . $self->re_dq($op->first->sibling);
5298 } elsif ($type eq "quotemeta") {
5299 return '\Q' . $self->re_dq($op->first->sibling) . '\E';
5300 } elsif ($type eq "fc") {
5301 return '\F' . $self->re_dq($op->first->sibling) . '\E';
5302 } elsif ($type eq "join") {
5303 return $self->deparse($op->last, 26); # was join($", @ary)
5305 my $ret = $self->deparse($op, 26);
5306 $ret =~ s/^\$([(|)])\z/\${$1}/ # $( $| $) need braces
5307 or $ret =~ s/^\@([-+])\z/\@{$1}/; # @- @+ need braces
5313 my ($self, $op) = @_;
5314 return 0 if null $op;
5315 my $type = $op->name;
5317 if ($type eq 'const' || $type eq 'av2arylen') {
5320 elsif ($type =~ /^(?:[ul]c(first)?|fc)$/ || $type eq 'quotemeta') {
5321 return $self->pure_string($op->first->sibling);
5323 elsif ($type eq 'join') {
5324 my $join_op = $op->first->sibling; # Skip pushmark
5325 return 0 unless $join_op->name eq 'null' && $join_op->targ == OP_RV2SV;
5327 my $gvop = $join_op->first;
5328 return 0 unless $gvop->name eq 'gvsv';
5329 return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
5331 return 0 unless ${$join_op->sibling} eq ${$op->last};
5332 return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/;
5334 elsif ($type eq 'concat') {
5335 return $self->pure_string($op->first)
5336 && $self->pure_string($op->last);
5338 elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
5341 elsif ($type eq "null" and $op->can('first') and not null $op->first) {
5342 my $first = $op->first;
5344 return 1 if $first->name eq "multideref";
5345 return 1 if $first->name eq "aelemfast_lex";
5347 if ( $first->name eq "null"
5348 and $first->can('first')
5349 and not null $first->first
5350 and $first->first->name eq "aelemfast"
5361 my ($self,$op,$cv) = @_;
5363 # localise stuff relating to the current sub
5365 local($self->{'curcv'}) = $cv,
5366 local($self->{'curcvlex'}),
5367 local(@$self{qw'curstash warnings hints hinthash curcop'})
5368 = @$self{qw'curstash warnings hints hinthash curcop'};
5371 for ($op = $op->first->sibling; !null($op); $op = $op->sibling) {
5372 if ($op->name eq 'null' and $op->flags & OPf_SPECIAL) {
5373 my $scope = $op->first;
5374 # 0 context (last arg to scopeop) means statement context, so
5375 # the contents of the block will not be wrapped in do{...}.
5376 my $block = scopeop($scope->first->name eq "enter", $self,
5378 # next op is the source code of the block
5380 $re .= ($self->const_sv($op)->PV =~ m|^(\(\?\??\{)|)[0];
5381 my $multiline = $block =~ /\n/;
5382 $re .= $multiline ? "\n\t" : ' ';
5384 $re .= $multiline ? "\n\b})" : " })";
5386 $re = re_dq_disambiguate($re, $self->re_dq($op));
5395 my $kid = $op->first;
5396 $kid = $kid->first if $kid->name eq "regcmaybe";
5397 $kid = $kid->first if $kid->name eq "regcreset";
5398 my $kname = $kid->name;
5399 if ($kname eq "null" and !null($kid->first)
5400 and $kid->first->name eq 'pushmark')
5403 $kid = $kid->first->sibling;
5404 while (!null($kid)) {
5406 my $last = $self->re_dq($kid);
5407 $str = re_dq_disambiguate($first, $last);
5408 $kid = $kid->sibling;
5413 return ($self->re_dq($kid), 1)
5414 if $kname =~ /^(?:rv2|pad)av/ or $self->pure_string($kid);
5415 return ($self->deparse($kid, $cx), 0);
5419 my ($self, $op, $cx) = @_;
5420 return (($self->regcomp($op, $cx, 0))[0]);
5424 my ($self, $op) = @_;
5426 my $pmflags = $op->pmflags;
5428 my $re = $op->pmregexp;
5430 $pmflags = $re->compflags;
5433 $flags .= "g" if $pmflags & PMf_GLOBAL;
5434 $flags .= "i" if $pmflags & PMf_FOLD;
5435 $flags .= "m" if $pmflags & PMf_MULTILINE;
5436 $flags .= "o" if $pmflags & PMf_KEEP;
5437 $flags .= "s" if $pmflags & PMf_SINGLELINE;
5438 $flags .= "x" if $pmflags & PMf_EXTENDED;
5439 $flags .= "x" if $pmflags & PMf_EXTENDED_MORE;
5440 $flags .= "p" if $pmflags & RXf_PMf_KEEPCOPY;
5441 if (my $charset = $pmflags & RXf_PMf_CHARSET) {
5442 # Hardcoding this is fragile, but B does not yet export the
5443 # constants we need.
5444 $flags .= qw(d l u a aa)[$charset >> 7]
5446 # The /d flag is indicated by 0; only show it if necessary.
5447 elsif ($self->{hinthash} and
5448 $self->{hinthash}{reflags_charset}
5449 || $self->{hinthash}{feature_unicode}
5450 or $self->{hints} & $feature::hint_mask
5451 && ($self->{hints} & $feature::hint_mask)
5452 != $feature::hint_mask
5454 $self->{hints} & $feature::hint_uni8bit;
5462 # osmic acid -- see osmium tetroxide
5465 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
5466 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
5467 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi', 'soup', 'soupmix');
5469 # When deparsing a regular expression with code blocks, we have to look in
5470 # various places to find the blocks.
5472 # For qr/(?{...})/ without interpolation, the CV is under $qr->qr_anoncv
5473 # and the code list (list of blocks and constants, maybe vars) is under
5474 # $cv->ROOT->first->code_list:
5475 # ./perl -Ilib -MB -e 'use O "Concise", B::svref_2object(sub {qr/(?{die})/})->ROOT->first->first->sibling->pmregexp->qr_anoncv->object_2svref'
5477 # For qr/$a(?{...})/ with interpolation, the code list is more accessible,
5478 # under $pmop->code_list, but the $cv is something you have to dig for in
5479 # the regcomp op’s kids:
5480 # ./perl -Ilib -mO=Concise -e 'qr/$a(?{die})/'
5482 # For m// and split //, things are much simpler. There is no CV. The code
5483 # list is under $pmop->code_list.
5487 my($op, $cx, $name, $delim) = @_;
5488 my $kid = $op->first;
5489 my ($binop, $var, $re) = ("", "", "");
5490 if ($op->flags & OPf_STACKED) {
5492 $var = $self->deparse($kid, 20);
5493 $kid = $kid->sibling;
5495 # not $name; $name will be 'm' for both match and split
5496 elsif ($op->name eq 'match' and my $targ = $op->targ) {
5498 $var = $self->padname($targ);
5501 my $pmflags = $op->pmflags;
5502 my $rhs_bound_to_defsv;
5504 my $have_kid = !null $kid;
5505 # Check for code blocks first
5506 if (not null my $code_list = $op->code_list) {
5507 $re = $self->code_list($code_list,
5510 $kid->first # ex-list
5512 ->sibling # entersub
5521 } elsif (${$bregexp = $op->pmregexp} && ${$cv = $bregexp->qr_anoncv}) {
5522 my $patop = $cv->ROOT # leavesub
5525 $re = $self->code_list($patop, $cv);
5526 } elsif (!$have_kid) {
5527 $re = re_uninterp(escape_re(re_unback($op->precomp)));
5528 } elsif ($kid->name ne 'regcomp') {
5529 carp("found ".$kid->name." where regcomp expected");
5531 ($re, $quote) = $self->regcomp($kid, 21);
5533 if ($have_kid and $kid->name eq 'regcomp') {
5534 my $matchop = $kid->first;
5535 if ($matchop->name eq 'regcreset') {
5536 $matchop = $matchop->first;
5538 if ($matchop->name =~ /^(?:match|transr?|subst)\z/
5539 && $matchop->flags & OPf_SPECIAL) {
5540 $rhs_bound_to_defsv = 1;
5544 $flags .= "c" if $pmflags & PMf_CONTINUE;
5545 $flags .= $self->re_flags($op);
5546 $flags = join '', sort split //, $flags;
5547 $flags = $matchwords{$flags} if $matchwords{$flags};
5548 if ($pmflags & PMf_ONCE) { # only one kind of delimiter works here
5550 $re = $self->keyword("m") . "?$re?"; # explicit 'm' is required
5552 $re = single_delim($name, $delim, $re, $self);
5554 $re = $re . $flags if $quote;
5557 $self->maybe_parens(
5559 ? "$var =~ (\$_ =~ $re)"
5568 sub pp_match { matchop(@_, "m", "/") }
5569 sub pp_pushre { matchop(@_, "m", "/") }
5570 sub pp_qr { matchop(@_, "qr", "") }
5572 sub pp_runcv { unop(@_, "__SUB__"); }
5575 maybe_targmy(@_, \&split);
5580 my($kid, @exprs, $ary, $expr);
5583 # For our kid (an OP_PUSHRE), pmreplroot is never actually the
5584 # root of a replacement; it's either empty, or abused to point to
5585 # the GV for an array we split into (an optimization to save
5586 # assignment overhead). Depending on whether we're using ithreads,
5587 # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
5588 # figures out for us which it is.
5589 my $replroot = $kid->pmreplroot;
5591 my $stacked = $op->flags & OPf_STACKED;
5592 if (ref($replroot) eq "B::GV") {
5594 } elsif (!ref($replroot) and $replroot > 0) {
5595 $gv = $self->padval($replroot);
5596 } elsif ($kid->targ) {
5597 $ary = $self->padname($kid->targ)
5598 } elsif ($stacked) {
5599 $ary = $self->deparse($op->last, 7);
5601 $ary = $self->maybe_local(@_,
5602 $self->stash_variable('@',
5603 $self->gv_name($gv),
5607 # Skip the last kid when OPf_STACKED is set, since it is the array
5609 for (; !null($stacked ? $kid->sibling : $kid); $kid = $kid->sibling) {
5610 push @exprs, $self->deparse($kid, 6);
5613 # handle special case of split(), and split(' ') that compiles to /\s+/
5614 # Under 5.10, the reflags may be undef if the split regexp isn't a constant
5615 # Under 5.17.5-5.17.9, the special flag is on split itself.
5617 if ( $op->flags & OPf_SPECIAL
5619 $kid->flags & OPf_SPECIAL
5620 and ( $] < 5.009 ? $kid->pmflags & PMf_SKIPWHITE()
5621 : ($kid->reflags || 0) & RXf_SKIPWHITE()
5628 $expr = "split(" . join(", ", @exprs) . ")";
5630 return $self->maybe_parens("$ary = $expr", $cx, 7);
5636 # oxime -- any of various compounds obtained chiefly by the action of
5637 # hydroxylamine on aldehydes and ketones and characterized by the
5638 # bivalent grouping C=NOH [Webster's Tenth]
5641 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
5642 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
5643 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
5644 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi', 'rogue',
5645 'sir', 'rise', 'smore', 'more', 'seer', 'rome', 'gore', 'grim', 'grime',
5646 'or', 'rose', 'rosie');
5651 my $kid = $op->first;
5652 my($binop, $var, $re, $repl) = ("", "", "", "");
5653 if ($op->flags & OPf_STACKED) {
5655 $var = $self->deparse($kid, 20);
5656 $kid = $kid->sibling;
5658 elsif (my $targ = $op->targ) {
5660 $var = $self->padname($targ);
5663 my $pmflags = $op->pmflags;
5664 if (null($op->pmreplroot)) {
5666 $kid = $kid->sibling;
5668 $repl = $op->pmreplroot->first; # skip substcont
5670 while ($repl->name eq "entereval") {
5671 $repl = $repl->first;
5675 local $self->{in_subst_repl} = 1;
5676 if ($pmflags & PMf_EVAL) {
5677 $repl = $self->deparse($repl->first, 0);
5679 $repl = $self->dq($repl);
5682 if (not null my $code_list = $op->code_list) {
5683 $re = $self->code_list($code_list);
5684 } elsif (null $kid) {
5685 $re = re_uninterp(escape_re(re_unback($op->precomp)));
5687 ($re) = $self->regcomp($kid, 1);
5689 $flags .= "r" if $pmflags & PMf_NONDESTRUCT;
5690 $flags .= "e" if $pmflags & PMf_EVAL;
5691 $flags .= $self->re_flags($op);
5692 $flags = join '', sort split //, $flags;
5693 $flags = $substwords{$flags} if $substwords{$flags};
5694 my $core_s = $self->keyword("s"); # maybe CORE::s
5696 return $self->maybe_parens("$var =~ $core_s"
5697 . double_delim($re, $repl) . $flags,
5700 return "$core_s". double_delim($re, $repl) . $flags;
5704 sub is_lexical_subs {
5707 return 0 if $op->name !~ /\A(?:introcv|clonecv)\z/;
5712 # Pretend these two ops do not exist. The perl parser adds them to the
5713 # beginning of any block containing my-sub declarations, whereas we handle
5714 # the subs in pad_subs and next_todo.
5715 *pp_clonecv = *pp_introcv;
5719 # For now, deparsing doesn't worry about the distinction between introcv
5720 # and clonecv, so pretend this op doesn't exist:
5727 return $self->padany($op);
5730 my %lvref_funnies = (
5731 OPpLVREF_SV, => '$',
5732 OPpLVREF_AV, => '@',
5733 OPpLVREF_HV, => '%',
5734 OPpLVREF_CV, => '&',
5738 my ($self, $op, $cx) = @_;
5740 if ($op->private & OPpLVREF_ELEM) {
5741 $left = $op->first->sibling;
5742 $left = maybe_local(@_, elem($self, $left, undef,
5743 $left->targ == OP_AELEM
5746 } elsif ($op->flags & OPf_STACKED) {
5747 $left = maybe_local(@_,
5748 $lvref_funnies{$op->private & OPpLVREF_TYPE}
5749 . $self->deparse($op->first->sibling));
5753 my $right = $self->deparse_binop_right($op, $op->first, 7);
5754 return $self->maybe_parens("\\$left = $right", $cx, 7);
5758 my ($self, $op, $cx) = @_;
5760 if ($op->private & OPpLVREF_ELEM) {
5761 $code = $op->first->name =~ /av\z/ ? &pp_aelem : &pp_helem;
5762 } elsif ($op->flags & OPf_STACKED) {
5763 $code = maybe_local(@_,
5764 $lvref_funnies{$op->private & OPpLVREF_TYPE}
5765 . $self->deparse($op->first));
5773 my ($self, $op, $cx) = @_;
5774 '\\' . ($op->last->name =~ /av\z/ ? &pp_aslice : &pp_hslice);
5778 my ($self, $op, $cx) = @_;
5779 '\\(' . ($op->flags & OPf_STACKED
5780 ? maybe_local(@_, rv2x(@_, "\@"))
5789 B::Deparse - Perl compiler backend to produce perl code
5793 B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
5794 [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
5798 B::Deparse is a backend module for the Perl compiler that generates
5799 perl source code, based on the internal compiled structure that perl
5800 itself creates after parsing a program. The output of B::Deparse won't
5801 be exactly the same as the original source, since perl doesn't keep
5802 track of comments or whitespace, and there isn't a one-to-one
5803 correspondence between perl's syntactical constructions and their
5804 compiled form, but it will often be close. When you use the B<-p>
5805 option, the output also includes parentheses even when they are not
5806 required by precedence, which can make it easy to see if perl is
5807 parsing your expressions the way you intended.
5809 While B::Deparse goes to some lengths to try to figure out what your
5810 original program was doing, some parts of the language can still trip
5811 it up; it still fails even on some parts of Perl's own test suite. If
5812 you encounter a failure other than the most common ones described in
5813 the BUGS section below, you can help contribute to B::Deparse's
5814 ongoing development by submitting a bug report with a small
5819 As with all compiler backend options, these must follow directly after
5820 the '-MO=Deparse', separated by a comma but not any white space.
5826 Output data values (when they appear as constants) using Data::Dumper.
5827 Without this option, B::Deparse will use some simple routines of its
5828 own for the same purpose. Currently, Data::Dumper is better for some
5829 kinds of data (such as complex structures with sharing and
5830 self-reference) while the built-in routines are better for others
5831 (such as odd floating-point values).
5835 Normally, B::Deparse deparses the main code of a program, and all the subs
5836 defined in the same file. To include subs defined in
5837 other files, pass the B<-f> option with the filename.
5838 You can pass the B<-f> option several times, to
5839 include more than one secondary file. (Most of the time you don't want to
5840 use it at all.) You can also use this option to include subs which are
5841 defined in the scope of a B<#line> directive with two parameters.
5845 Add '#line' declarations to the output based on the line and file
5846 locations of the original code.
5850 Print extra parentheses. Without this option, B::Deparse includes
5851 parentheses in its output only when they are needed, based on the
5852 structure of your program. With B<-p>, it uses parentheses (almost)
5853 whenever they would be legal. This can be useful if you are used to
5854 LISP, or if you want to see how perl parses your input. If you say
5856 if ($var & 0x7f == 65) {print "Gimme an A!"}
5857 print ($which ? $a : $b), "\n";
5858 $name = $ENV{USER} or "Bob";
5860 C<B::Deparse,-p> will print
5863 print('Gimme an A!')
5865 (print(($which ? $a : $b)), '???');
5866 (($name = $ENV{'USER'}) or '???')
5868 which probably isn't what you intended (the C<'???'> is a sign that
5869 perl optimized away a constant value).
5873 Disable prototype checking. With this option, all function calls are
5874 deparsed as if no prototype was defined for them. In other words,
5876 perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
5885 making clear how the parameters are actually passed to C<foo>.
5889 Expand double-quoted strings into the corresponding combinations of
5890 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
5893 print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
5897 print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
5898 . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
5900 Note that the expanded form represents the way perl handles such
5901 constructions internally -- this option actually turns off the reverse
5902 translation that B::Deparse usually does. On the other hand, note that
5903 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
5904 of $y into a string before doing the assignment.
5906 =item B<-s>I<LETTERS>
5908 Tweak the style of B::Deparse's output. The letters should follow
5909 directly after the 's', with no space or punctuation. The following
5910 options are available:
5916 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
5933 The default is not to cuddle.
5937 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
5941 Use tabs for each 8 columns of indent. The default is to use only spaces.
5942 For instance, if the style options are B<-si4T>, a line that's indented
5943 3 times will be preceded by one tab and four spaces; if the options were
5944 B<-si8T>, the same line would be preceded by three tabs.
5946 =item B<v>I<STRING>B<.>
5948 Print I<STRING> for the value of a constant that can't be determined
5949 because it was optimized away (mnemonic: this happens when a constant
5950 is used in B<v>oid context). The end of the string is marked by a period.
5951 The string should be a valid perl expression, generally a constant.
5952 Note that unless it's a number, it probably needs to be quoted, and on
5953 a command line quotes need to be protected from the shell. Some
5954 conventional values include 0, 1, 42, '', 'foo', and
5955 'Useless use of constant omitted' (which may need to be
5956 B<-sv"'Useless use of constant omitted'.">
5957 or something similar depending on your shell). The default is '???'.
5958 If you're using B::Deparse on a module or other file that's require'd,
5959 you shouldn't use a value that evaluates to false, since the customary
5960 true constant at the end of a module will be in void context when the
5961 file is compiled as a main program.
5967 Expand conventional syntax constructions into equivalent ones that expose
5968 their internal operation. I<LEVEL> should be a digit, with higher values
5969 meaning more expansion. As with B<-q>, this actually involves turning off
5970 special cases in B::Deparse's normal operations.
5972 If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
5973 while loops with continue blocks; for instance
5975 for ($i = 0; $i < 10; ++$i) {
5988 Note that in a few cases this translation can't be perfectly carried back
5989 into the source code -- if the loop's initializer declares a my variable,
5990 for instance, it won't have the correct scope outside of the loop.
5992 If I<LEVEL> is at least 5, C<use> declarations will be translated into
5993 C<BEGIN> blocks containing calls to C<require> and C<import>; for
6003 'strict'->import('refs')
6007 If I<LEVEL> is at least 7, C<if> statements will be translated into
6008 equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
6010 print 'hi' if $nice;
6022 $nice and print 'hi';
6023 $nice and do { print 'hi' };
6024 $nice ? do { print 'hi' } : do { print 'bye' };
6026 Long sequences of elsifs will turn into nested ternary operators, which
6027 B::Deparse doesn't know how to indent nicely.
6031 =head1 USING B::Deparse AS A MODULE
6036 $deparse = B::Deparse->new("-p", "-sC");
6037 $body = $deparse->coderef2text(\&func);
6038 eval "sub func $body"; # the inverse operation
6042 B::Deparse can also be used on a sub-by-sub basis from other perl
6047 $deparse = B::Deparse->new(OPTIONS)
6049 Create an object to store the state of a deparsing operation and any
6050 options. The options are the same as those that can be given on the
6051 command line (see L</OPTIONS>); options that are separated by commas
6052 after B<-MO=Deparse> should be given as separate strings.
6054 =head2 ambient_pragmas
6056 $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
6058 The compilation of a subroutine can be affected by a few compiler
6059 directives, B<pragmas>. These are:
6073 Assigning to the special variable $[
6093 Ordinarily, if you use B::Deparse on a subroutine which has
6094 been compiled in the presence of one or more of these pragmas,
6095 the output will include statements to turn on the appropriate
6096 directives. So if you then compile the code returned by coderef2text,
6097 it will behave the same way as the subroutine which you deparsed.
6099 However, you may know that you intend to use the results in a
6100 particular context, where some pragmas are already in scope. In
6101 this case, you use the B<ambient_pragmas> method to describe the
6102 assumptions you wish to make.
6104 Not all of the options currently have any useful effect. See
6105 L</BUGS> for more details.
6107 The parameters it accepts are:
6113 Takes a string, possibly containing several values separated
6114 by whitespace. The special values "all" and "none" mean what you'd
6117 $deparse->ambient_pragmas(strict => 'subs refs');
6121 Takes a number, the value of the array base $[.
6122 Cannot be non-zero on Perl 5.15.3 or later.
6130 If the value is true, then the appropriate pragma is assumed to
6131 be in the ambient scope, otherwise not.
6135 Takes a string, possibly containing a whitespace-separated list of
6136 values. The values "all" and "none" are special. It's also permissible
6137 to pass an array reference here.
6139 $deparser->ambient_pragmas(re => 'eval');
6144 Takes a string, possibly containing a whitespace-separated list of
6145 values. The values "all" and "none" are special, again. It's also
6146 permissible to pass an array reference here.
6148 $deparser->ambient_pragmas(warnings => [qw[void io]]);
6150 If one of the values is the string "FATAL", then all the warnings
6151 in that list will be considered fatal, just as with the B<warnings>
6152 pragma itself. Should you need to specify that some warnings are
6153 fatal, and others are merely enabled, you can pass the B<warnings>
6156 $deparser->ambient_pragmas(
6158 warnings => [FATAL => qw/void io/],
6161 See L<warnings> for more information about lexical warnings.
6167 These two parameters are used to specify the ambient pragmas in
6168 the format used by the special variables $^H and ${^WARNING_BITS}.
6170 They exist principally so that you can write code like:
6172 { my ($hint_bits, $warning_bits);
6173 BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
6174 $deparser->ambient_pragmas (
6175 hint_bits => $hint_bits,
6176 warning_bits => $warning_bits,
6180 which specifies that the ambient pragmas are exactly those which
6181 are in scope at the point of calling.
6185 This parameter is used to specify the ambient pragmas which are
6186 stored in the special hash %^H.
6192 $body = $deparse->coderef2text(\&func)
6193 $body = $deparse->coderef2text(sub ($$) { ... })
6195 Return source code for the body of a subroutine (a block, optionally
6196 preceded by a prototype in parens), given a reference to the
6197 sub. Because a subroutine can have no names, or more than one name,
6198 this method doesn't return a complete subroutine definition -- if you
6199 want to eval the result, you should prepend "sub subname ", or "sub "
6200 for an anonymous function constructor. Unless the sub was defined in
6201 the main:: package, the code will include a package declaration.
6209 In Perl 5.20 and earlier, the only pragmas to
6210 be completely supported are: C<use warnings>,
6211 C<use strict>, C<use bytes>, C<use integer>
6212 and C<use feature>. (C<$[>, which
6213 behaves like a pragma, is also supported.)
6215 Excepting those listed above, we're currently unable to guarantee that
6216 B::Deparse will produce a pragma at the correct point in the program.
6217 (Specifically, pragmas at the beginning of a block often appear right
6218 before the start of the block instead.)
6219 Since the effects of pragmas are often lexically scoped, this can mean
6220 that the pragma holds sway over a different portion of the program
6221 than in the input file.
6225 In fact, the above is a specific instance of a more general problem:
6226 we can't guarantee to produce BEGIN blocks or C<use> declarations in
6227 exactly the right place. So if you use a module which affects compilation
6228 (such as by over-riding keywords, overloading constants or whatever)
6229 then the output code might not work as intended.
6231 This is the most serious problem in Perl 5.20 and earlier. Fixing this
6232 required internal changes in Perl 5.22.
6236 Some constants don't print correctly either with or without B<-d>.
6237 For instance, neither B::Deparse nor Data::Dumper know how to print
6238 dual-valued scalars correctly, as in:
6240 use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
6242 use constant H => { "#" => 1 }; H->{"#"};
6246 An input file that uses source filtering probably won't be deparsed into
6247 runnable code, because it will still include the B<use> declaration
6248 for the source filtering module, even though the code that is
6249 produced is already ordinary Perl which shouldn't be filtered again.
6253 Optimized-away statements are rendered as
6254 '???'. This includes statements that
6255 have a compile-time side-effect, such as the obscure
6259 which is not, consequently, deparsed correctly.
6261 foreach my $i (@_) { 0 }
6263 foreach my $i (@_) { '???' }
6267 Lexical (my) variables declared in scopes external to a subroutine
6268 appear in code2ref output text as package variables. This is a tricky
6269 problem, as perl has no native facility for referring to a lexical variable
6270 defined within a different scope, although L<PadWalker> is a good start.
6272 See also L<Data::Dump::Streamer>, which combines B::Deparse and
6273 L<PadWalker> to serialize closures properly.
6277 There are probably many more bugs on non-ASCII platforms (EBCDIC).
6281 Prior to Perl 5.22, lexical C<my> subroutines were not deparsed properly.
6282 They were emitted as pure declarations, sometimes in the wrong place.
6283 Lexical C<state> subroutines were not deparsed at all.
6289 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
6290 by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
6291 Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
6292 Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael