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
15 OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
16 OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
17 OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
19 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
21 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
22 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED),
23 ($] < 5.008004 ? () : 'OPpSORT_INPLACE'),
24 ($] < 5.008006 ? () : qw(OPpSORT_DESCEND OPpITER_REVERSED)),
25 ($] < 5.008009 ? () : qw(OPpCONST_NOVER OPpPAD_STATE)),
26 ($] < 5.009 ? 'PMf_SKIPWHITE' : qw(RXf_SKIPWHITE)),
27 ($] < 5.011 ? 'CVf_LOCKED' : 'OPpREVERSE_INPLACE'),
28 ($] < 5.013 ? () : 'PMf_NONDESTRUCT');
31 use vars qw/$AUTOLOAD/;
35 # Easiest way to keep this code portable between version looks to
36 # be to fake up a dummy constant that will never actually be true.
37 foreach (qw(OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED OPpCONST_NOVER
38 OPpPAD_STATE RXf_SKIPWHITE CVf_LOCKED OPpREVERSE_INPLACE
41 *{$_} = sub () {0} unless *{$_}{CODE};
45 # Changes between 0.50 and 0.51:
46 # - fixed nulled leave with live enter in sort { }
47 # - fixed reference constants (\"str")
48 # - handle empty programs gracefully
49 # - handle infinite loops (for (;;) {}, while (1) {})
50 # - differentiate between `for my $x ...' and `my $x; for $x ...'
51 # - various minor cleanups
52 # - moved globals into an object
53 # - added `-u', like B::C
54 # - package declarations using cop_stash
55 # - subs, formats and code sorted by cop_seq
56 # Changes between 0.51 and 0.52:
57 # - added pp_threadsv (special variables under USE_5005THREADS)
58 # - added documentation
59 # Changes between 0.52 and 0.53:
60 # - many changes adding precedence contexts and associativity
61 # - added `-p' and `-s' output style options
62 # - various other minor fixes
63 # Changes between 0.53 and 0.54:
64 # - added support for new `for (1..100)' optimization,
66 # Changes between 0.54 and 0.55:
67 # - added support for new qr// construct
68 # - added support for new pp_regcreset OP
69 # Changes between 0.55 and 0.56:
70 # - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
71 # - fixed $# on non-lexicals broken in last big rewrite
72 # - added temporary fix for change in opcode of OP_STRINGIFY
73 # - fixed problem in 0.54's for() patch in `for (@ary)'
74 # - fixed precedence in conditional of ?:
75 # - tweaked list paren elimination in `my($x) = @_'
76 # - made continue-block detection trickier wrt. null ops
77 # - fixed various prototype problems in pp_entersub
78 # - added support for sub prototypes that never get GVs
79 # - added unquoting for special filehandle first arg in truncate
80 # - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
81 # - added semicolons at the ends of blocks
82 # - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
83 # Changes between 0.56 and 0.561:
84 # - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
85 # - used new B.pm symbolic constants (done by Nick Ing-Simmons)
86 # Changes between 0.561 and 0.57:
87 # - stylistic changes to symbolic constant stuff
88 # - handled scope in s///e replacement code
89 # - added unquote option for expanding "" into concats, etc.
90 # - split method and proto parts of pp_entersub into separate functions
91 # - various minor cleanups
93 # - added parens in \&foo (patch by Albert Dvornik)
94 # Changes between 0.57 and 0.58:
95 # - fixed `0' statements that weren't being printed
96 # - added methods for use from other programs
97 # (based on patches from James Duncan and Hugo van der Sanden)
98 # - added -si and -sT to control indenting (also based on a patch from Hugo)
99 # - added -sv to print something else instead of '???'
100 # - preliminary version of utf8 tr/// handling
101 # Changes after 0.58:
102 # - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
103 # - added support for Hugo's new OP_SETSTATE (like nextstate)
104 # Changes between 0.58 and 0.59
105 # - added support for Chip's OP_METHOD_NAMED
106 # - added support for Ilya's OPpTARGET_MY optimization
107 # - elided arrows before `()' subscripts when possible
108 # Changes between 0.59 and 0.60
109 # - support for method attributes was added
110 # - some warnings fixed
111 # - separate recognition of constant subs
112 # - rewrote continue block handling, now recognizing for loops
113 # - added more control of expanding control structures
114 # Changes between 0.60 and 0.61 (mostly by Robin Houston)
116 # - support for pragmas and 'use'
117 # - support for the little-used $[ variable
118 # - support for __DATA__ sections
120 # - BEGIN, CHECK, INIT and END blocks
121 # - scoping of subroutine declarations fixed
122 # - compile-time output from the input program can be suppressed, so that the
123 # output is just the deparsed code. (a change to O.pm in fact)
124 # - our() declarations
125 # - *all* the known bugs are now listed in the BUGS section
126 # - comprehensive test mechanism (TEST -deparse)
127 # Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
130 # - support for command-line switches (-l, -0, etc.)
131 # Changes between 0.63 and 0.64
132 # - support for //, CHECK blocks, and assertions
133 # - improved handling of foreach loops and lexicals
134 # - option to use Data::Dumper for constants
136 # - discovered lots more bugs not yet fixed
140 # Changes between 0.72 and 0.73
141 # - support new switch constructs
144 # (See also BUGS section at the end of this file)
146 # - finish tr/// changes
147 # - add option for even more parens (generalize \&foo change)
148 # - left/right context
149 # - copy comments (look at real text with $^P?)
150 # - avoid semis in one-statement blocks
151 # - associativity of &&=, ||=, ?:
152 # - ',' => '=>' (auto-unquote?)
153 # - break long lines ("\r" as discretionary break?)
154 # - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
155 # - more style options: brace style, hex vs. octal, quotes, ...
156 # - print big ints as hex/octal instead of decimal (heuristic?)
157 # - handle `my $x if 0'?
158 # - version using op_next instead of op_first/sibling?
159 # - avoid string copies (pass arrays, one big join?)
162 # Current test.deparse failures
163 # comp/hints 6 - location of BEGIN blocks wrt. block openings
164 # run/switchI 1 - missing -I switches entirely
165 # perl -Ifoo -e 'print @INC'
166 # op/caller 2 - warning mask propagates backwards before warnings::register
167 # 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register'
168 # op/getpid 2 - can't assign to shared my() declaration (threads only)
169 # 'my $x : shared = 5'
170 # op/override 7 - parens on overridden require change v-string interpretation
171 # 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6'
172 # c.f. 'BEGIN { *f = sub {0} }; f 2'
173 # op/pat 774 - losing Unicode-ness of Latin1-only strings
174 # 'use charnames ":short"; $x="\N{latin:a with acute}"'
175 # op/recurse 12 - missing parens on recursive call makes it look like method
177 # op/subst 90 - inconsistent handling of utf8 under "use utf8"
178 # op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open
179 # op/tiehandle compile - "use strict" deparsed in the wrong place
181 # ext/B/t/xref 11 - line numbers when we add newlines to one-line subs
182 # ext/Data/Dumper/t/dumper compile
183 # ext/DB_file/several
185 # ext/Ernno/Errno warnings
186 # ext/IO/lib/IO/t/io_sel 23
187 # ext/PerlIO/t/encoding compile
188 # ext/POSIX/t/posix 6
189 # ext/Socket/Socket 8
190 # ext/Storable/t/croak compile
191 # lib/Attribute/Handlers/t/multi compile
192 # lib/bignum/ several
196 # lib/ExtUtils/t/bytes 4
197 # lib/File/DosGlob compile
198 # lib/Filter/Simple/t/data 1
199 # lib/Math/BigInt/t/constant 1
200 # lib/Net/t/config Deparse-warning
201 # lib/overload compile
202 # lib/Switch/ several
204 # lib/Test/Simple several
206 # lib/Tie/File/t/29_downcopy 5
209 # Object fields (were globals):
212 # (local($a), local($b)) and local($a, $b) have the same internal
213 # representation but the short form looks better. We notice we can
214 # use a large-scale local when checking the list, but need to prevent
215 # individual locals too. This hash holds the addresses of OPs that
216 # have already had their local-ness accounted for. The same thing
220 # CV for current sub (or main program) being deparsed
223 # Cached hash of lexical variables for curcv: keys are names,
224 # each value is an array of pairs, indicating the cop_seq of scopes
225 # in which a var of that name is valid.
228 # COP for statement being deparsed
231 # name of the current package for deparsed code
234 # array of [cop_seq, CV, is_format?] for subs and formats we still
238 # as above, but [name, prototype] for subs that never got a GV
240 # subs_done, forms_done:
241 # keys are addresses of GVs for subs and formats we've already
242 # deparsed (or at least put into subs_todo)
245 # keys are names of subs for which we've printed declarations.
246 # That means we can omit parentheses from the arguments. It also means we
247 # need to put CORE:: on core functions of the same name.
250 # Keeps track of fully qualified names of all deparsed subs.
255 # cuddle: ` ' or `\n', depending on -sC
260 # A little explanation of how precedence contexts and associativity
263 # deparse() calls each per-op subroutine with an argument $cx (short
264 # for context, but not the same as the cx* in the perl core), which is
265 # a number describing the op's parents in terms of precedence, whether
266 # they're inside an expression or at statement level, etc. (see
267 # chart below). When ops with children call deparse on them, they pass
268 # along their precedence. Fractional values are used to implement
269 # associativity (`($x + $y) + $z' => `$x + $y + $y') and related
270 # parentheses hacks. The major disadvantage of this scheme is that
271 # it doesn't know about right sides and left sides, so say if you
272 # assign a listop to a variable, it can't tell it's allowed to leave
273 # the parens off the listop.
276 # 26 [TODO] inside interpolation context ("")
277 # 25 left terms and list operators (leftward)
281 # 21 right ! ~ \ and unary + and -
286 # 16 nonassoc named unary operators
287 # 15 nonassoc < > <= >= lt gt le ge
288 # 14 nonassoc == != <=> eq ne cmp
295 # 7 right = += -= *= etc.
297 # 5 nonassoc list operators (rightward)
301 # 1 statement modifiers
302 # 0.5 statements, but still print scopes as do { ... }
305 # Nonprinting characters with special meaning:
306 # \cS - steal parens (see maybe_parens_unop)
307 # \n - newline and indent
308 # \t - increase indent
309 # \b - decrease indent (`outdent')
310 # \f - flush left (no indent)
311 # \cK - kill following semicolon, if any
315 return class($op) eq "NULL";
320 my($cv, $is_form) = @_;
321 return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE});
323 if ($cv->OUTSIDE_SEQ) {
324 $seq = $cv->OUTSIDE_SEQ;
325 } elsif (!null($cv->START) and is_state($cv->START)) {
326 $seq = $cv->START->cop_seq;
330 push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form];
331 unless ($is_form || class($cv->STASH) eq 'SPECIAL') {
332 $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1;
338 my $ent = shift @{$self->{'subs_todo'}};
341 my $name = $self->gv_name($gv);
343 return "format $name =\n"
344 . $self->deparse_format($ent->[1]). "\n";
346 $self->{'subs_declared'}{$name} = 1;
347 if ($name eq "BEGIN") {
348 my $use_dec = $self->begin_is_use($cv);
349 if (defined ($use_dec) and $self->{'expand'} < 5) {
350 return () if 0 == length($use_dec);
355 if ($self->{'linenums'}) {
356 my $line = $gv->LINE;
357 my $file = $gv->FILE;
358 $l = "\n\f#line $line \"$file\"\n";
361 if (class($cv->STASH) ne "SPECIAL") {
362 my $stash = $cv->STASH->NAME;
363 if ($stash ne $self->{'curstash'}) {
364 $p = "package $stash;\n";
365 $name = "$self->{'curstash'}::$name" unless $name =~ /::/;
366 $self->{'curstash'} = $stash;
368 $name =~ s/^\Q$stash\E::(?!\z|.*::)//;
370 return "${p}${l}sub $name " . $self->deparse_sub($cv);
374 # Return a "use" declaration for this BEGIN block, if appropriate
376 my ($self, $cv) = @_;
377 my $root = $cv->ROOT;
378 local @$self{qw'curcv curcvlex'} = ($cv);
380 #B::walkoptree($cv->ROOT, "debug");
381 my $lineseq = $root->first;
382 return if $lineseq->name ne "lineseq";
384 my $req_op = $lineseq->first->sibling;
385 return if $req_op->name ne "require";
388 if ($req_op->first->private & OPpCONST_BARE) {
389 # Actually it should always be a bareword
390 $module = $self->const_sv($req_op->first)->PV;
391 $module =~ s[/][::]g;
395 $module = $self->const($self->const_sv($req_op->first), 6);
399 my $version_op = $req_op->sibling;
400 return if class($version_op) eq "NULL";
401 if ($version_op->name eq "lineseq") {
402 # We have a version parameter; skip nextstate & pushmark
403 my $constop = $version_op->first->next->next;
405 return unless $self->const_sv($constop)->PV eq $module;
406 $constop = $constop->sibling;
407 $version = $self->const_sv($constop);
408 if (class($version) eq "IV") {
409 $version = $version->int_value;
410 } elsif (class($version) eq "NV") {
411 $version = $version->NV;
412 } elsif (class($version) ne "PVMG") {
413 # Includes PVIV and PVNV
414 $version = $version->PV;
416 # version specified as a v-string
417 $version = 'v'.join '.', map ord, split //, $version->PV;
419 $constop = $constop->sibling;
420 return if $constop->name ne "method_named";
421 return if $self->const_sv($constop)->PV ne "VERSION";
424 $lineseq = $version_op->sibling;
425 return if $lineseq->name ne "lineseq";
426 my $entersub = $lineseq->first->sibling;
427 if ($entersub->name eq "stub") {
428 return "use $module $version ();\n" if defined $version;
429 return "use $module ();\n";
431 return if $entersub->name ne "entersub";
433 # See if there are import arguments
436 my $svop = $entersub->first->sibling; # Skip over pushmark
437 return unless $self->const_sv($svop)->PV eq $module;
439 # Pull out the arguments
440 for ($svop=$svop->sibling; $svop->name ne "method_named";
441 $svop = $svop->sibling) {
442 $args .= ", " if length($args);
443 $args .= $self->deparse($svop, 6);
447 my $method_named = $svop;
448 return if $method_named->name ne "method_named";
449 my $method_name = $self->const_sv($method_named)->PV;
451 if ($method_name eq "unimport") {
455 # Certain pragmas are dealt with using hint bits,
456 # so we ignore them here
457 if ($module eq 'strict' || $module eq 'integer'
458 || $module eq 'bytes' || $module eq 'warnings'
459 || $module eq 'feature') {
463 if (defined $version && length $args) {
464 return "$use $module $version ($args);\n";
465 } elsif (defined $version) {
466 return "$use $module $version;\n";
467 } elsif (length $args) {
468 return "$use $module ($args);\n";
470 return "$use $module;\n";
475 my ($self, $pack) = @_;
477 if (!defined $pack) {
482 $pack =~ s/(::)?$/::/;
484 $stash = \%{"main::$pack"};
486 my %stash = svref_2object($stash)->ARRAY;
487 while (my ($key, $val) = each %stash) {
488 my $class = class($val);
489 if ($class eq "PV") {
490 # Just a prototype. As an ugly but fairly effective way
491 # to find out if it belongs here is to see if the AUTOLOAD
492 # (if any) for the stash was defined in one of our files.
493 my $A = $stash{"AUTOLOAD"};
494 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
495 && class($A->CV) eq "CV") {
497 next unless $AF eq $0 || exists $self->{'files'}{$AF};
499 push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV];
500 } elsif ($class eq "IV" && !($val->FLAGS & SVf_ROK)) {
501 # Just a name. As above.
502 # But skip proxy constant subroutines, as some form of perl-space
503 # visible code must have created them, be it a use statement, or
504 # some direct symbol-table manipulation code that we will Deparse
505 my $A = $stash{"AUTOLOAD"};
506 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
507 && class($A->CV) eq "CV") {
509 next unless $AF eq $0 || exists $self->{'files'}{$AF};
511 push @{$self->{'protos_todo'}}, [$pack . $key, undef];
512 } elsif ($class eq "GV") {
513 if (class(my $cv = $val->CV) ne "SPECIAL") {
514 next if $self->{'subs_done'}{$$val}++;
515 next if $$val != ${$cv->GV}; # Ignore imposters
518 if (class(my $cv = $val->FORM) ne "SPECIAL") {
519 next if $self->{'forms_done'}{$$val}++;
520 next if $$val != ${$cv->GV}; # Ignore imposters
523 if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
524 $self->stash_subs($pack . $key)
525 unless $pack eq '' && $key eq 'main::';
526 # avoid infinite recursion
536 foreach $ar (@{$self->{'protos_todo'}}) {
537 my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : "");
538 push @ret, "sub " . $ar->[0] . "$proto;\n";
540 delete $self->{'protos_todo'};
548 while (length($opt = substr($opts, 0, 1))) {
550 $self->{'cuddle'} = " ";
551 $opts = substr($opts, 1);
552 } elsif ($opt eq "i") {
553 $opts =~ s/^i(\d+)//;
554 $self->{'indent_size'} = $1;
555 } elsif ($opt eq "T") {
556 $self->{'use_tabs'} = 1;
557 $opts = substr($opts, 1);
558 } elsif ($opt eq "v") {
559 $opts =~ s/^v([^.]*)(.|$)//;
560 $self->{'ex_const'} = $1;
567 my $self = bless {}, $class;
568 $self->{'cuddle'} = "\n";
569 $self->{'curcop'} = undef;
570 $self->{'curstash'} = "main";
571 $self->{'ex_const'} = "'???'";
572 $self->{'expand'} = 0;
573 $self->{'files'} = {};
574 $self->{'indent_size'} = 4;
575 $self->{'linenums'} = 0;
576 $self->{'parens'} = 0;
577 $self->{'subs_todo'} = [];
578 $self->{'unquote'} = 0;
579 $self->{'use_dumper'} = 0;
580 $self->{'use_tabs'} = 0;
582 $self->{'ambient_arybase'} = 0;
583 $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
584 $self->{'ambient_hints'} = 0;
585 $self->{'ambient_hinthash'} = undef;
588 while (my $arg = shift @_) {
590 $self->{'use_dumper'} = 1;
591 require Data::Dumper;
592 } elsif ($arg =~ /^-f(.*)/) {
593 $self->{'files'}{$1} = 1;
594 } elsif ($arg eq "-l") {
595 $self->{'linenums'} = 1;
596 } elsif ($arg eq "-p") {
597 $self->{'parens'} = 1;
598 } elsif ($arg eq "-P") {
599 $self->{'noproto'} = 1;
600 } elsif ($arg eq "-q") {
601 $self->{'unquote'} = 1;
602 } elsif (substr($arg, 0, 2) eq "-s") {
603 $self->style_opts(substr $arg, 2);
604 } elsif ($arg =~ /^-x(\d)$/) {
605 $self->{'expand'} = $1;
612 # Mask out the bits that L<warnings::register> uses
615 $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
622 # Initialise the contextual information, either from
623 # defaults provided with the ambient_pragmas method,
624 # or from perl's own defaults otherwise.
628 $self->{'arybase'} = $self->{'ambient_arybase'};
629 $self->{'warnings'} = defined ($self->{'ambient_warnings'})
630 ? $self->{'ambient_warnings'} & WARN_MASK
632 $self->{'hints'} = $self->{'ambient_hints'};
633 $self->{'hints'} &= 0xFF if $] < 5.009;
634 $self->{'hinthash'} = $self->{'ambient_hinthash'};
636 # also a convenient place to clear out subs_declared
637 delete $self->{'subs_declared'};
643 my $self = B::Deparse->new(@args);
644 # First deparse command-line args
645 if (defined $^I) { # deparse -i
646 print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
648 if ($^W) { # deparse -w
649 print qq(BEGIN { \$^W = $^W; }\n);
651 if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
652 my $fs = perlstring($/) || 'undef';
653 my $bs = perlstring($O::savebackslash) || 'undef';
654 print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
656 my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
657 my @UNITCHECKs = B::unitcheck_av->isa("B::AV")
658 ? B::unitcheck_av->ARRAY
660 my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
661 my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
662 my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
663 for my $block (@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs) {
664 $self->todo($block, 0);
667 local($SIG{"__DIE__"}) =
669 if ($self->{'curcop'}) {
670 my $cop = $self->{'curcop'};
671 my($line, $file) = ($cop->line, $cop->file);
672 print STDERR "While deparsing $file near line $line,\n";
675 $self->{'curcv'} = main_cv;
676 $self->{'curcvlex'} = undef;
677 print $self->print_protos;
678 @{$self->{'subs_todo'}} =
679 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
680 print $self->indent($self->deparse_root(main_root)), "\n"
681 unless null main_root;
683 while (scalar(@{$self->{'subs_todo'}})) {
684 push @text, $self->next_todo;
686 print $self->indent(join("", @text)), "\n" if @text;
688 # Print __DATA__ section, if necessary
690 my $laststash = defined $self->{'curcop'}
691 ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
692 if (defined *{$laststash."::DATA"}{IO}) {
693 print "package $laststash;\n"
694 unless $laststash eq $self->{'curstash'};
696 print readline(*{$laststash."::DATA"});
704 croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
707 return $self->indent($self->deparse_sub(svref_2object($sub)));
710 sub ambient_pragmas {
712 my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0);
718 if ($name eq 'strict') {
721 if ($val eq 'none') {
722 $hint_bits &= ~strict::bits(qw/refs subs vars/);
728 @names = qw/refs subs vars/;
734 @names = split' ', $val;
736 $hint_bits |= strict::bits(@names);
739 elsif ($name eq '$[') {
743 elsif ($name eq 'integer'
745 || $name eq 'utf8') {
748 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
751 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
755 elsif ($name eq 're') {
757 if ($val eq 'none') {
758 $hint_bits &= ~re::bits(qw/taint eval/);
764 @names = qw/taint eval/;
770 @names = split' ',$val;
772 $hint_bits |= re::bits(@names);
775 elsif ($name eq 'warnings') {
776 if ($val eq 'none') {
777 $warning_bits = $warnings::NONE;
786 @names = split/\s+/, $val;
789 $warning_bits = $warnings::NONE if !defined ($warning_bits);
790 $warning_bits |= warnings::bits(@names);
793 elsif ($name eq 'warning_bits') {
794 $warning_bits = $val;
797 elsif ($name eq 'hint_bits') {
801 elsif ($name eq '%^H') {
806 croak "Unknown pragma type: $name";
810 croak "The ambient_pragmas method expects an even number of args";
813 $self->{'ambient_arybase'} = $arybase;
814 $self->{'ambient_warnings'} = $warning_bits;
815 $self->{'ambient_hints'} = $hint_bits;
816 $self->{'ambient_hinthash'} = $hinthash;
819 # This method is the inner loop, so try to keep it simple
824 Carp::confess("Null op in deparse") if !defined($op)
825 || class($op) eq "NULL";
826 my $meth = "pp_" . $op->name;
827 return $self->$meth($op, $cx);
833 my @lines = split(/\n/, $txt);
838 my $cmd = substr($line, 0, 1);
839 if ($cmd eq "\t" or $cmd eq "\b") {
840 $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
841 if ($self->{'use_tabs'}) {
842 $leader = "\t" x ($level / 8) . " " x ($level % 8);
844 $leader = " " x $level;
846 $line = substr($line, 1);
848 if (substr($line, 0, 1) eq "\f") {
849 $line = substr($line, 1); # no indent
851 $line = $leader . $line;
855 return join("\n", @lines);
862 Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
863 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
864 local $self->{'curcop'} = $self->{'curcop'};
865 if ($cv->FLAGS & SVf_POK) {
866 $proto = "(". $cv->PV . ") ";
868 if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
870 $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
871 $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
872 $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
875 local($self->{'curcv'}) = $cv;
876 local($self->{'curcvlex'});
877 local(@$self{qw'curstash warnings hints hinthash'})
878 = @$self{qw'curstash warnings hints hinthash'};
880 if (not null $cv->ROOT) {
881 my $lineseq = $cv->ROOT->first;
882 if ($lineseq->name eq "lineseq") {
884 for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
887 $body = $self->lineseq(undef, @ops).";";
888 my $scope_en = $self->find_scope_en($lineseq);
889 if (defined $scope_en) {
890 my $subs = join"", $self->seq_subs($scope_en);
891 $body .= ";\n$subs" if length($subs);
895 $body = $self->deparse($cv->ROOT->first, 0);
899 my $sv = $cv->const_sv;
901 # uh-oh. inlinable sub... format it differently
902 return $proto . "{ " . $self->const($sv, 0) . " }\n";
903 } else { # XSUB? (or just a declaration)
907 return $proto ."{\n\t$body\n\b}" ."\n";
914 local($self->{'curcv'}) = $form;
915 local($self->{'curcvlex'});
916 local($self->{'in_format'}) = 1;
917 local(@$self{qw'curstash warnings hints hinthash'})
918 = @$self{qw'curstash warnings hints hinthash'};
919 my $op = $form->ROOT;
921 return "\f." if $op->first->name eq 'stub'
922 || $op->first->name eq 'nextstate';
923 $op = $op->first->first; # skip leavewrite, lineseq
924 while (not null $op) {
925 $op = $op->sibling; # skip nextstate
927 $kid = $op->first->sibling; # skip pushmark
928 push @text, "\f".$self->const_sv($kid)->PV;
929 $kid = $kid->sibling;
930 for (; not null $kid; $kid = $kid->sibling) {
931 push @exprs, $self->deparse($kid, 0);
933 push @text, "\f".join(", ", @exprs)."\n" if @exprs;
936 return join("", @text) . "\f.";
941 return $op->name eq "leave" || $op->name eq "scope"
942 || $op->name eq "lineseq"
943 || ($op->name eq "null" && class($op) eq "UNOP"
944 && (is_scope($op->first) || $op->first->name eq "enter"));
948 my $name = $_[0]->name;
949 return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
952 sub is_miniwhile { # check for one-line loop (`foo() while $y--')
954 return (!null($op) and null($op->sibling)
955 and $op->name eq "null" and class($op) eq "UNOP"
956 and (($op->first->name =~ /^(and|or)$/
957 and $op->first->first->sibling->name eq "lineseq")
958 or ($op->first->name eq "lineseq"
959 and not null $op->first->first->sibling
960 and $op->first->first->sibling->name eq "unstack")
964 # Check if the op and its sibling are the initialization and the rest of a
965 # for (..;..;..) { ... } loop
968 # This OP might be almost anything, though it won't be a
969 # nextstate. (It's the initialization, so in the canonical case it
970 # will be an sassign.) The sibling is (old style) a lineseq whose
971 # first child is a nextstate and whose second is a leaveloop, or
972 # (new style) an unstack whose sibling is a leaveloop.
973 my $lseq = $op->sibling;
974 return 0 unless !is_state($op) and !null($lseq);
975 if ($lseq->name eq "lineseq") {
976 if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
977 && (my $sib = $lseq->first->sibling)) {
978 return (!null($sib) && $sib->name eq "leaveloop");
980 } elsif ($lseq->name eq "unstack" && ($lseq->flags & OPf_SPECIAL)) {
981 my $sib = $lseq->sibling;
982 return $sib && !null($sib) && $sib->name eq "leaveloop";
989 return ($op->name eq "rv2sv" or
990 $op->name eq "padsv" or
991 $op->name eq "gv" or # only in array/hash constructs
992 $op->flags & OPf_KIDS && !null($op->first)
993 && $op->first->name eq "gvsv");
998 my($text, $cx, $prec) = @_;
999 if ($prec < $cx # unary ops nest just fine
1000 or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
1001 or $self->{'parens'})
1004 # In a unop, let parent reuse our parens; see maybe_parens_unop
1005 $text = "\cS" . $text if $cx == 16;
1012 # same as above, but get around the `if it looks like a function' rule
1013 sub maybe_parens_unop {
1015 my($name, $kid, $cx) = @_;
1016 if ($cx > 16 or $self->{'parens'}) {
1017 $kid = $self->deparse($kid, 1);
1018 if ($name eq "umask" && $kid =~ /^\d+$/) {
1019 $kid = sprintf("%#o", $kid);
1021 return $self->keyword($name) . "($kid)";
1023 $kid = $self->deparse($kid, 16);
1024 if ($name eq "umask" && $kid =~ /^\d+$/) {
1025 $kid = sprintf("%#o", $kid);
1027 $name = $self->keyword($name);
1028 if (substr($kid, 0, 1) eq "\cS") {
1030 return $name . substr($kid, 1);
1031 } elsif (substr($kid, 0, 1) eq "(") {
1032 # avoid looks-like-a-function trap with extra parens
1033 # (`+' can lead to ambiguities)
1034 return "$name(" . $kid . ")";
1036 return "$name $kid";
1041 sub maybe_parens_func {
1043 my($func, $text, $cx, $prec) = @_;
1044 if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
1045 return "$func($text)";
1047 return "$func $text";
1053 my($op, $cx, $text) = @_;
1054 my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
1055 if ($op->private & (OPpLVAL_INTRO|$our_intro)
1056 and not $self->{'avoid_local'}{$$op}) {
1057 my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
1058 if( $our_local eq 'our' ) {
1059 if ( $text !~ /^\W(\w+::)*\w+\z/
1060 and !utf8::decode($text) || $text !~ /^\W(\w+::)*\w+\z/
1062 die "Unexpected our($text)\n";
1064 $text =~ s/(\w+::)+//;
1066 if (want_scalar($op)) {
1067 return "$our_local $text";
1069 return $self->maybe_parens_func("$our_local", $text, $cx, 16);
1078 my($op, $cx, $func, @args) = @_;
1079 if ($op->private & OPpTARGET_MY) {
1080 my $var = $self->padname($op->targ);
1081 my $val = $func->($self, $op, 7, @args);
1082 return $self->maybe_parens("$var = $val", $cx, 7);
1084 return $func->($self, $op, $cx, @args);
1091 return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
1096 my($op, $cx, $text) = @_;
1097 if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
1098 my $my = $op->private & OPpPAD_STATE ? "state" : "my";
1099 if (want_scalar($op)) {
1102 return $self->maybe_parens_func($my, $text, $cx, 16);
1109 # The following OPs don't have functions:
1111 # pp_padany -- does not exist after parsing
1114 if ($AUTOLOAD =~ s/^.*::pp_//) {
1115 warn "unexpected OP_".uc $AUTOLOAD;
1118 die "Undefined subroutine $AUTOLOAD called";
1122 sub DESTROY {} # Do not AUTOLOAD
1124 # $root should be the op which represents the root of whatever
1125 # we're sequencing here. If it's undefined, then we don't append
1126 # any subroutine declarations to the deparsed ops, otherwise we
1127 # append appropriate declarations.
1129 my($self, $root, @ops) = @_;
1132 my $out_cop = $self->{'curcop'};
1133 my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
1135 if (defined $root) {
1136 $limit_seq = $out_seq;
1138 $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
1139 $limit_seq = $nseq if !defined($limit_seq)
1140 or defined($nseq) && $nseq < $limit_seq;
1142 $limit_seq = $self->{'limit_seq'}
1143 if defined($self->{'limit_seq'})
1144 && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
1145 local $self->{'limit_seq'} = $limit_seq;
1147 $self->walk_lineseq($root, \@ops,
1148 sub { push @exprs, $_[0]} );
1150 my $body = join(";\n", grep {length} @exprs);
1152 if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
1153 $subs = join "\n", $self->seq_subs($limit_seq);
1155 return join(";\n", grep {length} $body, $subs);
1159 my($real_block, $self, $op, $cx) = @_;
1163 local(@$self{qw'curstash warnings hints hinthash'})
1164 = @$self{qw'curstash warnings hints hinthash'} if $real_block;
1166 $kid = $op->first->sibling; # skip enter
1167 if (is_miniwhile($kid)) {
1168 my $top = $kid->first;
1169 my $name = $top->name;
1170 if ($name eq "and") {
1172 } elsif ($name eq "or") {
1174 } else { # no conditional -> while 1 or until 0
1175 return $self->deparse($top->first, 1) . " while 1";
1177 my $cond = $top->first;
1178 my $body = $cond->sibling->first; # skip lineseq
1179 $cond = $self->deparse($cond, 1);
1180 $body = $self->deparse($body, 1);
1181 return "$body $name $cond";
1186 for (; !null($kid); $kid = $kid->sibling) {
1189 if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
1190 return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
1192 my $lineseq = $self->lineseq($op, @kids);
1193 return (length ($lineseq) ? "$lineseq;" : "");
1197 sub pp_scope { scopeop(0, @_); }
1198 sub pp_lineseq { scopeop(0, @_); }
1199 sub pp_leave { scopeop(1, @_); }
1201 # This is a special case of scopeop and lineseq, for the case of the
1202 # main_root. The difference is that we print the output statements as
1203 # soon as we get them, for the sake of impatient users.
1207 local(@$self{qw'curstash warnings hints hinthash'})
1208 = @$self{qw'curstash warnings hints hinthash'};
1210 return if null $op->first; # Can happen, e.g., for Bytecode without -k
1211 for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
1214 $self->walk_lineseq($op, \@kids,
1215 sub { print $self->indent($_[0].';');
1216 print "\n" unless $_[1] == $#kids;
1221 my ($self, $op, $kids, $callback) = @_;
1223 for (my $i = 0; $i < @kids; $i++) {
1225 if (is_state $kids[$i]) {
1226 $expr = $self->deparse($kids[$i++], 0);
1228 $callback->($expr, $i);
1232 if (is_for_loop($kids[$i])) {
1233 $callback->($expr . $self->for_loop($kids[$i], 0),
1234 $i += $kids[$i]->sibling->name eq "unstack" ? 2 : 1);
1237 $expr .= $self->deparse($kids[$i], (@kids != 1)/2);
1238 $expr =~ s/;\n?\z//;
1239 $callback->($expr, $i);
1243 # The BEGIN {} is used here because otherwise this code isn't executed
1244 # when you run B::Deparse on itself.
1246 BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1247 "ENV", "ARGV", "ARGVOUT", "_"); }
1252 Carp::confess() unless ref($gv) eq "B::GV";
1253 my $stash = $gv->STASH->NAME;
1254 my $name = $gv->SAFENAME;
1255 if ($stash eq 'main' && $name =~ /^::/) {
1258 elsif (($stash eq 'main' && $globalnames{$name})
1259 or ($stash eq $self->{'curstash'} && !$globalnames{$name}
1260 && ($stash eq 'main' || $name !~ /::/))
1261 or $name =~ /^[^A-Za-z_:]/)
1265 $stash = $stash . "::";
1267 if ($name =~ /^(\^..|{)/) {
1268 $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
1270 return $stash . $name;
1273 # Return the name to use for a stash variable.
1274 # If a lexical with the same name is in scope, it may need to be
1276 sub stash_variable {
1277 my ($self, $prefix, $name) = @_;
1279 return "$prefix$name" if $name =~ /::/;
1281 unless ($prefix eq '$' || $prefix eq '@' || #'
1282 $prefix eq '%' || $prefix eq '$#') {
1283 return "$prefix$name";
1286 my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1287 return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
1288 return "$prefix$name";
1292 my ($self, $name) = @_;
1293 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1295 return 0 if !defined($self->{'curcop'});
1296 my $seq = $self->{'curcop'}->cop_seq;
1297 return 0 if !exists $self->{'curcvlex'}{$name};
1298 for my $a (@{$self->{'curcvlex'}{$name}}) {
1299 my ($st, $en) = @$a;
1300 return 1 if $seq > $st && $seq <= $en;
1305 sub populate_curcvlex {
1307 for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
1308 my $padlist = $cv->PADLIST;
1309 # an undef CV still in lexical chain
1310 next if class($padlist) eq "SPECIAL";
1311 my @padlist = $padlist->ARRAY;
1312 my @ns = $padlist[0]->ARRAY;
1314 for (my $i=0; $i<@ns; ++$i) {
1315 next if class($ns[$i]) eq "SPECIAL";
1316 next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars
1317 if (class($ns[$i]) eq "PV") {
1318 # Probably that pesky lexical @_
1321 my $name = $ns[$i]->PVX;
1322 my ($seq_st, $seq_en) =
1323 ($ns[$i]->FLAGS & SVf_FAKE)
1325 : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
1327 push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
1332 sub find_scope_st { ((find_scope(@_))[0]); }
1333 sub find_scope_en { ((find_scope(@_))[1]); }
1335 # Recurses down the tree, looking for pad variable introductions and COPs
1337 my ($self, $op, $scope_st, $scope_en) = @_;
1338 carp("Undefined op in find_scope") if !defined $op;
1339 return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1342 while(my $op = shift @queue ) {
1343 for (my $o=$op->first; $$o; $o=$o->sibling) {
1344 if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1345 my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW);
1346 my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH;
1347 $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1348 $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1349 return ($scope_st, $scope_en);
1351 elsif (is_state($o)) {
1352 my $c = $o->cop_seq;
1353 $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1354 $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1355 return ($scope_st, $scope_en);
1357 elsif ($o->flags & OPf_KIDS) {
1358 unshift (@queue, $o);
1363 return ($scope_st, $scope_en);
1366 # Returns a list of subs which should be inserted before the COP
1368 my ($self, $op, $out_seq) = @_;
1369 my $seq = $op->cop_seq;
1370 # If we have nephews, then our sequence number indicates
1371 # the cop_seq of the end of some sort of scope.
1372 if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
1373 and my $nseq = $self->find_scope_st($op->sibling) ) {
1376 $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1377 return $self->seq_subs($seq);
1381 my ($self, $seq) = @_;
1383 #push @text, "# ($seq)\n";
1385 return "" if !defined $seq;
1386 while (scalar(@{$self->{'subs_todo'}})
1387 and $seq > $self->{'subs_todo'}[0][0]) {
1388 push @text, $self->next_todo;
1393 # Notice how subs and formats are inserted between statements here;
1394 # also $[ assignments and pragmas.
1398 $self->{'curcop'} = $op;
1400 push @text, $self->cop_subs($op);
1401 my $stash = $op->stashpv;
1402 if ($stash ne $self->{'curstash'}) {
1403 push @text, "package $stash;\n";
1404 $self->{'curstash'} = $stash;
1407 if ($self->{'arybase'} != $op->arybase) {
1408 push @text, '$[ = '. $op->arybase .";\n";
1409 $self->{'arybase'} = $op->arybase;
1412 my $warnings = $op->warnings;
1414 if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
1415 $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
1417 elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
1418 $warning_bits = $warnings::NONE;
1420 elsif ($warnings->isa("B::SPECIAL")) {
1421 $warning_bits = undef;
1424 $warning_bits = $warnings->PV & WARN_MASK;
1427 if (defined ($warning_bits) and
1428 !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
1429 push @text, declare_warnings($self->{'warnings'}, $warning_bits);
1430 $self->{'warnings'} = $warning_bits;
1433 my $hints = $] < 5.008009 ? $op->private : $op->hints;
1434 if ($self->{'hints'} != $hints) {
1435 push @text, declare_hints($self->{'hints'}, $hints);
1436 $self->{'hints'} = $hints;
1439 # hack to check that the hint hash hasn't changed
1441 "@{[sort %{$self->{'hinthash'} || {}}]}"
1442 ne "@{[sort %{$op->hints_hash->HASH || {}}]}") {
1443 push @text, declare_hinthash($self->{'hinthash'}, $op->hints_hash->HASH, $self->{indent_size});
1444 $self->{'hinthash'} = $op->hints_hash->HASH;
1447 # This should go after of any branches that add statements, to
1448 # increase the chances that it refers to the same line it did in
1449 # the original program.
1450 if ($self->{'linenums'}) {
1451 push @text, "\f#line " . $op->line .
1452 ' "' . $op->file, qq'"\n';
1455 push @text, $op->label . ": " if $op->label;
1457 return join("", @text);
1460 sub declare_warnings {
1461 my ($from, $to) = @_;
1462 if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
1463 return "use warnings;\n";
1465 elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
1466 return "no warnings;\n";
1468 return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n";
1472 my ($from, $to) = @_;
1473 my $use = $to & ~$from;
1474 my $no = $from & ~$to;
1476 for my $pragma (hint_pragmas($use)) {
1477 $decls .= "use $pragma;\n";
1479 for my $pragma (hint_pragmas($no)) {
1480 $decls .= "no $pragma;\n";
1485 # Internal implementation hints that the core sets automatically, so don't need
1486 # (or want) to be passed back to the user
1487 my %ignored_hints = (
1493 sub declare_hinthash {
1494 my ($from, $to, $indent) = @_;
1496 for my $key (keys %$to) {
1497 next if $ignored_hints{$key};
1498 if (!defined $from->{$key} or $from->{$key} ne $to->{$key}) {
1499 push @decls, qq(\$^H{'$key'} = q($to->{$key}););
1502 for my $key (keys %$from) {
1503 next if $ignored_hints{$key};
1504 if (!exists $to->{$key}) {
1505 push @decls, qq(delete \$^H{'$key'};);
1508 @decls or return '';
1509 return join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n";
1515 push @pragmas, "integer" if $bits & 0x1;
1516 push @pragmas, "strict 'refs'" if $bits & 0x2;
1517 push @pragmas, "bytes" if $bits & 0x8;
1521 sub pp_dbstate { pp_nextstate(@_) }
1522 sub pp_setstate { pp_nextstate(@_) }
1524 sub pp_unstack { return "" } # see also leaveloop
1529 return $name if $name =~ /^CORE::/; # just in case
1531 $name !~ /^(?:chom?p|exec|system)\z/
1532 && !defined eval{prototype "CORE::$name"}
1535 exists $self->{subs_declared}{$name}
1537 exists &{"$self->{curstash}::$name"}
1539 return "CORE::$name"
1546 my($op, $cx, $name) = @_;
1547 return $self->keyword($name);
1552 my($op, $cx, $name) = @_;
1560 sub pp_wantarray { baseop(@_, "wantarray") }
1561 sub pp_fork { baseop(@_, "fork") }
1562 sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
1563 sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
1564 sub pp_time { maybe_targmy(@_, \&baseop, "time") }
1565 sub pp_tms { baseop(@_, "times") }
1566 sub pp_ghostent { baseop(@_, "gethostent") }
1567 sub pp_gnetent { baseop(@_, "getnetent") }
1568 sub pp_gprotoent { baseop(@_, "getprotoent") }
1569 sub pp_gservent { baseop(@_, "getservent") }
1570 sub pp_ehostent { baseop(@_, "endhostent") }
1571 sub pp_enetent { baseop(@_, "endnetent") }
1572 sub pp_eprotoent { baseop(@_, "endprotoent") }
1573 sub pp_eservent { baseop(@_, "endservent") }
1574 sub pp_gpwent { baseop(@_, "getpwent") }
1575 sub pp_spwent { baseop(@_, "setpwent") }
1576 sub pp_epwent { baseop(@_, "endpwent") }
1577 sub pp_ggrent { baseop(@_, "getgrent") }
1578 sub pp_sgrent { baseop(@_, "setgrent") }
1579 sub pp_egrent { baseop(@_, "endgrent") }
1580 sub pp_getlogin { baseop(@_, "getlogin") }
1582 sub POSTFIX () { 1 }
1584 # I couldn't think of a good short name, but this is the category of
1585 # symbolic unary operators with interesting precedence
1589 my($op, $cx, $name, $prec, $flags) = (@_, 0);
1590 my $kid = $op->first;
1591 $kid = $self->deparse($kid, $prec);
1592 return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
1596 sub pp_preinc { pfixop(@_, "++", 23) }
1597 sub pp_predec { pfixop(@_, "--", 23) }
1598 sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1599 sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1600 sub pp_i_preinc { pfixop(@_, "++", 23) }
1601 sub pp_i_predec { pfixop(@_, "--", 23) }
1602 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1603 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1604 sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
1606 sub pp_negate { maybe_targmy(@_, \&real_negate) }
1610 if ($op->first->name =~ /^(i_)?negate$/) {
1612 $self->pfixop($op, $cx, "-", 21.5);
1614 $self->pfixop($op, $cx, "-", 21);
1617 sub pp_i_negate { pp_negate(@_) }
1623 $self->pfixop($op, $cx, $self->keyword("not")." ", 4);
1625 $self->pfixop($op, $cx, "!", 21);
1631 my($op, $cx, $name) = @_;
1633 if ($op->flags & OPf_KIDS) {
1636 # this deals with 'boolkeys' right now
1637 return $self->deparse($kid,$cx);
1639 my $builtinname = $name;
1640 $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name";
1641 if (defined prototype($builtinname)
1642 && prototype($builtinname) =~ /^;?\*/
1643 && $kid->name eq "rv2gv") {
1647 return $self->maybe_parens_unop($name, $kid, $cx);
1649 return $self->keyword($name)
1650 . ($op->flags & OPf_SPECIAL ? "()" : "");
1654 sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
1655 sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
1656 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
1657 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
1658 sub pp_defined { unop(@_, "defined") }
1659 sub pp_undef { unop(@_, "undef") }
1660 sub pp_study { unop(@_, "study") }
1661 sub pp_ref { unop(@_, "ref") }
1662 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
1664 sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
1665 sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
1666 sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
1667 sub pp_srand { unop(@_, "srand") }
1668 sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
1669 sub pp_log { maybe_targmy(@_, \&unop, "log") }
1670 sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
1671 sub pp_int { maybe_targmy(@_, \&unop, "int") }
1672 sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
1673 sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
1674 sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
1676 sub pp_length { maybe_targmy(@_, \&unop, "length") }
1677 sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
1678 sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
1680 sub pp_each { unop(@_, "each") }
1681 sub pp_values { unop(@_, "values") }
1682 sub pp_keys { unop(@_, "keys") }
1683 { no strict 'refs'; *{"pp_r$_"} = *{"pp_$_"} for qw< keys each values >; }
1685 # no name because its an optimisation op that has no keyword
1688 sub pp_aeach { unop(@_, "each") }
1689 sub pp_avalues { unop(@_, "values") }
1690 sub pp_akeys { unop(@_, "keys") }
1691 sub pp_pop { unop(@_, "pop") }
1692 sub pp_shift { unop(@_, "shift") }
1694 sub pp_caller { unop(@_, "caller") }
1695 sub pp_reset { unop(@_, "reset") }
1696 sub pp_exit { unop(@_, "exit") }
1697 sub pp_prototype { unop(@_, "prototype") }
1699 sub pp_close { unop(@_, "close") }
1700 sub pp_fileno { unop(@_, "fileno") }
1701 sub pp_umask { unop(@_, "umask") }
1702 sub pp_untie { unop(@_, "untie") }
1703 sub pp_tied { unop(@_, "tied") }
1704 sub pp_dbmclose { unop(@_, "dbmclose") }
1705 sub pp_getc { unop(@_, "getc") }
1706 sub pp_eof { unop(@_, "eof") }
1707 sub pp_tell { unop(@_, "tell") }
1708 sub pp_getsockname { unop(@_, "getsockname") }
1709 sub pp_getpeername { unop(@_, "getpeername") }
1711 sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
1712 sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
1713 sub pp_readlink { unop(@_, "readlink") }
1714 sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
1715 sub pp_readdir { unop(@_, "readdir") }
1716 sub pp_telldir { unop(@_, "telldir") }
1717 sub pp_rewinddir { unop(@_, "rewinddir") }
1718 sub pp_closedir { unop(@_, "closedir") }
1719 sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
1720 sub pp_localtime { unop(@_, "localtime") }
1721 sub pp_gmtime { unop(@_, "gmtime") }
1722 sub pp_alarm { unop(@_, "alarm") }
1723 sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
1725 sub pp_dofile { unop(@_, "do") }
1726 sub pp_entereval { unop(@_, "eval") }
1728 sub pp_ghbyname { unop(@_, "gethostbyname") }
1729 sub pp_gnbyname { unop(@_, "getnetbyname") }
1730 sub pp_gpbyname { unop(@_, "getprotobyname") }
1731 sub pp_shostent { unop(@_, "sethostent") }
1732 sub pp_snetent { unop(@_, "setnetent") }
1733 sub pp_sprotoent { unop(@_, "setprotoent") }
1734 sub pp_sservent { unop(@_, "setservent") }
1735 sub pp_gpwnam { unop(@_, "getpwnam") }
1736 sub pp_gpwuid { unop(@_, "getpwuid") }
1737 sub pp_ggrnam { unop(@_, "getgrnam") }
1738 sub pp_ggrgid { unop(@_, "getgrgid") }
1740 sub pp_lock { unop(@_, "lock") }
1742 sub pp_continue { unop(@_, "continue"); }
1744 my ($self, $op) = @_;
1745 return "" if $op->flags & OPf_SPECIAL;
1751 my($op, $cx, $givwhen) = @_;
1753 my $enterop = $op->first;
1755 if ($enterop->flags & OPf_SPECIAL) {
1757 $block = $self->deparse($enterop->first, 0);
1760 my $cond = $enterop->first;
1761 my $cond_str = $self->deparse($cond, 1);
1762 $head = "$givwhen ($cond_str)";
1763 $block = $self->deparse($cond->sibling, 0);
1771 sub pp_leavegiven { givwhen(@_, "given"); }
1772 sub pp_leavewhen { givwhen(@_, "when"); }
1778 if ($op->private & OPpEXISTS_SUB) {
1779 # Checking for the existence of a subroutine
1780 return $self->maybe_parens_func("exists",
1781 $self->pp_rv2cv($op->first, 16), $cx, 16);
1783 if ($op->flags & OPf_SPECIAL) {
1784 # Array element, not hash element
1785 return $self->maybe_parens_func("exists",
1786 $self->pp_aelem($op->first, 16), $cx, 16);
1788 return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
1796 if ($op->private & OPpSLICE) {
1797 if ($op->flags & OPf_SPECIAL) {
1798 # Deleting from an array, not a hash
1799 return $self->maybe_parens_func("delete",
1800 $self->pp_aslice($op->first, 16),
1803 return $self->maybe_parens_func("delete",
1804 $self->pp_hslice($op->first, 16),
1807 if ($op->flags & OPf_SPECIAL) {
1808 # Deleting from an array, not a hash
1809 return $self->maybe_parens_func("delete",
1810 $self->pp_aelem($op->first, 16),
1813 return $self->maybe_parens_func("delete",
1814 $self->pp_helem($op->first, 16),
1822 my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
1823 if (class($op) eq "UNOP" and $op->first->name eq "const"
1824 and $op->first->private & OPpCONST_BARE)
1826 my $name = $self->const_sv($op->first)->PV;
1829 return "$opname $name";
1831 $self->unop($op, $cx, $op->first->private & OPpCONST_NOVER ? "no" : $opname);
1838 my $kid = $op->first;
1839 if (not null $kid->sibling) {
1840 # XXX Was a here-doc
1841 return $self->dquote($op);
1843 $self->unop(@_, "scalar");
1850 return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
1853 sub anon_hash_or_list {
1857 my($pre, $post) = @{{"anonlist" => ["[","]"],
1858 "anonhash" => ["{","}"]}->{$op->name}};
1860 $op = $op->first->sibling; # skip pushmark
1861 for (; !null($op); $op = $op->sibling) {
1862 $expr = $self->deparse($op, 6);
1865 if ($pre eq "{" and $cx < 1) {
1866 # Disambiguate that it's not a block
1869 return $pre . join(", ", @exprs) . $post;
1875 if ($op->flags & OPf_SPECIAL) {
1876 return $self->anon_hash_or_list($op, $cx);
1878 warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
1882 *pp_anonhash = \&pp_anonlist;
1887 my $kid = $op->first;
1888 if ($kid->name eq "null") {
1890 if (!null($kid->sibling) and
1891 $kid->sibling->name eq "anoncode") {
1892 return $self->e_anoncode({ code => $self->padval($kid->sibling->targ) });
1893 } elsif ($kid->name eq "pushmark") {
1894 my $sib_name = $kid->sibling->name;
1895 if ($sib_name =~ /^(pad|rv2)[ah]v$/
1896 and not $kid->sibling->flags & OPf_REF)
1898 # The @a in \(@a) isn't in ref context, but only when the
1900 return "\\(" . $self->pp_list($op->first) . ")";
1901 } elsif ($sib_name eq 'entersub') {
1902 my $text = $self->deparse($kid->sibling, 1);
1903 # Always show parens for \(&func()), but only with -p otherwise
1904 $text = "($text)" if $self->{'parens'}
1905 or $kid->sibling->private & OPpENTERSUB_AMPER;
1910 $self->pfixop($op, $cx, "\\", 20);
1914 my ($self, $info) = @_;
1915 my $text = $self->deparse_sub($info->{code});
1916 return "sub " . $text;
1919 sub pp_srefgen { pp_refgen(@_) }
1924 my $kid = $op->first;
1925 $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
1926 return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
1927 return $self->unop($op, $cx, "readline");
1933 return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
1936 # Unary operators that can occur as pseudo-listops inside double quotes
1939 my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
1941 if ($op->flags & OPf_KIDS) {
1943 # If there's more than one kid, the first is an ex-pushmark.
1944 $kid = $kid->sibling if not null $kid->sibling;
1945 return $self->maybe_parens_unop($name, $kid, $cx);
1947 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1951 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
1952 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
1953 sub pp_uc { dq_unop(@_, "uc") }
1954 sub pp_lc { dq_unop(@_, "lc") }
1955 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
1959 my ($op, $cx, $name) = @_;
1960 if (class($op) eq "PVOP") {
1961 return "$name " . $op->pv;
1962 } elsif (class($op) eq "OP") {
1964 } elsif (class($op) eq "UNOP") {
1965 # Note -- loop exits are actually exempt from the
1966 # looks-like-a-func rule, but a few extra parens won't hurt
1967 return $self->maybe_parens_unop($name, $op->first, $cx);
1971 sub pp_last { loopex(@_, "last") }
1972 sub pp_next { loopex(@_, "next") }
1973 sub pp_redo { loopex(@_, "redo") }
1974 sub pp_goto { loopex(@_, "goto") }
1975 sub pp_dump { loopex(@_, $_[0]->keyword("dump")) }
1979 my($op, $cx, $name) = @_;
1980 if (class($op) eq "UNOP") {
1981 # Genuine `-X' filetests are exempt from the LLAFR, but not
1982 # l?stat(); for the sake of clarity, give'em all parens
1983 return $self->maybe_parens_unop($name, $op->first, $cx);
1984 } elsif (class($op) =~ /^(SV|PAD)OP$/) {
1985 return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
1986 } else { # I don't think baseop filetests ever survive ck_ftst, but...
1991 sub pp_lstat { ftst(@_, "lstat") }
1992 sub pp_stat { ftst(@_, "stat") }
1993 sub pp_ftrread { ftst(@_, "-R") }
1994 sub pp_ftrwrite { ftst(@_, "-W") }
1995 sub pp_ftrexec { ftst(@_, "-X") }
1996 sub pp_fteread { ftst(@_, "-r") }
1997 sub pp_ftewrite { ftst(@_, "-w") }
1998 sub pp_fteexec { ftst(@_, "-x") }
1999 sub pp_ftis { ftst(@_, "-e") }
2000 sub pp_fteowned { ftst(@_, "-O") }
2001 sub pp_ftrowned { ftst(@_, "-o") }
2002 sub pp_ftzero { ftst(@_, "-z") }
2003 sub pp_ftsize { ftst(@_, "-s") }
2004 sub pp_ftmtime { ftst(@_, "-M") }
2005 sub pp_ftatime { ftst(@_, "-A") }
2006 sub pp_ftctime { ftst(@_, "-C") }
2007 sub pp_ftsock { ftst(@_, "-S") }
2008 sub pp_ftchr { ftst(@_, "-c") }
2009 sub pp_ftblk { ftst(@_, "-b") }
2010 sub pp_ftfile { ftst(@_, "-f") }
2011 sub pp_ftdir { ftst(@_, "-d") }
2012 sub pp_ftpipe { ftst(@_, "-p") }
2013 sub pp_ftlink { ftst(@_, "-l") }
2014 sub pp_ftsuid { ftst(@_, "-u") }
2015 sub pp_ftsgid { ftst(@_, "-g") }
2016 sub pp_ftsvtx { ftst(@_, "-k") }
2017 sub pp_fttty { ftst(@_, "-t") }
2018 sub pp_fttext { ftst(@_, "-T") }
2019 sub pp_ftbinary { ftst(@_, "-B") }
2021 sub SWAP_CHILDREN () { 1 }
2022 sub ASSIGN () { 2 } # has OP= variant
2023 sub LIST_CONTEXT () { 4 } # Assignment is in list context
2029 my $name = $op->name;
2030 if ($name eq "concat" and $op->first->name eq "concat") {
2031 # avoid spurious `=' -- see comment in pp_concat
2034 if ($name eq "null" and class($op) eq "UNOP"
2035 and $op->first->name =~ /^(and|x?or)$/
2036 and null $op->first->sibling)
2038 # Like all conditional constructs, OP_ANDs and OP_ORs are topped
2039 # with a null that's used as the common end point of the two
2040 # flows of control. For precedence purposes, ignore it.
2041 # (COND_EXPRs have these too, but we don't bother with
2042 # their associativity).
2043 return assoc_class($op->first);
2045 return $name . ($op->flags & OPf_STACKED ? "=" : "");
2048 # Left associative operators, like `+', for which
2049 # $a + $b + $c is equivalent to ($a + $b) + $c
2052 %left = ('multiply' => 19, 'i_multiply' => 19,
2053 'divide' => 19, 'i_divide' => 19,
2054 'modulo' => 19, 'i_modulo' => 19,
2056 'add' => 18, 'i_add' => 18,
2057 'subtract' => 18, 'i_subtract' => 18,
2059 'left_shift' => 17, 'right_shift' => 17,
2061 'bit_or' => 12, 'bit_xor' => 12,
2063 'or' => 2, 'xor' => 2,
2067 sub deparse_binop_left {
2069 my($op, $left, $prec) = @_;
2070 if ($left{assoc_class($op)} && $left{assoc_class($left)}
2071 and $left{assoc_class($op)} == $left{assoc_class($left)})
2073 return $self->deparse($left, $prec - .00001);
2075 return $self->deparse($left, $prec);
2079 # Right associative operators, like `=', for which
2080 # $a = $b = $c is equivalent to $a = ($b = $c)
2083 %right = ('pow' => 22,
2084 'sassign=' => 7, 'aassign=' => 7,
2085 'multiply=' => 7, 'i_multiply=' => 7,
2086 'divide=' => 7, 'i_divide=' => 7,
2087 'modulo=' => 7, 'i_modulo=' => 7,
2089 'add=' => 7, 'i_add=' => 7,
2090 'subtract=' => 7, 'i_subtract=' => 7,
2092 'left_shift=' => 7, 'right_shift=' => 7,
2094 'bit_or=' => 7, 'bit_xor=' => 7,
2100 sub deparse_binop_right {
2102 my($op, $right, $prec) = @_;
2103 if ($right{assoc_class($op)} && $right{assoc_class($right)}
2104 and $right{assoc_class($op)} == $right{assoc_class($right)})
2106 return $self->deparse($right, $prec - .00001);
2108 return $self->deparse($right, $prec);
2114 my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
2115 my $left = $op->first;
2116 my $right = $op->last;
2118 if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
2122 if ($flags & SWAP_CHILDREN) {
2123 ($left, $right) = ($right, $left);
2125 $left = $self->deparse_binop_left($op, $left, $prec);
2126 $left = "($left)" if $flags & LIST_CONTEXT
2127 && $left !~ /^(my|our|local|)[\@\(]/;
2128 $right = $self->deparse_binop_right($op, $right, $prec);
2129 return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
2132 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2133 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2134 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
2135 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2136 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2137 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2138 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2139 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
2140 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2141 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2142 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
2144 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
2145 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
2146 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
2147 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
2148 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
2150 sub pp_eq { binop(@_, "==", 14) }
2151 sub pp_ne { binop(@_, "!=", 14) }
2152 sub pp_lt { binop(@_, "<", 15) }
2153 sub pp_gt { binop(@_, ">", 15) }
2154 sub pp_ge { binop(@_, ">=", 15) }
2155 sub pp_le { binop(@_, "<=", 15) }
2156 sub pp_ncmp { binop(@_, "<=>", 14) }
2157 sub pp_i_eq { binop(@_, "==", 14) }
2158 sub pp_i_ne { binop(@_, "!=", 14) }
2159 sub pp_i_lt { binop(@_, "<", 15) }
2160 sub pp_i_gt { binop(@_, ">", 15) }
2161 sub pp_i_ge { binop(@_, ">=", 15) }
2162 sub pp_i_le { binop(@_, "<=", 15) }
2163 sub pp_i_ncmp { binop(@_, "<=>", 14) }
2165 sub pp_seq { binop(@_, "eq", 14) }
2166 sub pp_sne { binop(@_, "ne", 14) }
2167 sub pp_slt { binop(@_, "lt", 15) }
2168 sub pp_sgt { binop(@_, "gt", 15) }
2169 sub pp_sge { binop(@_, "ge", 15) }
2170 sub pp_sle { binop(@_, "le", 15) }
2171 sub pp_scmp { binop(@_, "cmp", 14) }
2173 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
2174 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
2177 my ($self, $op, $cx) = @_;
2178 if ($op->flags & OPf_SPECIAL) {
2179 return $self->deparse($op->last, $cx);
2182 binop(@_, "~~", 14);
2186 # `.' is special because concats-of-concats are optimized to save copying
2187 # by making all but the first concat stacked. The effect is as if the
2188 # programmer had written `($a . $b) .= $c', except legal.
2189 sub pp_concat { maybe_targmy(@_, \&real_concat) }
2193 my $left = $op->first;
2194 my $right = $op->last;
2197 if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
2201 $left = $self->deparse_binop_left($op, $left, $prec);
2202 $right = $self->deparse_binop_right($op, $right, $prec);
2203 return $self->maybe_parens("$left .$eq $right", $cx, $prec);
2206 # `x' is weird when the left arg is a list
2210 my $left = $op->first;
2211 my $right = $op->last;
2214 if ($op->flags & OPf_STACKED) {
2218 if (null($right)) { # list repeat; count is inside left-side ex-list
2219 my $kid = $left->first->sibling; # skip pushmark
2221 for (; !null($kid->sibling); $kid = $kid->sibling) {
2222 push @exprs, $self->deparse($kid, 6);
2225 $left = "(" . join(", ", @exprs). ")";
2227 $left = $self->deparse_binop_left($op, $left, $prec);
2229 $right = $self->deparse_binop_right($op, $right, $prec);
2230 return $self->maybe_parens("$left x$eq $right", $cx, $prec);
2235 my ($op, $cx, $type) = @_;
2236 my $left = $op->first;
2237 my $right = $left->sibling;
2238 $left = $self->deparse($left, 9);
2239 $right = $self->deparse($right, 9);
2240 return $self->maybe_parens("$left $type $right", $cx, 9);
2246 my $flip = $op->first;
2247 my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
2248 return $self->range($flip->first, $cx, $type);
2251 # one-line while/until is handled in pp_leave
2255 my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
2256 my $left = $op->first;
2257 my $right = $op->first->sibling;
2258 if ($cx < 1 and is_scope($right) and $blockname
2259 and $self->{'expand'} < 7)
2261 $left = $self->deparse($left, 1);
2262 $right = $self->deparse($right, 0);
2263 return "$blockname ($left) {\n\t$right\n\b}\cK";
2264 } elsif ($cx < 1 and $blockname and not $self->{'parens'}
2265 and $self->{'expand'} < 7) { # $b if $a
2266 $right = $self->deparse($right, 1);
2267 $left = $self->deparse($left, 1);
2268 return "$right $blockname $left";
2269 } elsif ($cx > $lowprec and $highop) { # $a && $b
2270 $left = $self->deparse_binop_left($op, $left, $highprec);
2271 $right = $self->deparse_binop_right($op, $right, $highprec);
2272 return $self->maybe_parens("$left $highop $right", $cx, $highprec);
2273 } else { # $a and $b
2274 $left = $self->deparse_binop_left($op, $left, $lowprec);
2275 $right = $self->deparse_binop_right($op, $right, $lowprec);
2276 return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
2280 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
2281 sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
2282 sub pp_dor { logop(@_, "//", 10) }
2284 # xor is syntactically a logop, but it's really a binop (contrary to
2285 # old versions of opcode.pl). Syntax is what matters here.
2286 sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
2290 my ($op, $cx, $opname) = @_;
2291 my $left = $op->first;
2292 my $right = $op->first->sibling->first; # skip sassign
2293 $left = $self->deparse($left, 7);
2294 $right = $self->deparse($right, 7);
2295 return $self->maybe_parens("$left $opname $right", $cx, 7);
2298 sub pp_andassign { logassignop(@_, "&&=") }
2299 sub pp_orassign { logassignop(@_, "||=") }
2300 sub pp_dorassign { logassignop(@_, "//=") }
2304 my($op, $cx, $name) = @_;
2306 my $parens = ($cx >= 5) || $self->{'parens'};
2307 my $kid = $op->first->sibling;
2308 return $self->keyword($name) if null $kid;
2310 $name = "socketpair" if $name eq "sockpair";
2311 my $fullname = $self->keyword($name);
2312 my $proto = prototype("CORE::$name");
2314 && $proto =~ /^;?\*/
2315 && $kid->name eq "rv2gv") {
2316 $first = $self->deparse($kid->first, 6);
2319 $first = $self->deparse($kid, 6);
2321 if ($name eq "chmod" && $first =~ /^\d+$/) {
2322 $first = sprintf("%#o", $first);
2324 $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
2325 push @exprs, $first;
2326 $kid = $kid->sibling;
2327 if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") {
2328 push @exprs, $self->deparse($kid->first, 6);
2329 $kid = $kid->sibling;
2331 for (; !null($kid); $kid = $kid->sibling) {
2332 push @exprs, $self->deparse($kid, 6);
2334 if ($name eq "reverse" && ($op->private & OPpREVERSE_INPLACE)) {
2335 return "$exprs[0] = $fullname"
2336 . ($parens ? "($exprs[0])" : " $exprs[0]");
2339 return "$fullname(" . join(", ", @exprs) . ")";
2341 return "$fullname " . join(", ", @exprs);
2345 sub pp_bless { listop(@_, "bless") }
2346 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
2347 sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
2348 sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
2349 sub pp_index { maybe_targmy(@_, \&listop, "index") }
2350 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
2351 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
2352 sub pp_formline { listop(@_, "formline") } # see also deparse_format
2353 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
2354 sub pp_unpack { listop(@_, "unpack") }
2355 sub pp_pack { listop(@_, "pack") }
2356 sub pp_join { maybe_targmy(@_, \&listop, "join") }
2357 sub pp_splice { listop(@_, "splice") }
2358 sub pp_push { maybe_targmy(@_, \&listop, "push") }
2359 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
2360 sub pp_reverse { listop(@_, "reverse") }
2361 sub pp_warn { listop(@_, "warn") }
2362 sub pp_die { listop(@_, "die") }
2363 # Actually, return is exempt from the LLAFR (see examples in this very
2364 # module!), but for consistency's sake, ignore that fact
2365 sub pp_return { listop(@_, "return") }
2366 sub pp_open { listop(@_, "open") }
2367 sub pp_pipe_op { listop(@_, "pipe") }
2368 sub pp_tie { listop(@_, "tie") }
2369 sub pp_binmode { listop(@_, "binmode") }
2370 sub pp_dbmopen { listop(@_, "dbmopen") }
2371 sub pp_sselect { listop(@_, "select") }
2372 sub pp_select { listop(@_, "select") }
2373 sub pp_read { listop(@_, "read") }
2374 sub pp_sysopen { listop(@_, "sysopen") }
2375 sub pp_sysseek { listop(@_, "sysseek") }
2376 sub pp_sysread { listop(@_, "sysread") }
2377 sub pp_syswrite { listop(@_, "syswrite") }
2378 sub pp_send { listop(@_, "send") }
2379 sub pp_recv { listop(@_, "recv") }
2380 sub pp_seek { listop(@_, "seek") }
2381 sub pp_fcntl { listop(@_, "fcntl") }
2382 sub pp_ioctl { listop(@_, "ioctl") }
2383 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
2384 sub pp_socket { listop(@_, "socket") }
2385 sub pp_sockpair { listop(@_, "sockpair") }
2386 sub pp_bind { listop(@_, "bind") }
2387 sub pp_connect { listop(@_, "connect") }
2388 sub pp_listen { listop(@_, "listen") }
2389 sub pp_accept { listop(@_, "accept") }
2390 sub pp_shutdown { listop(@_, "shutdown") }
2391 sub pp_gsockopt { listop(@_, "getsockopt") }
2392 sub pp_ssockopt { listop(@_, "setsockopt") }
2393 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
2394 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
2395 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
2396 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
2397 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
2398 sub pp_link { maybe_targmy(@_, \&listop, "link") }
2399 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
2400 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
2401 sub pp_open_dir { listop(@_, "opendir") }
2402 sub pp_seekdir { listop(@_, "seekdir") }
2403 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
2404 sub pp_system { maybe_targmy(@_, \&listop, "system") }
2405 sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
2406 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
2407 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
2408 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
2409 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
2410 sub pp_shmget { listop(@_, "shmget") }
2411 sub pp_shmctl { listop(@_, "shmctl") }
2412 sub pp_shmread { listop(@_, "shmread") }
2413 sub pp_shmwrite { listop(@_, "shmwrite") }
2414 sub pp_msgget { listop(@_, "msgget") }
2415 sub pp_msgctl { listop(@_, "msgctl") }
2416 sub pp_msgsnd { listop(@_, "msgsnd") }
2417 sub pp_msgrcv { listop(@_, "msgrcv") }
2418 sub pp_semget { listop(@_, "semget") }
2419 sub pp_semctl { listop(@_, "semctl") }
2420 sub pp_semop { listop(@_, "semop") }
2421 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
2422 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
2423 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
2424 sub pp_gsbyname { listop(@_, "getservbyname") }
2425 sub pp_gsbyport { listop(@_, "getservbyport") }
2426 sub pp_syscall { listop(@_, "syscall") }
2431 my $text = $self->dq($op->first->sibling); # skip pushmark
2432 if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
2433 or $text =~ /[<>]/) {
2434 return 'glob(' . single_delim('qq', '"', $text) . ')';
2436 return '<' . $text . '>';
2440 # Truncate is special because OPf_SPECIAL makes a bareword first arg
2441 # be a filehandle. This could probably be better fixed in the core
2442 # by moving the GV lookup into ck_truc.
2448 my $parens = ($cx >= 5) || $self->{'parens'};
2449 my $kid = $op->first->sibling;
2451 if ($op->flags & OPf_SPECIAL) {
2452 # $kid is an OP_CONST
2453 $fh = $self->const_sv($kid)->PV;
2455 $fh = $self->deparse($kid, 6);
2456 $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
2458 my $len = $self->deparse($kid->sibling, 6);
2459 my $name = $self->keyword('truncate');
2461 return "$name($fh, $len)";
2463 return "$name $fh, $len";
2469 my($op, $cx, $name) = @_;
2471 my $kid = $op->first->sibling;
2473 if ($op->flags & OPf_STACKED) {
2475 $indir = $indir->first; # skip rv2gv
2476 if (is_scope($indir)) {
2477 $indir = "{" . $self->deparse($indir, 0) . "}";
2478 $indir = "{;}" if $indir eq "{}";
2479 } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
2480 $indir = $self->const_sv($indir)->PV;
2482 $indir = $self->deparse($indir, 24);
2484 $indir = $indir . " ";
2485 $kid = $kid->sibling;
2487 if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
2488 $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
2491 elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
2492 $indir = '{$b cmp $a} ';
2494 for (; !null($kid); $kid = $kid->sibling) {
2495 $expr = $self->deparse($kid, 6);
2499 if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
2500 $name2 = $self->keyword('reverse') . ' ' . $self->keyword('sort');
2502 else { $name2 = $self->keyword($name) }
2503 if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
2504 return "$exprs[0] = $name2 $indir $exprs[0]";
2507 my $args = $indir . join(", ", @exprs);
2508 if ($indir ne "" and $name eq "sort") {
2509 # We don't want to say "sort(f 1, 2, 3)", since perl -w will
2510 # give bareword warnings in that case. Therefore if context
2511 # requires, we'll put parens around the outside "(sort f 1, 2,
2512 # 3)". Unfortunately, we'll currently think the parens are
2513 # necessary more often that they really are, because we don't
2514 # distinguish which side of an assignment we're on.
2516 return "($name2 $args)";
2518 return "$name2 $args";
2521 return $self->maybe_parens_func($name2, $args, $cx, 5);
2526 sub pp_prtf { indirop(@_, "printf") }
2527 sub pp_print { indirop(@_, "print") }
2528 sub pp_say { indirop(@_, "say") }
2529 sub pp_sort { indirop(@_, "sort") }
2533 my($op, $cx, $name) = @_;
2535 my $kid = $op->first; # this is the (map|grep)start
2536 $kid = $kid->first->sibling; # skip a pushmark
2537 my $code = $kid->first; # skip a null
2538 if (is_scope $code) {
2539 $code = "{" . $self->deparse($code, 0) . "} ";
2541 $code = $self->deparse($code, 24) . ", ";
2543 $kid = $kid->sibling;
2544 for (; !null($kid); $kid = $kid->sibling) {
2545 $expr = $self->deparse($kid, 6);
2546 push @exprs, $expr if defined $expr;
2548 return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
2551 sub pp_mapwhile { mapop(@_, "map") }
2552 sub pp_grepwhile { mapop(@_, "grep") }
2553 sub pp_mapstart { baseop(@_, "map") }
2554 sub pp_grepstart { baseop(@_, "grep") }
2560 my $kid = $op->first->sibling; # skip pushmark
2562 my $local = "either"; # could be local(...), my(...), state(...) or our(...)
2563 for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
2564 # This assumes that no other private flags equal 128, and that
2565 # OPs that store things other than flags in their op_private,
2566 # like OP_AELEMFAST, won't be immediate children of a list.
2568 # OP_ENTERSUB can break this logic, so check for it.
2569 # I suspect that open and exit can too.
2571 if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
2572 or $lop->name eq "undef")
2573 or $lop->name eq "entersub"
2574 or $lop->name eq "exit"
2575 or $lop->name eq "open")
2577 $local = ""; # or not
2580 if ($lop->name =~ /^pad[ash]v$/) {
2581 if ($lop->private & OPpPAD_STATE) { # state()
2582 ($local = "", last) if $local =~ /^(?:local|our|my)$/;
2585 ($local = "", last) if $local =~ /^(?:local|our|state)$/;
2588 } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
2589 && $lop->private & OPpOUR_INTRO
2590 or $lop->name eq "null" && $lop->first->name eq "gvsv"
2591 && $lop->first->private & OPpOUR_INTRO) { # our()
2592 ($local = "", last) if $local =~ /^(?:my|local|state)$/;
2594 } elsif ($lop->name ne "undef"
2595 # specifically avoid the "reverse sort" optimisation,
2596 # where "reverse" is nullified
2597 && !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE)))
2600 ($local = "", last) if $local =~ /^(?:my|our|state)$/;
2604 $local = "" if $local eq "either"; # no point if it's all undefs
2605 return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
2606 for (; !null($kid); $kid = $kid->sibling) {
2608 if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
2613 $self->{'avoid_local'}{$$lop}++;
2614 $expr = $self->deparse($kid, 6);
2615 delete $self->{'avoid_local'}{$$lop};
2617 $expr = $self->deparse($kid, 6);
2622 return "$local(" . join(", ", @exprs) . ")";
2624 return $self->maybe_parens( join(", ", @exprs), $cx, 6);
2628 sub is_ifelse_cont {
2630 return ($op->name eq "null" and class($op) eq "UNOP"
2631 and $op->first->name =~ /^(and|cond_expr)$/
2632 and is_scope($op->first->first->sibling));
2638 my $cond = $op->first;
2639 my $true = $cond->sibling;
2640 my $false = $true->sibling;
2641 my $cuddle = $self->{'cuddle'};
2642 unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
2643 (is_scope($false) || is_ifelse_cont($false))
2644 and $self->{'expand'} < 7) {
2645 $cond = $self->deparse($cond, 8);
2646 $true = $self->deparse($true, 6);
2647 $false = $self->deparse($false, 8);
2648 return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
2651 $cond = $self->deparse($cond, 1);
2652 $true = $self->deparse($true, 0);
2653 my $head = "if ($cond) {\n\t$true\n\b}";
2655 while (!null($false) and is_ifelse_cont($false)) {
2656 my $newop = $false->first;
2657 my $newcond = $newop->first;
2658 my $newtrue = $newcond->sibling;
2659 $false = $newtrue->sibling; # last in chain is OP_AND => no else
2660 if ($newcond->name eq "lineseq")
2662 # lineseq to ensure correct line numbers in elsif()
2663 # Bug #37302 fixed by change #33710.
2664 $newcond = $newcond->first->sibling;
2666 $newcond = $self->deparse($newcond, 1);
2667 $newtrue = $self->deparse($newtrue, 0);
2668 push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
2670 if (!null($false)) {
2671 $false = $cuddle . "else {\n\t" .
2672 $self->deparse($false, 0) . "\n\b}\cK";
2676 return $head . join($cuddle, "", @elsifs) . $false;
2680 my ($self, $op, $cx) = @_;
2681 my $cond = $op->first;
2682 my $true = $cond->sibling;
2684 return $self->deparse($true, $cx);
2689 my($op, $cx, $init) = @_;
2690 my $enter = $op->first;
2691 my $kid = $enter->sibling;
2692 local(@$self{qw'curstash warnings hints hinthash'})
2693 = @$self{qw'curstash warnings hints hinthash'};
2698 if ($kid->name eq "lineseq") { # bare or infinite loop
2699 if ($kid->last->name eq "unstack") { # infinite
2700 $head = "while (1) "; # Can't use for(;;) if there's a continue
2706 } elsif ($enter->name eq "enteriter") { # foreach
2707 my $ary = $enter->first->sibling; # first was pushmark
2708 my $var = $ary->sibling;
2709 if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
2710 # "reverse" was optimised away
2711 $ary = listop($self, $ary->first->sibling, 1, 'reverse');
2712 } elsif ($enter->flags & OPf_STACKED
2713 and not null $ary->first->sibling->sibling)
2715 $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
2716 $self->deparse($ary->first->sibling->sibling, 9);
2718 $ary = $self->deparse($ary, 1);
2721 if (($enter->flags & OPf_SPECIAL) && ($] < 5.009)) {
2722 # thread special var, under 5005threads
2723 $var = $self->pp_threadsv($enter, 1);
2724 } else { # regular my() variable
2725 $var = $self->pp_padsv($enter, 1);
2727 } elsif ($var->name eq "rv2gv") {
2728 $var = $self->pp_rv2sv($var, 1);
2729 if ($enter->private & OPpOUR_INTRO) {
2730 # our declarations don't have package names
2731 $var =~ s/^(.).*::/$1/;
2734 } elsif ($var->name eq "gv") {
2735 $var = "\$" . $self->deparse($var, 1);
2737 $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
2738 if (!is_state $body->first and $body->first->name ne "stub") {
2739 confess unless $var eq '$_';
2740 $body = $body->first;
2741 return $self->deparse($body, 2) . " foreach ($ary)";
2743 $head = "foreach $var ($ary) ";
2744 } elsif ($kid->name eq "null") { # while/until
2746 my $name = {"and" => "while", "or" => "until"}->{$kid->name};
2747 $cond = $self->deparse($kid->first, 1);
2748 $head = "$name ($cond) ";
2749 $body = $kid->first->sibling;
2750 } elsif ($kid->name eq "stub") { # bare and empty
2751 return "{;}"; # {} could be a hashref
2753 # If there isn't a continue block, then the next pointer for the loop
2754 # will point to the unstack, which is kid's last child, except
2755 # in a bare loop, when it will point to the leaveloop. When neither of
2756 # these conditions hold, then the second-to-last child is the continue
2757 # block (or the last in a bare loop).
2758 my $cont_start = $enter->nextop;
2760 if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
2762 $cont = $body->last;
2764 $cont = $body->first;
2765 while (!null($cont->sibling->sibling)) {
2766 $cont = $cont->sibling;
2769 my $state = $body->first;
2770 my $cuddle = $self->{'cuddle'};
2772 for (; $$state != $$cont; $state = $state->sibling) {
2773 push @states, $state;
2775 $body = $self->lineseq(undef, @states);
2776 if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
2777 $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
2780 $cont = $cuddle . "continue {\n\t" .
2781 $self->deparse($cont, 0) . "\n\b}\cK";
2784 return "" if !defined $body;
2786 $head = "for ($init; $cond;) ";
2789 $body = $self->deparse($body, 0);
2791 $body =~ s/;?$/;\n/;
2793 return $head . "{\n\t" . $body . "\b}" . $cont;
2796 sub pp_leaveloop { shift->loop_common(@_, "") }
2801 my $init = $self->deparse($op, 1);
2802 my $s = $op->sibling;
2803 my $ll = $s->name eq "unstack" ? $s->sibling : $s->first->sibling;
2804 return $self->loop_common($ll, $cx, $init);
2809 return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
2812 BEGIN { for (qw[ const stringify rv2sv list glob ]) {
2813 eval "sub OP_\U$_ () { " . opnumber($_) . "}"
2819 if (class($op) eq "OP") {
2821 return $self->{'ex_const'} if $op->targ == OP_CONST;
2822 } elsif ($op->first->name eq "pushmark") {
2823 return $self->pp_list($op, $cx);
2824 } elsif ($op->first->name eq "enter") {
2825 return $self->pp_leave($op, $cx);
2826 } elsif ($op->first->name eq "leave") {
2827 return $self->pp_leave($op->first, $cx);
2828 } elsif ($op->first->name eq "scope") {
2829 return $self->pp_scope($op->first, $cx);
2830 } elsif ($op->targ == OP_STRINGIFY) {
2831 return $self->dquote($op, $cx);
2832 } elsif ($op->targ == OP_GLOB) {
2833 return $self->pp_glob(
2834 $op->first # entersub
2840 } elsif (!null($op->first->sibling) and
2841 $op->first->sibling->name eq "readline" and
2842 $op->first->sibling->flags & OPf_STACKED) {
2843 return $self->maybe_parens($self->deparse($op->first, 7) . " = "
2844 . $self->deparse($op->first->sibling, 7),
2846 } elsif (!null($op->first->sibling) and
2847 $op->first->sibling->name eq "trans" and
2848 $op->first->sibling->flags & OPf_STACKED) {
2849 return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
2850 . $self->deparse($op->first->sibling, 20),
2852 } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
2853 return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2854 } elsif (!null($op->first->sibling) and
2855 $op->first->sibling->name eq "null" and
2856 class($op->first->sibling) eq "UNOP" and
2857 $op->first->sibling->first->flags & OPf_STACKED and
2858 $op->first->sibling->first->name eq "rcatline") {
2859 return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2860 . $self->deparse($op->first->sibling, 18),
2863 return $self->deparse($op->first, $cx);
2870 return $self->padname_sv($targ)->PVX;
2876 return substr($self->padname($op->targ), 1); # skip $/@/%
2882 return $self->maybe_my($op, $cx, $self->padname($op->targ));
2885 sub pp_padav { pp_padsv(@_) }
2886 sub pp_padhv { pp_padsv(@_) }
2888 my @threadsv_names = B::threadsv_names;
2892 return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
2898 if (class($op) eq "PADOP") {
2899 return $self->padval($op->padix);
2900 } else { # class($op) eq "SVOP"
2908 my $gv = $self->gv_or_padgv($op);
2909 return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2910 $self->gv_name($gv)));
2916 my $gv = $self->gv_or_padgv($op);
2917 return $self->gv_name($gv);
2924 if ($op->flags & OPf_SPECIAL) { # optimised PADAV
2925 $name = $self->padname($op->targ);
2929 my $gv = $self->gv_or_padgv($op);
2930 $name = $self->gv_name($gv);
2931 $name = $self->{'curstash'}."::$name"
2932 if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2933 $name = '$' . $name;
2936 return $name . "[" . ($op->private + $self->{'arybase'}) . "]";
2941 my($op, $cx, $type) = @_;
2943 if (class($op) eq 'NULL' || !$op->can("first")) {
2944 carp("Unexpected op in pp_rv2x");
2947 my $kid = $op->first;
2948 if ($kid->name eq "gv") {
2949 return $self->stash_variable($type, $self->deparse($kid, 0));
2950 } elsif (is_scalar $kid) {
2951 my $str = $self->deparse($kid, 0);
2952 if ($str =~ /^\$([^\w\d])\z/) {
2953 # "$$+" isn't a legal way to write the scalar dereference
2954 # of $+, since the lexer can't tell you aren't trying to
2955 # do something like "$$ + 1" to get one more than your
2956 # PID. Either "${$+}" or "$${+}" are workable
2957 # disambiguations, but if the programmer did the former,
2958 # they'd be in the "else" clause below rather than here.
2959 # It's not clear if this should somehow be unified with
2960 # the code in dq and re_dq that also adds lexer
2961 # disambiguation braces.
2962 $str = '$' . "{$1}"; #'
2964 return $type . $str;
2966 return $type . "{" . $self->deparse($kid, 0) . "}";
2970 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2971 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2972 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2978 if ($op->first->name eq "padav") {
2979 return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2981 return $self->maybe_local($op, $cx,
2982 $self->rv2x($op->first, $cx, '$#'));
2986 # skip down to the old, ex-rv2cv
2988 my ($self, $op, $cx) = @_;
2989 if (!null($op->first) && $op->first->name eq 'null' &&
2990 $op->first->targ eq OP_LIST)
2992 return $self->rv2x($op->first->first->sibling, $cx, "&")
2995 return $self->rv2x($op, $cx, "")
3001 my($cx, @list) = @_;
3002 my @a = map $self->const($_, 6), @list;
3007 } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
3008 # collapse (-1,0,1,2) into (-1..2)
3009 my ($s, $e) = @a[0,-1];
3011 return $self->maybe_parens("$s..$e", $cx, 9)
3012 unless grep $i++ != $_, @a;
3014 return $self->maybe_parens(join(", ", @a), $cx, 6);
3020 my $kid = $op->first;
3021 if ($kid->name eq "const") { # constant list
3022 my $av = $self->const_sv($kid);
3023 return $self->list_const($cx, $av->ARRAY);
3025 return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
3029 sub is_subscriptable {
3031 if ($op->name =~ /^[ahg]elem/) {
3033 } elsif ($op->name eq "entersub") {
3034 my $kid = $op->first;
3035 return 0 unless null $kid->sibling;
3037 $kid = $kid->sibling until null $kid->sibling;
3038 return 0 if is_scope($kid);
3040 return 0 if $kid->name eq "gv";
3041 return 0 if is_scalar($kid);
3042 return is_subscriptable($kid);
3048 sub elem_or_slice_array_name
3051 my ($array, $left, $padname, $allow_arrow) = @_;
3053 if ($array->name eq $padname) {
3054 return $self->padany($array);
3055 } elsif (is_scope($array)) { # ${expr}[0]
3056 return "{" . $self->deparse($array, 0) . "}";
3057 } elsif ($array->name eq "gv") {
3058 $array = $self->gv_name($self->gv_or_padgv($array));
3059 if ($array !~ /::/) {
3060 my $prefix = ($left eq '[' ? '@' : '%');
3061 $array = $self->{curstash}.'::'.$array
3062 if $self->lex_in_scope($prefix . $array);
3065 } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
3066 return $self->deparse($array, 24);
3072 sub elem_or_slice_single_index
3077 $idx = $self->deparse($idx, 1);
3079 # Outer parens in an array index will confuse perl
3080 # if we're interpolating in a regular expression, i.e.
3081 # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
3083 # If $self->{parens}, then an initial '(' will
3084 # definitely be paired with a final ')'. If
3085 # !$self->{parens}, the misleading parens won't
3086 # have been added in the first place.
3088 # [You might think that we could get "(...)...(...)"
3089 # where the initial and final parens do not match
3090 # each other. But we can't, because the above would
3091 # only happen if there's an infix binop between the
3092 # two pairs of parens, and *that* means that the whole
3093 # expression would be parenthesized as well.]
3095 $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
3097 # Hash-element braces will autoquote a bareword inside themselves.
3098 # We need to make sure that C<$hash{warn()}> doesn't come out as
3099 # C<$hash{warn}>, which has a quite different meaning. Currently
3100 # B::Deparse will always quote strings, even if the string was a
3101 # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
3102 # for constant strings.) So we can cheat slightly here - if we see
3103 # a bareword, we know that it is supposed to be a function call.
3105 $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
3112 my ($op, $cx, $left, $right, $padname) = @_;
3113 my($array, $idx) = ($op->first, $op->first->sibling);
3115 $idx = $self->elem_or_slice_single_index($idx);
3117 unless ($array->name eq $padname) { # Maybe this has been fixed
3118 $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
3120 if (my $array_name=$self->elem_or_slice_array_name
3121 ($array, $left, $padname, 1)) {
3122 return "\$" . $array_name . $left . $idx . $right;
3124 # $x[20][3]{hi} or expr->[20]
3125 my $arrow = is_subscriptable($array) ? "" : "->";
3126 return $self->deparse($array, 24) . $arrow . $left . $idx . $right;
3131 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
3132 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
3137 my($glob, $part) = ($op->first, $op->last);
3138 $glob = $glob->first; # skip rv2gv
3139 $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
3140 my $scope = is_scope($glob);
3141 $glob = $self->deparse($glob, 0);
3142 $part = $self->deparse($part, 1);
3143 return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
3148 my ($op, $cx, $left, $right, $regname, $padname) = @_;
3150 my(@elems, $kid, $array, $list);
3151 if (class($op) eq "LISTOP") {
3153 } else { # ex-hslice inside delete()
3154 for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
3158 $array = $array->first
3159 if $array->name eq $regname or $array->name eq "null";
3160 $array = $self->elem_or_slice_array_name($array,$left,$padname,0);
3161 $kid = $op->first->sibling; # skip pushmark
3162 if ($kid->name eq "list") {
3163 $kid = $kid->first->sibling; # skip list, pushmark
3164 for (; !null $kid; $kid = $kid->sibling) {
3165 push @elems, $self->deparse($kid, 6);
3167 $list = join(", ", @elems);
3169 $list = $self->elem_or_slice_single_index($kid);
3171 return "\@" . $array . $left . $list . $right;
3174 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
3175 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
3180 my $idx = $op->first;
3181 my $list = $op->last;
3183 $list = $self->deparse($list, 1);
3184 $idx = $self->deparse($idx, 1);
3185 return "($list)" . "[$idx]";
3190 return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
3195 return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
3201 my $kid = $op->first->sibling; # skip pushmark
3202 my($meth, $obj, @exprs);
3203 if ($kid->name eq "list" and want_list $kid) {
3204 # When an indirect object isn't a bareword but the args are in
3205 # parens, the parens aren't part of the method syntax (the LLAFR
3206 # doesn't apply), but they make a list with OPf_PARENS set that
3207 # doesn't get flattened by the append_elem that adds the method,
3208 # making a (object, arg1, arg2, ...) list where the object
3209 # usually is. This can be distinguished from
3210 # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
3211 # object) because in the later the list is in scalar context
3212 # as the left side of -> always is, while in the former
3213 # the list is in list context as method arguments always are.
3214 # (Good thing there aren't method prototypes!)
3215 $meth = $kid->sibling;
3216 $kid = $kid->first->sibling; # skip pushmark
3218 $kid = $kid->sibling;
3219 for (; not null $kid; $kid = $kid->sibling) {
3224 $kid = $kid->sibling;
3225 for (; !null ($kid->sibling) && $kid->name!~/^method(?:_named)?\z/;
3226 $kid = $kid->sibling) {
3232 if ($meth->name eq "method_named") {
3233 $meth = $self->const_sv($meth)->PV;
3235 $meth = $meth->first;
3236 if ($meth->name eq "const") {
3237 # As of 5.005_58, this case is probably obsoleted by the
3238 # method_named case above
3239 $meth = $self->const_sv($meth)->PV; # needs to be bare
3243 return { method => $meth, variable_method => ref($meth),
3244 object => $obj, args => \@exprs };
3247 # compat function only
3250 my $info = $self->_method(@_);
3251 return $self->e_method( $self->_method(@_) );
3255 my ($self, $info) = @_;
3256 my $obj = $self->deparse($info->{object}, 24);
3258 my $meth = $info->{method};
3259 $meth = $self->deparse($meth, 1) if $info->{variable_method};
3260 my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} );
3261 my $kid = $obj . "->" . $meth;
3263 return $kid . "(" . $args . ")"; # parens mandatory
3269 # returns "&" if the prototype doesn't match the args,
3270 # or ("", $args_after_prototype_demunging) if it does.
3273 return "&" if $self->{'noproto'};
3274 my($proto, @args) = @_;
3278 # An unbackslashed @ or % gobbles up the rest of the args
3279 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
3281 $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;)//;
3284 return "&" if @args;
3285 } elsif ($chr eq ";") {
3287 } elsif ($chr eq "@" or $chr eq "%") {
3288 push @reals, map($self->deparse($_, 6), @args);
3293 if ($chr eq "\$" || $chr eq "_") {
3294 if (want_scalar $arg) {
3295 push @reals, $self->deparse($arg, 6);
3299 } elsif ($chr eq "&") {
3300 if ($arg->name =~ /^(s?refgen|undef)$/) {
3301 push @reals, $self->deparse($arg, 6);
3305 } elsif ($chr eq "*") {
3306 if ($arg->name =~ /^s?refgen$/
3307 and $arg->first->first->name eq "rv2gv")
3309 $real = $arg->first->first; # skip refgen, null
3310 if ($real->first->name eq "gv") {
3311 push @reals, $self->deparse($real, 6);
3313 push @reals, $self->deparse($real->first, 6);
3318 } elsif (substr($chr, 0, 1) eq "\\") {
3320 if ($arg->name =~ /^s?refgen$/ and
3321 !null($real = $arg->first) and
3322 ($chr =~ /\$/ && is_scalar($real->first)
3324 && class($real->first->sibling) ne 'NULL'
3325 && $real->first->sibling->name
3328 && class($real->first->sibling) ne 'NULL'
3329 && $real->first->sibling->name
3331 #or ($chr =~ /&/ # This doesn't work
3332 # && $real->first->name eq "rv2cv")
3334 && $real->first->name eq "rv2gv")))
3336 push @reals, $self->deparse($real, 6);
3343 return "&" if $proto and !$doneok; # too few args and no `;'
3344 return "&" if @args; # too many args
3345 return ("", join ", ", @reals);
3351 return $self->e_method($self->_method($op, $cx))
3352 unless null $op->first->sibling;
3356 if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
3358 } elsif ($op->private & OPpENTERSUB_AMPER) {
3362 $kid = $kid->first->sibling; # skip ex-list, pushmark
3363 for (; not null $kid->sibling; $kid = $kid->sibling) {
3368 if (is_scope($kid)) {
3370 $kid = "{" . $self->deparse($kid, 0) . "}";
3371 } elsif ($kid->first->name eq "gv") {
3372 my $gv = $self->gv_or_padgv($kid->first);
3373 if (class($gv->CV) ne "SPECIAL") {
3374 $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
3376 $simple = 1; # only calls of named functions can be prototyped
3377 $kid = $self->deparse($kid, 24);
3379 if ($kid eq 'main::') {
3381 } elsif ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) {
3382 $kid = single_delim("q", "'", $kid) . '->';
3385 } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
3387 $kid = $self->deparse($kid, 24);
3390 my $arrow = is_subscriptable($kid->first) ? "" : "->";
3391 $kid = $self->deparse($kid, 24) . $arrow;
3394 # Doesn't matter how many prototypes there are, if
3395 # they haven't happened yet!
3399 no warnings 'uninitialized';
3400 $declared = exists $self->{'subs_declared'}{$kid}
3402 defined &{ ${$self->{'curstash'}."::"}{$kid} }
3404 $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
3405 && defined prototype $self->{'curstash'}."::".$kid
3407 if (!$declared && defined($proto)) {
3408 # Avoid "too early to check prototype" warning
3409 ($amper, $proto) = ('&');
3414 if ($declared and defined $proto and not $amper) {
3415 ($amper, $args) = $self->check_proto($proto, @exprs);
3416 if ($amper eq "&") {
3417 $args = join(", ", map($self->deparse($_, 6), @exprs));
3420 $args = join(", ", map($self->deparse($_, 6), @exprs));
3422 if ($prefix or $amper) {
3423 if ($op->flags & OPf_STACKED) {
3424 return $prefix . $amper . $kid . "(" . $args . ")";
3426 return $prefix . $amper. $kid;
3429 # It's a syntax error to call CORE::GLOBAL::foo with a prefix,
3430 # so it must have been translated from a keyword call. Translate
3432 $kid =~ s/^CORE::GLOBAL:://;
3434 my $dproto = defined($proto) ? $proto : "undefined";
3436 return "$kid(" . $args . ")";
3437 } elsif ($dproto eq "") {
3439 } elsif ($dproto eq "\$" and is_scalar($exprs[0])) {
3440 # is_scalar is an excessively conservative test here:
3441 # really, we should be comparing to the precedence of the
3442 # top operator of $exprs[0] (ala unop()), but that would
3443 # take some major code restructuring to do right.
3444 return $self->maybe_parens_func($kid, $args, $cx, 16);
3445 } elsif ($dproto ne '$' and defined($proto) || $simple) { #'
3446 return $self->maybe_parens_func($kid, $args, $cx, 5);
3448 return "$kid(" . $args . ")";
3453 sub pp_enterwrite { unop(@_, "write") }
3455 # escape things that cause interpolation in double quotes,
3456 # but not character escapes
3459 $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
3467 # Matches any string which is balanced with respect to {braces}
3478 # the same, but treat $|, $), $( and $ at the end of the string differently
3492 (\(\?\??\{$bal\}\)) # $4
3498 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3503 # This is for regular expressions with the /x modifier
3504 # We have to leave comments unmangled.
3505 sub re_uninterp_extended {
3518 ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
3519 | \#[^\n]* # (skip over comments)
3526 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3532 my %unctrl = # portable to to EBCDIC
3534 "\c@" => '\c@', # unused
3561 "\c[" => '\c[', # unused
3562 "\c\\" => '\c\\', # unused
3563 "\c]" => '\c]', # unused
3564 "\c_" => '\c_', # unused
3567 # character escapes, but not delimiters that might need to be escaped
3568 sub escape_str { # ASCII, UTF8
3570 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3572 # $str =~ s/\cH/\\b/g; # \b means something different in a regex
3578 $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
3579 $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
3583 # For regexes with the /x modifier.
3584 # Leave whitespace unmangled.
3585 sub escape_extended_re {
3587 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3588 $str =~ s/([[:^print:]])/
3589 ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
3590 $str =~ s/\n/\n\f/g;
3594 # Don't do this for regexen
3597 $str =~ s/\\/\\\\/g;
3601 # Remove backslashes which precede literal control characters,
3602 # to avoid creating ambiguity when we escape the latter.
3606 # the insane complexity here is due to the behaviour of "\c\"
3607 $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
3611 sub balanced_delim {
3613 my @str = split //, $str;
3614 my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
3615 for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3616 ($open, $close) = @$ar;
3617 $fail = 0; $cnt = 0; $last_bs = 0;
3620 $fail = 1 if $last_bs;
3622 } elsif ($c eq $close) {
3623 $fail = 1 if $last_bs;
3631 $last_bs = $c eq '\\';
3633 $fail = 1 if $cnt != 0;
3634 return ($open, "$open$str$close") if not $fail;
3640 my($q, $default, $str) = @_;
3641 return "$default$str$default" if $default and index($str, $default) == -1;
3643 (my $succeed, $str) = balanced_delim($str);
3644 return "$q$str" if $succeed;
3646 for my $delim ('/', '"', '#') {
3647 return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3650 $str =~ s/$default/\\$default/g;
3651 return "$default$str$default";
3659 BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
3661 # Split a floating point number into an integer mantissa and a binary
3662 # exponent. Assumes you've already made sure the number isn't zero or
3663 # some weird infinity or NaN.
3667 if ($f == int($f)) {
3668 while ($f % 2 == 0) {
3673 while ($f != int($f)) {
3678 my $mantissa = sprintf("%.0f", $f);
3679 return ($mantissa, $exponent);
3685 if ($self->{'use_dumper'}) {
3686 return $self->const_dumper($sv, $cx);
3688 if (class($sv) eq "SPECIAL") {
3689 # sv_undef, sv_yes, sv_no
3690 return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1];
3692 if (class($sv) eq "NULL") {
3695 # convert a version object into the "v1.2.3" string in its V magic
3696 if ($sv->FLAGS & SVs_RMG) {
3697 for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3698 return $mg->PTR if $mg->TYPE eq 'V';
3702 if ($sv->FLAGS & SVf_IOK) {
3703 my $str = $sv->int_value;
3704 $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
3706 } elsif ($sv->FLAGS & SVf_NOK) {
3709 if (pack("F", $nv) eq pack("F", 0)) {
3714 return $self->maybe_parens("-.0", $cx, 21);
3716 } elsif (1/$nv == 0) {
3719 return $self->maybe_parens("9**9**9", $cx, 22);
3722 return $self->maybe_parens("-9**9**9", $cx, 21);
3724 } elsif ($nv != $nv) {
3726 if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
3728 return "sin(9**9**9)";
3729 } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
3731 return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
3734 my $hex = unpack("h*", pack("F", $nv));
3735 return qq'unpack("F", pack("h*", "$hex"))';
3738 # first, try the default stringification
3741 # failing that, try using more precision
3742 $str = sprintf("%.${max_prec}g", $nv);
3743 # if (pack("F", $str) ne pack("F", $nv)) {
3745 # not representable in decimal with whatever sprintf()
3746 # and atof() Perl is using here.
3747 my($mant, $exp) = split_float($nv);
3748 return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
3751 $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
3753 } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3755 if (class($ref) eq "AV") {
3756 return "[" . $self->list_const(2, $ref->ARRAY) . "]";
3757 } elsif (class($ref) eq "HV") {
3758 my %hash = $ref->ARRAY;
3760 for my $k (sort keys %hash) {
3761 push @elts, "$k => " . $self->const($hash{$k}, 6);
3763 return "{" . join(", ", @elts) . "}";
3764 } elsif (class($ref) eq "CV") {
3765 return "sub " . $self->deparse_sub($ref);
3767 if ($ref->FLAGS & SVs_SMG) {
3768 for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3769 if ($mg->TYPE eq 'r') {
3770 my $re = re_uninterp(escape_str(re_unback($mg->precomp)));
3771 return single_delim("qr", "", $re);
3776 return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20);
3777 } elsif ($sv->FLAGS & SVf_POK) {
3779 if ($str =~ /[[:^print:]]/) {
3780 return single_delim("qq", '"', uninterp escape_str unback $str);
3782 return single_delim("q", "'", unback $str);
3792 my $ref = $sv->object_2svref();
3793 my $dumper = Data::Dumper->new([$$ref], ['$v']);
3794 $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
3795 my $str = $dumper->Dump();
3796 if ($str =~ /^\$v/) {
3797 return '${my ' . $str . ' \$v}';
3807 # the constant could be in the pad (under useithreads)
3808 $sv = $self->padval($op->targ) unless $$sv;
3815 if ($op->private & OPpCONST_ARYBASE) {
3818 # if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
3819 # return $self->const_sv($op)->PV;
3821 my $sv = $self->const_sv($op);
3822 return $self->const($sv, $cx);
3828 my $type = $op->name;
3829 if ($type eq "const") {
3830 return '$[' if $op->private & OPpCONST_ARYBASE;
3831 return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3832 } elsif ($type eq "concat") {
3833 my $first = $self->dq($op->first);
3834 my $last = $self->dq($op->last);
3836 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
3837 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3838 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
3839 || ($last =~ /^[:'{\[\w_]/ && #'
3840 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3842 return $first . $last;
3843 } elsif ($type eq "uc") {
3844 return '\U' . $self->dq($op->first->sibling) . '\E';
3845 } elsif ($type eq "lc") {
3846 return '\L' . $self->dq($op->first->sibling) . '\E';
3847 } elsif ($type eq "ucfirst") {
3848 return '\u' . $self->dq($op->first->sibling);
3849 } elsif ($type eq "lcfirst") {
3850 return '\l' . $self->dq($op->first->sibling);
3851 } elsif ($type eq "quotemeta") {
3852 return '\Q' . $self->dq($op->first->sibling) . '\E';
3853 } elsif ($type eq "join") {
3854 return $self->deparse($op->last, 26); # was join($", @ary)
3856 return $self->deparse($op, 26);
3863 # skip pushmark if it exists (readpipe() vs ``)
3864 my $child = $op->first->sibling->isa('B::NULL')
3865 ? $op->first : $op->first->sibling;
3866 if ($self->pure_string($child)) {
3867 return single_delim("qx", '`', $self->dq($child, 1));
3869 unop($self, @_, "readpipe");
3875 my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3876 return $self->deparse($kid, $cx) if $self->{'unquote'};
3877 $self->maybe_targmy($kid, $cx,
3878 sub {single_delim("qq", '"', $self->dq($_[1]))});
3881 # OP_STRINGIFY is a listop, but it only ever has one arg
3882 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3884 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3885 # note that tr(from)/to/ is OK, but not tr/from/(to)
3887 my($from, $to) = @_;
3888 my($succeed, $delim);
3889 if ($from !~ m[/] and $to !~ m[/]) {
3890 return "/$from/$to/";
3891 } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3892 if (($succeed, $to) = balanced_delim($to) and $succeed) {
3895 for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3896 return "$from$delim$to$delim" if index($to, $delim) == -1;
3899 return "$from/$to/";
3902 for $delim ('/', '"', '#') { # note no '
3903 return "$delim$from$delim$to$delim"
3904 if index($to . $from, $delim) == -1;
3906 $from =~ s[/][\\/]g;
3908 return "/$from/$to/";
3912 # Only used by tr///, so backslashes hyphens
3915 if ($n == ord '\\') {
3917 } elsif ($n == ord "-") {
3919 } elsif ($n >= ord(' ') and $n <= ord('~')) {
3921 } elsif ($n == ord "\a") {
3923 } elsif ($n == ord "\b") {
3925 } elsif ($n == ord "\t") {
3927 } elsif ($n == ord "\n") {
3929 } elsif ($n == ord "\e") {
3931 } elsif ($n == ord "\f") {
3933 } elsif ($n == ord "\r") {
3935 } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3936 return '\\c' . chr(ord("@") + $n);
3938 # return '\x' . sprintf("%02x", $n);
3939 return '\\' . sprintf("%03o", $n);
3945 my($str, $c, $tr) = ("");
3946 for ($c = 0; $c < @chars; $c++) {
3949 if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3950 $chars[$c + 2] == $tr + 2)
3952 for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3955 $str .= pchr($chars[$c]);
3961 sub tr_decode_byte {
3962 my($table, $flags) = @_;
3963 my(@table) = unpack("s*", $table);
3964 splice @table, 0x100, 1; # Number of subsequent elements
3965 my($c, $tr, @from, @to, @delfrom, $delhyphen);
3966 if ($table[ord "-"] != -1 and
3967 $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3969 $tr = $table[ord "-"];
3970 $table[ord "-"] = -1;
3974 } else { # -2 ==> delete
3978 for ($c = 0; $c < @table; $c++) {
3981 push @from, $c; push @to, $tr;
3982 } elsif ($tr == -2) {
3986 @from = (@from, @delfrom);
3987 if ($flags & OPpTRANS_COMPLEMENT) {
3990 @from{@from} = (1) x @from;
3991 for ($c = 0; $c < 256; $c++) {
3992 push @newfrom, $c unless $from{$c};
3996 unless ($flags & OPpTRANS_DELETE || !@to) {
3997 pop @to while $#to and $to[$#to] == $to[$#to -1];
4000 $from = collapse(@from);
4001 $to = collapse(@to);
4002 $from .= "-" if $delhyphen;
4003 return ($from, $to);
4008 if ($x == ord "-") {
4010 } elsif ($x == ord "\\") {
4017 # XXX This doesn't yet handle all cases correctly either
4019 sub tr_decode_utf8 {
4020 my($swash_hv, $flags) = @_;
4021 my %swash = $swash_hv->ARRAY;
4023 $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
4024 my $none = $swash{"NONE"}->IV;
4025 my $extra = $none + 1;
4026 my(@from, @delfrom, @to);
4028 foreach $line (split /\n/, $swash{'LIST'}->PV) {
4029 my($min, $max, $result) = split(/\t/, $line);
4036 $result = hex $result;
4037 if ($result == $extra) {
4038 push @delfrom, [$min, $max];
4040 push @from, [$min, $max];
4041 push @to, [$result, $result + $max - $min];
4044 for my $i (0 .. $#from) {
4045 if ($from[$i][0] == ord '-') {
4046 unshift @from, splice(@from, $i, 1);
4047 unshift @to, splice(@to, $i, 1);
4049 } elsif ($from[$i][1] == ord '-') {
4052 unshift @from, ord '-';
4053 unshift @to, ord '-';
4057 for my $i (0 .. $#delfrom) {
4058 if ($delfrom[$i][0] == ord '-') {
4059 push @delfrom, splice(@delfrom, $i, 1);
4061 } elsif ($delfrom[$i][1] == ord '-') {
4063 push @delfrom, ord '-';
4067 if (defined $final and $to[$#to][1] != $final) {
4068 push @to, [$final, $final];
4070 push @from, @delfrom;
4071 if ($flags & OPpTRANS_COMPLEMENT) {
4074 for my $i (0 .. $#from) {
4075 push @newfrom, [$next, $from[$i][0] - 1];
4076 $next = $from[$i][1] + 1;
4079 for my $range (@newfrom) {
4080 if ($range->[0] <= $range->[1]) {
4085 my($from, $to, $diff);
4086 for my $chunk (@from) {
4087 $diff = $chunk->[1] - $chunk->[0];
4089 $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
4090 } elsif ($diff == 1) {
4091 $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
4093 $from .= tr_chr($chunk->[0]);
4096 for my $chunk (@to) {
4097 $diff = $chunk->[1] - $chunk->[0];
4099 $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
4100 } elsif ($diff == 1) {
4101 $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
4103 $to .= tr_chr($chunk->[0]);
4106 #$final = sprintf("%04x", $final) if defined $final;
4107 #$none = sprintf("%04x", $none) if defined $none;
4108 #$extra = sprintf("%04x", $extra) if defined $extra;
4109 #print STDERR "final: $final\n none: $none\nextra: $extra\n";
4110 #print STDERR $swash{'LIST'}->PV;
4111 return (escape_str($from), escape_str($to));
4118 my $class = class($op);
4119 my $priv_flags = $op->private;
4120 if ($class eq "PVOP") {
4121 ($from, $to) = tr_decode_byte($op->pv, $priv_flags);
4122 } elsif ($class eq "PADOP") {
4124 = tr_decode_utf8($self->padval($op->padix)->RV, $priv_flags);
4125 } else { # class($op) eq "SVOP"
4126 ($from, $to) = tr_decode_utf8($op->sv->RV, $priv_flags);
4129 $flags .= "c" if $priv_flags & OPpTRANS_COMPLEMENT;
4130 $flags .= "d" if $priv_flags & OPpTRANS_DELETE;
4131 $to = "" if $from eq $to and $flags eq "";
4132 $flags .= "s" if $priv_flags & OPpTRANS_SQUASH;
4133 return "tr" . double_delim($from, $to) . $flags;
4136 sub pp_transr { &pp_trans . 'r' }
4138 sub re_dq_disambiguate {
4139 my ($first, $last) = @_;
4140 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
4141 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
4142 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
4143 || ($last =~ /^[{\[\w_]/ &&
4144 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
4145 return $first . $last;
4148 # Like dq(), but different
4151 my ($op, $extended) = @_;
4153 my $type = $op->name;
4154 if ($type eq "const") {
4155 return '$[' if $op->private & OPpCONST_ARYBASE;
4156 my $unbacked = re_unback($self->const_sv($op)->as_string);
4157 return re_uninterp_extended(escape_extended_re($unbacked))
4159 return re_uninterp(escape_str($unbacked));
4160 } elsif ($type eq "concat") {
4161 my $first = $self->re_dq($op->first, $extended);
4162 my $last = $self->re_dq($op->last, $extended);
4163 return re_dq_disambiguate($first, $last);
4164 } elsif ($type eq "uc") {
4165 return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
4166 } elsif ($type eq "lc") {
4167 return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
4168 } elsif ($type eq "ucfirst") {
4169 return '\u' . $self->re_dq($op->first->sibling, $extended);
4170 } elsif ($type eq "lcfirst") {
4171 return '\l' . $self->re_dq($op->first->sibling, $extended);
4172 } elsif ($type eq "quotemeta") {
4173 return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
4174 } elsif ($type eq "join") {
4175 return $self->deparse($op->last, 26); # was join($", @ary)
4177 return $self->deparse($op, 26);
4182 my ($self, $op) = @_;
4183 return 0 if null $op;
4184 my $type = $op->name;
4186 if ($type eq 'const') {
4189 elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
4190 return $self->pure_string($op->first->sibling);
4192 elsif ($type eq 'join') {
4193 my $join_op = $op->first->sibling; # Skip pushmark
4194 return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
4196 my $gvop = $join_op->first;
4197 return 0 unless $gvop->name eq 'gvsv';
4198 return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
4200 return 0 unless ${$join_op->sibling} eq ${$op->last};
4201 return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/;
4203 elsif ($type eq 'concat') {
4204 return $self->pure_string($op->first)
4205 && $self->pure_string($op->last);
4207 elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
4210 elsif ($type eq "null" and $op->can('first') and not null $op->first and
4211 $op->first->name eq "null" and $op->first->can('first')
4212 and not null $op->first->first and
4213 $op->first->first->name eq "aelemfast") {
4225 my($op, $cx, $extended) = @_;
4226 my $kid = $op->first;
4227 $kid = $kid->first if $kid->name eq "regcmaybe";
4228 $kid = $kid->first if $kid->name eq "regcreset";
4229 if ($kid->name eq "null" and !null($kid->first)
4230 and $kid->first->name eq 'pushmark')
4233 $kid = $kid->first->sibling;
4234 while (!null($kid)) {
4236 my $last = $self->re_dq($kid, $extended);
4237 $str = re_dq_disambiguate($first, $last);
4238 $kid = $kid->sibling;
4243 return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
4244 return ($self->deparse($kid, $cx), 0);
4248 my ($self, $op, $cx) = @_;
4249 return (($self->regcomp($op, $cx, 0))[0]);
4252 # osmic acid -- see osmium tetroxide
4255 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
4256 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
4257 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
4261 my($op, $cx, $name, $delim) = @_;
4262 my $kid = $op->first;
4263 my ($binop, $var, $re) = ("", "", "");
4264 if ($op->flags & OPf_STACKED) {
4266 $var = $self->deparse($kid, 20);
4267 $kid = $kid->sibling;
4270 my $extended = ($op->pmflags & PMf_EXTENDED);
4271 my $rhs_bound_to_defsv;
4273 my $unbacked = re_unback($op->precomp);
4275 $re = re_uninterp_extended(escape_extended_re($unbacked));
4277 $re = re_uninterp(escape_str(re_unback($op->precomp)));
4279 } elsif ($kid->name ne 'regcomp') {
4280 carp("found ".$kid->name." where regcomp expected");
4282 ($re, $quote) = $self->regcomp($kid, 21, $extended);
4283 $rhs_bound_to_defsv = 1 if $kid->first->first->flags & OPf_SPECIAL;
4286 $flags .= "c" if $op->pmflags & PMf_CONTINUE;
4287 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4288 $flags .= "i" if $op->pmflags & PMf_FOLD;
4289 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4290 $flags .= "o" if $op->pmflags & PMf_KEEP;
4291 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4292 $flags .= "x" if $op->pmflags & PMf_EXTENDED;
4293 $flags = $matchwords{$flags} if $matchwords{$flags};
4294 if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
4298 $re = single_delim($name, $delim, $re);
4300 $re = $re . $flags if $quote;
4303 $self->maybe_parens(
4305 ? "$var =~ (\$_ =~ $re)"
4314 sub pp_match { matchop(@_, "m", "/") }
4315 sub pp_pushre { matchop(@_, "m", "/") }
4316 sub pp_qr { matchop(@_, "qr", "") }
4321 my($kid, @exprs, $ary, $expr);
4324 # For our kid (an OP_PUSHRE), pmreplroot is never actually the
4325 # root of a replacement; it's either empty, or abused to point to
4326 # the GV for an array we split into (an optimization to save
4327 # assignment overhead). Depending on whether we're using ithreads,
4328 # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
4329 # figures out for us which it is.
4330 my $replroot = $kid->pmreplroot;
4332 if (ref($replroot) eq "B::GV") {
4334 } elsif (!ref($replroot) and $replroot > 0) {
4335 $gv = $self->padval($replroot);
4337 $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
4339 for (; !null($kid); $kid = $kid->sibling) {
4340 push @exprs, $self->deparse($kid, 6);
4343 # handle special case of split(), and split(' ') that compiles to /\s+/
4344 # Under 5.10, the reflags may be undef if the split regexp isn't a constant
4346 if ( $kid->flags & OPf_SPECIAL
4347 and ( $] < 5.009 ? $kid->pmflags & PMf_SKIPWHITE()
4348 : ($kid->reflags || 0) & RXf_SKIPWHITE() ) ) {
4352 $expr = "split(" . join(", ", @exprs) . ")";
4354 return $self->maybe_parens("$ary = $expr", $cx, 7);
4360 # oxime -- any of various compounds obtained chiefly by the action of
4361 # hydroxylamine on aldehydes and ketones and characterized by the
4362 # bivalent grouping C=NOH [Webster's Tenth]
4365 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
4366 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
4367 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
4368 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi',
4369 'sir', 'rise', 'smore', 'more', 'seer', 'rome', 'gore', 'grim', 'grime',
4370 'or', 'rose', 'rosie');
4375 my $kid = $op->first;<