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 OPpPAD_STATE
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
18 OPpSORT_REVERSE OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED
19 OPpREVERSE_INPLACE OPpCONST_NOVER
20 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
22 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_NONDESTRUCT
23 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED),
24 ($] < 5.009 ? 'PMf_SKIPWHITE' : 'RXf_SKIPWHITE'),
25 ($] < 5.011 ? 'CVf_LOCKED' : ());
28 use vars qw/$AUTOLOAD/;
32 # Easiest way to keep this code portable between 5.12.x and 5.10.x looks to
33 # be to fake up a dummy CVf_LOCKED that will never actually be true.
34 *CVf_LOCKED = sub () {0} unless defined &CVf_LOCKED;
37 # Changes between 0.50 and 0.51:
38 # - fixed nulled leave with live enter in sort { }
39 # - fixed reference constants (\"str")
40 # - handle empty programs gracefully
41 # - handle infinte loops (for (;;) {}, while (1) {})
42 # - differentiate between `for my $x ...' and `my $x; for $x ...'
43 # - various minor cleanups
44 # - moved globals into an object
45 # - added `-u', like B::C
46 # - package declarations using cop_stash
47 # - subs, formats and code sorted by cop_seq
48 # Changes between 0.51 and 0.52:
49 # - added pp_threadsv (special variables under USE_5005THREADS)
50 # - added documentation
51 # Changes between 0.52 and 0.53:
52 # - many changes adding precedence contexts and associativity
53 # - added `-p' and `-s' output style options
54 # - various other minor fixes
55 # Changes between 0.53 and 0.54:
56 # - added support for new `for (1..100)' optimization,
58 # Changes between 0.54 and 0.55:
59 # - added support for new qr// construct
60 # - added support for new pp_regcreset OP
61 # Changes between 0.55 and 0.56:
62 # - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
63 # - fixed $# on non-lexicals broken in last big rewrite
64 # - added temporary fix for change in opcode of OP_STRINGIFY
65 # - fixed problem in 0.54's for() patch in `for (@ary)'
66 # - fixed precedence in conditional of ?:
67 # - tweaked list paren elimination in `my($x) = @_'
68 # - made continue-block detection trickier wrt. null ops
69 # - fixed various prototype problems in pp_entersub
70 # - added support for sub prototypes that never get GVs
71 # - added unquoting for special filehandle first arg in truncate
72 # - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
73 # - added semicolons at the ends of blocks
74 # - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
75 # Changes between 0.56 and 0.561:
76 # - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
77 # - used new B.pm symbolic constants (done by Nick Ing-Simmons)
78 # Changes between 0.561 and 0.57:
79 # - stylistic changes to symbolic constant stuff
80 # - handled scope in s///e replacement code
81 # - added unquote option for expanding "" into concats, etc.
82 # - split method and proto parts of pp_entersub into separate functions
83 # - various minor cleanups
85 # - added parens in \&foo (patch by Albert Dvornik)
86 # Changes between 0.57 and 0.58:
87 # - fixed `0' statements that weren't being printed
88 # - added methods for use from other programs
89 # (based on patches from James Duncan and Hugo van der Sanden)
90 # - added -si and -sT to control indenting (also based on a patch from Hugo)
91 # - added -sv to print something else instead of '???'
92 # - preliminary version of utf8 tr/// handling
94 # - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
95 # - added support for Hugo's new OP_SETSTATE (like nextstate)
96 # Changes between 0.58 and 0.59
97 # - added support for Chip's OP_METHOD_NAMED
98 # - added support for Ilya's OPpTARGET_MY optimization
99 # - elided arrows before `()' subscripts when possible
100 # Changes between 0.59 and 0.60
101 # - support for method attribues was added
102 # - some warnings fixed
103 # - separate recognition of constant subs
104 # - rewrote continue block handling, now recoginizing for loops
105 # - added more control of expanding control structures
106 # Changes between 0.60 and 0.61 (mostly by Robin Houston)
108 # - support for pragmas and 'use'
109 # - support for the little-used $[ variable
110 # - support for __DATA__ sections
112 # - BEGIN, CHECK, INIT and END blocks
113 # - scoping of subroutine declarations fixed
114 # - compile-time output from the input program can be suppressed, so that the
115 # output is just the deparsed code. (a change to O.pm in fact)
116 # - our() declarations
117 # - *all* the known bugs are now listed in the BUGS section
118 # - comprehensive test mechanism (TEST -deparse)
119 # Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
122 # - support for command-line switches (-l, -0, etc.)
123 # Changes between 0.63 and 0.64
124 # - support for //, CHECK blocks, and assertions
125 # - improved handling of foreach loops and lexicals
126 # - option to use Data::Dumper for constants
128 # - discovered lots more bugs not yet fixed
132 # Changes between 0.72 and 0.73
133 # - support new switch constructs
136 # (See also BUGS section at the end of this file)
138 # - finish tr/// changes
139 # - add option for even more parens (generalize \&foo change)
140 # - left/right context
141 # - copy comments (look at real text with $^P?)
142 # - avoid semis in one-statement blocks
143 # - associativity of &&=, ||=, ?:
144 # - ',' => '=>' (auto-unquote?)
145 # - break long lines ("\r" as discretionary break?)
146 # - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
147 # - more style options: brace style, hex vs. octal, quotes, ...
148 # - print big ints as hex/octal instead of decimal (heuristic?)
149 # - handle `my $x if 0'?
150 # - version using op_next instead of op_first/sibling?
151 # - avoid string copies (pass arrays, one big join?)
154 # Current test.deparse failures
155 # comp/hints 6 - location of BEGIN blocks wrt. block openings
156 # run/switchI 1 - missing -I switches entirely
157 # perl -Ifoo -e 'print @INC'
158 # op/caller 2 - warning mask propagates backwards before warnings::register
159 # 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register'
160 # op/getpid 2 - can't assign to shared my() declaration (threads only)
161 # 'my $x : shared = 5'
162 # op/override 7 - parens on overriden require change v-string interpretation
163 # 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6'
164 # c.f. 'BEGIN { *f = sub {0} }; f 2'
165 # op/pat 774 - losing Unicode-ness of Latin1-only strings
166 # 'use charnames ":short"; $x="\N{latin:a with acute}"'
167 # op/recurse 12 - missing parens on recursive call makes it look like method
169 # op/subst 90 - inconsistent handling of utf8 under "use utf8"
170 # op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open
171 # op/tiehandle compile - "use strict" deparsed in the wrong place
173 # ext/B/t/xref 11 - line numbers when we add newlines to one-line subs
174 # ext/Data/Dumper/t/dumper compile
175 # ext/DB_file/several
177 # ext/Ernno/Errno warnings
178 # ext/IO/lib/IO/t/io_sel 23
179 # ext/PerlIO/t/encoding compile
180 # ext/POSIX/t/posix 6
181 # ext/Socket/Socket 8
182 # ext/Storable/t/croak compile
183 # lib/Attribute/Handlers/t/multi compile
184 # lib/bignum/ several
188 # lib/ExtUtils/t/bytes 4
189 # lib/File/DosGlob compile
190 # lib/Filter/Simple/t/data 1
191 # lib/Math/BigInt/t/constant 1
192 # lib/Net/t/config Deparse-warning
193 # lib/overload compile
194 # lib/Switch/ several
196 # lib/Test/Simple several
198 # lib/Tie/File/t/29_downcopy 5
201 # Object fields (were globals):
204 # (local($a), local($b)) and local($a, $b) have the same internal
205 # representation but the short form looks better. We notice we can
206 # use a large-scale local when checking the list, but need to prevent
207 # individual locals too. This hash holds the addresses of OPs that
208 # have already had their local-ness accounted for. The same thing
212 # CV for current sub (or main program) being deparsed
215 # Cached hash of lexical variables for curcv: keys are names,
216 # each value is an array of pairs, indicating the cop_seq of scopes
217 # in which a var of that name is valid.
220 # COP for statement being deparsed
223 # name of the current package for deparsed code
226 # array of [cop_seq, CV, is_format?] for subs and formats we still
230 # as above, but [name, prototype] for subs that never got a GV
232 # subs_done, forms_done:
233 # keys are addresses of GVs for subs and formats we've already
234 # deparsed (or at least put into subs_todo)
237 # keys are names of subs for which we've printed declarations.
238 # That means we can omit parentheses from the arguments.
241 # Keeps track of fully qualified names of all deparsed subs.
246 # cuddle: ` ' or `\n', depending on -sC
251 # A little explanation of how precedence contexts and associativity
254 # deparse() calls each per-op subroutine with an argument $cx (short
255 # for context, but not the same as the cx* in the perl core), which is
256 # a number describing the op's parents in terms of precedence, whether
257 # they're inside an expression or at statement level, etc. (see
258 # chart below). When ops with children call deparse on them, they pass
259 # along their precedence. Fractional values are used to implement
260 # associativity (`($x + $y) + $z' => `$x + $y + $y') and related
261 # parentheses hacks. The major disadvantage of this scheme is that
262 # it doesn't know about right sides and left sides, so say if you
263 # assign a listop to a variable, it can't tell it's allowed to leave
264 # the parens off the listop.
267 # 26 [TODO] inside interpolation context ("")
268 # 25 left terms and list operators (leftward)
272 # 21 right ! ~ \ and unary + and -
277 # 16 nonassoc named unary operators
278 # 15 nonassoc < > <= >= lt gt le ge
279 # 14 nonassoc == != <=> eq ne cmp
286 # 7 right = += -= *= etc.
288 # 5 nonassoc list operators (rightward)
292 # 1 statement modifiers
293 # 0.5 statements, but still print scopes as do { ... }
296 # Nonprinting characters with special meaning:
297 # \cS - steal parens (see maybe_parens_unop)
298 # \n - newline and indent
299 # \t - increase indent
300 # \b - decrease indent (`outdent')
301 # \f - flush left (no indent)
302 # \cK - kill following semicolon, if any
306 return class($op) eq "NULL";
311 my($cv, $is_form) = @_;
312 return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE});
314 if ($cv->OUTSIDE_SEQ) {
315 $seq = $cv->OUTSIDE_SEQ;
316 } elsif (!null($cv->START) and is_state($cv->START)) {
317 $seq = $cv->START->cop_seq;
321 push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form];
322 unless ($is_form || class($cv->STASH) eq 'SPECIAL') {
323 $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1;
329 my $ent = shift @{$self->{'subs_todo'}};
332 my $name = $self->gv_name($gv);
334 return "format $name =\n"
335 . $self->deparse_format($ent->[1]). "\n";
337 $self->{'subs_declared'}{$name} = 1;
338 if ($name eq "BEGIN") {
339 my $use_dec = $self->begin_is_use($cv);
340 if (defined ($use_dec) and $self->{'expand'} < 5) {
341 return () if 0 == length($use_dec);
346 if ($self->{'linenums'}) {
347 my $line = $gv->LINE;
348 my $file = $gv->FILE;
349 $l = "\n\f#line $line \"$file\"\n";
352 if (class($cv->STASH) ne "SPECIAL") {
353 my $stash = $cv->STASH->NAME;
354 if ($stash ne $self->{'curstash'}) {
355 $p = "package $stash;\n";
356 $name = "$self->{'curstash'}::$name" unless $name =~ /::/;
357 $self->{'curstash'} = $stash;
359 $name =~ s/^\Q$stash\E::(?!\z|.*::)//;
361 return "${p}${l}sub $name " . $self->deparse_sub($cv);
365 # Return a "use" declaration for this BEGIN block, if appropriate
367 my ($self, $cv) = @_;
368 my $root = $cv->ROOT;
369 local @$self{qw'curcv curcvlex'} = ($cv);
371 #B::walkoptree($cv->ROOT, "debug");
372 my $lineseq = $root->first;
373 return if $lineseq->name ne "lineseq";
375 my $req_op = $lineseq->first->sibling;
376 return if $req_op->name ne "require";
379 if ($req_op->first->private & OPpCONST_BARE) {
380 # Actually it should always be a bareword
381 $module = $self->const_sv($req_op->first)->PV;
382 $module =~ s[/][::]g;
386 $module = $self->const($self->const_sv($req_op->first), 6);
390 my $version_op = $req_op->sibling;
391 return if class($version_op) eq "NULL";
392 if ($version_op->name eq "lineseq") {
393 # We have a version parameter; skip nextstate & pushmark
394 my $constop = $version_op->first->next->next;
396 return unless $self->const_sv($constop)->PV eq $module;
397 $constop = $constop->sibling;
398 $version = $self->const_sv($constop);
399 if (class($version) eq "IV") {
400 $version = $version->int_value;
401 } elsif (class($version) eq "NV") {
402 $version = $version->NV;
403 } elsif (class($version) ne "PVMG") {
404 # Includes PVIV and PVNV
405 $version = $version->PV;
407 # version specified as a v-string
408 $version = 'v'.join '.', map ord, split //, $version->PV;
410 $constop = $constop->sibling;
411 return if $constop->name ne "method_named";
412 return if $self->const_sv($constop)->PV ne "VERSION";
415 $lineseq = $version_op->sibling;
416 return if $lineseq->name ne "lineseq";
417 my $entersub = $lineseq->first->sibling;
418 if ($entersub->name eq "stub") {
419 return "use $module $version ();\n" if defined $version;
420 return "use $module ();\n";
422 return if $entersub->name ne "entersub";
424 # See if there are import arguments
427 my $svop = $entersub->first->sibling; # Skip over pushmark
428 return unless $self->const_sv($svop)->PV eq $module;
430 # Pull out the arguments
431 for ($svop=$svop->sibling; $svop->name ne "method_named";
432 $svop = $svop->sibling) {
433 $args .= ", " if length($args);
434 $args .= $self->deparse($svop, 6);
438 my $method_named = $svop;
439 return if $method_named->name ne "method_named";
440 my $method_name = $self->const_sv($method_named)->PV;
442 if ($method_name eq "unimport") {
446 # Certain pragmas are dealt with using hint bits,
447 # so we ignore them here
448 if ($module eq 'strict' || $module eq 'integer'
449 || $module eq 'bytes' || $module eq 'warnings'
450 || $module eq 'feature') {
454 if (defined $version && length $args) {
455 return "$use $module $version ($args);\n";
456 } elsif (defined $version) {
457 return "$use $module $version;\n";
458 } elsif (length $args) {
459 return "$use $module ($args);\n";
461 return "$use $module;\n";
466 my ($self, $pack) = @_;
468 if (!defined $pack) {
473 $pack =~ s/(::)?$/::/;
477 my %stash = svref_2object($stash)->ARRAY;
478 while (my ($key, $val) = each %stash) {
479 my $class = class($val);
480 if ($class eq "PV") {
481 # Just a prototype. As an ugly but fairly effective way
482 # to find out if it belongs here is to see if the AUTOLOAD
483 # (if any) for the stash was defined in one of our files.
484 my $A = $stash{"AUTOLOAD"};
485 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
486 && class($A->CV) eq "CV") {
488 next unless $AF eq $0 || exists $self->{'files'}{$AF};
490 push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV];
491 } elsif ($class eq "IV" && !($val->FLAGS & SVf_ROK)) {
492 # Just a name. As above.
493 # But skip proxy constant subroutines, as some form of perl-space
494 # visible code must have created them, be it a use statement, or
495 # some direct symbol-table manipulation code that we will Deparse
496 my $A = $stash{"AUTOLOAD"};
497 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
498 && class($A->CV) eq "CV") {
500 next unless $AF eq $0 || exists $self->{'files'}{$AF};
502 push @{$self->{'protos_todo'}}, [$pack . $key, undef];
503 } elsif ($class eq "GV") {
504 if (class(my $cv = $val->CV) ne "SPECIAL") {
505 next if $self->{'subs_done'}{$$val}++;
506 next if $$val != ${$cv->GV}; # Ignore imposters
509 if (class(my $cv = $val->FORM) ne "SPECIAL") {
510 next if $self->{'forms_done'}{$$val}++;
511 next if $$val != ${$cv->GV}; # Ignore imposters
514 if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
515 $self->stash_subs($pack . $key)
516 unless $pack eq '' && $key eq 'main::';
517 # avoid infinite recursion
527 foreach $ar (@{$self->{'protos_todo'}}) {
528 my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : "");
529 push @ret, "sub " . $ar->[0] . "$proto;\n";
531 delete $self->{'protos_todo'};
539 while (length($opt = substr($opts, 0, 1))) {
541 $self->{'cuddle'} = " ";
542 $opts = substr($opts, 1);
543 } elsif ($opt eq "i") {
544 $opts =~ s/^i(\d+)//;
545 $self->{'indent_size'} = $1;
546 } elsif ($opt eq "T") {
547 $self->{'use_tabs'} = 1;
548 $opts = substr($opts, 1);
549 } elsif ($opt eq "v") {
550 $opts =~ s/^v([^.]*)(.|$)//;
551 $self->{'ex_const'} = $1;
558 my $self = bless {}, $class;
559 $self->{'cuddle'} = "\n";
560 $self->{'curcop'} = undef;
561 $self->{'curstash'} = "main";
562 $self->{'ex_const'} = "'???'";
563 $self->{'expand'} = 0;
564 $self->{'files'} = {};
565 $self->{'indent_size'} = 4;
566 $self->{'linenums'} = 0;
567 $self->{'parens'} = 0;
568 $self->{'subs_todo'} = [];
569 $self->{'unquote'} = 0;
570 $self->{'use_dumper'} = 0;
571 $self->{'use_tabs'} = 0;
573 $self->{'ambient_arybase'} = 0;
574 $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
575 $self->{'ambient_hints'} = 0;
576 $self->{'ambient_hinthash'} = undef;
579 while (my $arg = shift @_) {
581 $self->{'use_dumper'} = 1;
582 require Data::Dumper;
583 } elsif ($arg =~ /^-f(.*)/) {
584 $self->{'files'}{$1} = 1;
585 } elsif ($arg eq "-l") {
586 $self->{'linenums'} = 1;
587 } elsif ($arg eq "-p") {
588 $self->{'parens'} = 1;
589 } elsif ($arg eq "-P") {
590 $self->{'noproto'} = 1;
591 } elsif ($arg eq "-q") {
592 $self->{'unquote'} = 1;
593 } elsif (substr($arg, 0, 2) eq "-s") {
594 $self->style_opts(substr $arg, 2);
595 } elsif ($arg =~ /^-x(\d)$/) {
596 $self->{'expand'} = $1;
603 # Mask out the bits that L<warnings::register> uses
606 $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
613 # Initialise the contextual information, either from
614 # defaults provided with the ambient_pragmas method,
615 # or from perl's own defaults otherwise.
619 $self->{'arybase'} = $self->{'ambient_arybase'};
620 $self->{'warnings'} = defined ($self->{'ambient_warnings'})
621 ? $self->{'ambient_warnings'} & WARN_MASK
623 $self->{'hints'} = $self->{'ambient_hints'};
624 $self->{'hints'} &= 0xFF if $] < 5.009;
625 $self->{'hinthash'} = $self->{'ambient_hinthash'};
627 # also a convenient place to clear out subs_declared
628 delete $self->{'subs_declared'};
634 my $self = B::Deparse->new(@args);
635 # First deparse command-line args
636 if (defined $^I) { # deparse -i
637 print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
639 if ($^W) { # deparse -w
640 print qq(BEGIN { \$^W = $^W; }\n);
642 if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
643 my $fs = perlstring($/) || 'undef';
644 my $bs = perlstring($O::savebackslash) || 'undef';
645 print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
647 my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
648 my @UNITCHECKs = B::unitcheck_av->isa("B::AV")
649 ? B::unitcheck_av->ARRAY
651 my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
652 my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
653 my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
654 for my $block (@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs) {
655 $self->todo($block, 0);
658 local($SIG{"__DIE__"}) =
660 if ($self->{'curcop'}) {
661 my $cop = $self->{'curcop'};
662 my($line, $file) = ($cop->line, $cop->file);
663 print STDERR "While deparsing $file near line $line,\n";
666 $self->{'curcv'} = main_cv;
667 $self->{'curcvlex'} = undef;
668 print $self->print_protos;
669 @{$self->{'subs_todo'}} =
670 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
671 print $self->indent($self->deparse_root(main_root)), "\n"
672 unless null main_root;
674 while (scalar(@{$self->{'subs_todo'}})) {
675 push @text, $self->next_todo;
677 print $self->indent(join("", @text)), "\n" if @text;
679 # Print __DATA__ section, if necessary
681 my $laststash = defined $self->{'curcop'}
682 ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
683 if (defined *{$laststash."::DATA"}{IO}) {
684 print "package $laststash;\n"
685 unless $laststash eq $self->{'curstash'};
687 print readline(*{$laststash."::DATA"});
695 croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
698 return $self->indent($self->deparse_sub(svref_2object($sub)));
701 sub ambient_pragmas {
703 my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0);
709 if ($name eq 'strict') {
712 if ($val eq 'none') {
713 $hint_bits &= ~strict::bits(qw/refs subs vars/);
719 @names = qw/refs subs vars/;
725 @names = split' ', $val;
727 $hint_bits |= strict::bits(@names);
730 elsif ($name eq '$[') {
734 elsif ($name eq 'integer'
736 || $name eq 'utf8') {
739 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
742 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
746 elsif ($name eq 're') {
748 if ($val eq 'none') {
749 $hint_bits &= ~re::bits(qw/taint eval/);
755 @names = qw/taint eval/;
761 @names = split' ',$val;
763 $hint_bits |= re::bits(@names);
766 elsif ($name eq 'warnings') {
767 if ($val eq 'none') {
768 $warning_bits = $warnings::NONE;
777 @names = split/\s+/, $val;
780 $warning_bits = $warnings::NONE if !defined ($warning_bits);
781 $warning_bits |= warnings::bits(@names);
784 elsif ($name eq 'warning_bits') {
785 $warning_bits = $val;
788 elsif ($name eq 'hint_bits') {
792 elsif ($name eq '%^H') {
797 croak "Unknown pragma type: $name";
801 croak "The ambient_pragmas method expects an even number of args";
804 $self->{'ambient_arybase'} = $arybase;
805 $self->{'ambient_warnings'} = $warning_bits;
806 $self->{'ambient_hints'} = $hint_bits;
807 $self->{'ambient_hinthash'} = $hinthash;
810 # This method is the inner loop, so try to keep it simple
815 Carp::confess("Null op in deparse") if !defined($op)
816 || class($op) eq "NULL";
817 my $meth = "pp_" . $op->name;
818 return $self->$meth($op, $cx);
824 my @lines = split(/\n/, $txt);
829 my $cmd = substr($line, 0, 1);
830 if ($cmd eq "\t" or $cmd eq "\b") {
831 $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
832 if ($self->{'use_tabs'}) {
833 $leader = "\t" x ($level / 8) . " " x ($level % 8);
835 $leader = " " x $level;
837 $line = substr($line, 1);
839 if (substr($line, 0, 1) eq "\f") {
840 $line = substr($line, 1); # no indent
842 $line = $leader . $line;
846 return join("\n", @lines);
853 Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
854 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
855 local $self->{'curcop'} = $self->{'curcop'};
856 if ($cv->FLAGS & SVf_POK) {
857 $proto = "(". $cv->PV . ") ";
859 if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
861 $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
862 $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
863 $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
866 local($self->{'curcv'}) = $cv;
867 local($self->{'curcvlex'});
868 local(@$self{qw'curstash warnings hints hinthash'})
869 = @$self{qw'curstash warnings hints hinthash'};
871 if (not null $cv->ROOT) {
872 my $lineseq = $cv->ROOT->first;
873 if ($lineseq->name eq "lineseq") {
875 for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
878 $body = $self->lineseq(undef, @ops).";";
879 my $scope_en = $self->find_scope_en($lineseq);
880 if (defined $scope_en) {
881 my $subs = join"", $self->seq_subs($scope_en);
882 $body .= ";\n$subs" if length($subs);
886 $body = $self->deparse($cv->ROOT->first, 0);
890 my $sv = $cv->const_sv;
892 # uh-oh. inlinable sub... format it differently
893 return $proto . "{ " . $self->const($sv, 0) . " }\n";
894 } else { # XSUB? (or just a declaration)
898 return $proto ."{\n\t$body\n\b}" ."\n";
905 local($self->{'curcv'}) = $form;
906 local($self->{'curcvlex'});
907 local($self->{'in_format'}) = 1;
908 local(@$self{qw'curstash warnings hints hinthash'})
909 = @$self{qw'curstash warnings hints hinthash'};
910 my $op = $form->ROOT;
912 return "\f." if $op->first->name eq 'stub'
913 || $op->first->name eq 'nextstate';
914 $op = $op->first->first; # skip leavewrite, lineseq
915 while (not null $op) {
916 $op = $op->sibling; # skip nextstate
918 $kid = $op->first->sibling; # skip pushmark
919 push @text, "\f".$self->const_sv($kid)->PV;
920 $kid = $kid->sibling;
921 for (; not null $kid; $kid = $kid->sibling) {
922 push @exprs, $self->deparse($kid, 0);
924 push @text, "\f".join(", ", @exprs)."\n" if @exprs;
927 return join("", @text) . "\f.";
932 return $op->name eq "leave" || $op->name eq "scope"
933 || $op->name eq "lineseq"
934 || ($op->name eq "null" && class($op) eq "UNOP"
935 && (is_scope($op->first) || $op->first->name eq "enter"));
939 my $name = $_[0]->name;
940 return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
943 sub is_miniwhile { # check for one-line loop (`foo() while $y--')
945 return (!null($op) and null($op->sibling)
946 and $op->name eq "null" and class($op) eq "UNOP"
947 and (($op->first->name =~ /^(and|or)$/
948 and $op->first->first->sibling->name eq "lineseq")
949 or ($op->first->name eq "lineseq"
950 and not null $op->first->first->sibling
951 and $op->first->first->sibling->name eq "unstack")
955 # Check if the op and its sibling are the initialization and the rest of a
956 # for (..;..;..) { ... } loop
959 # This OP might be almost anything, though it won't be a
960 # nextstate. (It's the initialization, so in the canonical case it
961 # will be an sassign.) The sibling is a lineseq whose first child
962 # is a nextstate and whose second is a leaveloop.
963 my $lseq = $op->sibling;
964 if (!is_state $op and !null($lseq) and $lseq->name eq "lineseq") {
965 if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
966 && (my $sib = $lseq->first->sibling)) {
967 return (!null($sib) && $sib->name eq "leaveloop");
975 return ($op->name eq "rv2sv" or
976 $op->name eq "padsv" or
977 $op->name eq "gv" or # only in array/hash constructs
978 $op->flags & OPf_KIDS && !null($op->first)
979 && $op->first->name eq "gvsv");
984 my($text, $cx, $prec) = @_;
985 if ($prec < $cx # unary ops nest just fine
986 or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
987 or $self->{'parens'})
990 # In a unop, let parent reuse our parens; see maybe_parens_unop
991 $text = "\cS" . $text if $cx == 16;
998 # same as above, but get around the `if it looks like a function' rule
999 sub maybe_parens_unop {
1001 my($name, $kid, $cx) = @_;
1002 if ($cx > 16 or $self->{'parens'}) {
1003 $kid = $self->deparse($kid, 1);
1004 if ($name eq "umask" && $kid =~ /^\d+$/) {
1005 $kid = sprintf("%#o", $kid);
1007 return "$name($kid)";
1009 $kid = $self->deparse($kid, 16);
1010 if ($name eq "umask" && $kid =~ /^\d+$/) {
1011 $kid = sprintf("%#o", $kid);
1013 if (substr($kid, 0, 1) eq "\cS") {
1015 return $name . substr($kid, 1);
1016 } elsif (substr($kid, 0, 1) eq "(") {
1017 # avoid looks-like-a-function trap with extra parens
1018 # (`+' can lead to ambiguities)
1019 return "$name(" . $kid . ")";
1021 return "$name $kid";
1026 sub maybe_parens_func {
1028 my($func, $text, $cx, $prec) = @_;
1029 if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
1030 return "$func($text)";
1032 return "$func $text";
1038 my($op, $cx, $text) = @_;
1039 my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
1040 if ($op->private & (OPpLVAL_INTRO|$our_intro)
1041 and not $self->{'avoid_local'}{$$op}) {
1042 my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
1043 if( $our_local eq 'our' ) {
1044 # XXX This assertion fails code with non-ASCII identifiers,
1045 # like ./ext/Encode/t/jperl.t
1046 die "Unexpected our($text)\n" unless $text =~ /^\W(\w+::)*\w+\z/;
1047 $text =~ s/(\w+::)+//;
1049 if (want_scalar($op)) {
1050 return "$our_local $text";
1052 return $self->maybe_parens_func("$our_local", $text, $cx, 16);
1061 my($op, $cx, $func, @args) = @_;
1062 if ($op->private & OPpTARGET_MY) {
1063 my $var = $self->padname($op->targ);
1064 my $val = $func->($self, $op, 7, @args);
1065 return $self->maybe_parens("$var = $val", $cx, 7);
1067 return $func->($self, $op, $cx, @args);
1074 return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
1079 my($op, $cx, $text) = @_;
1080 if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
1081 my $my = $op->private & OPpPAD_STATE ? "state" : "my";
1082 if (want_scalar($op)) {
1085 return $self->maybe_parens_func($my, $text, $cx, 16);
1092 # The following OPs don't have functions:
1094 # pp_padany -- does not exist after parsing
1097 if ($AUTOLOAD =~ s/^.*::pp_//) {
1098 warn "unexpected OP_".uc $AUTOLOAD;
1101 die "Undefined subroutine $AUTOLOAD called";
1105 sub DESTROY {} # Do not AUTOLOAD
1107 # $root should be the op which represents the root of whatever
1108 # we're sequencing here. If it's undefined, then we don't append
1109 # any subroutine declarations to the deparsed ops, otherwise we
1110 # append appropriate declarations.
1112 my($self, $root, @ops) = @_;
1115 my $out_cop = $self->{'curcop'};
1116 my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
1118 if (defined $root) {
1119 $limit_seq = $out_seq;
1121 $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
1122 $limit_seq = $nseq if !defined($limit_seq)
1123 or defined($nseq) && $nseq < $limit_seq;
1125 $limit_seq = $self->{'limit_seq'}
1126 if defined($self->{'limit_seq'})
1127 && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
1128 local $self->{'limit_seq'} = $limit_seq;
1130 $self->walk_lineseq($root, \@ops,
1131 sub { push @exprs, $_[0]} );
1133 my $body = join(";\n", grep {length} @exprs);
1135 if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
1136 $subs = join "\n", $self->seq_subs($limit_seq);
1138 return join(";\n", grep {length} $body, $subs);
1142 my($real_block, $self, $op, $cx) = @_;
1146 local(@$self{qw'curstash warnings hints hinthash'})
1147 = @$self{qw'curstash warnings hints hinthash'} if $real_block;
1149 $kid = $op->first->sibling; # skip enter
1150 if (is_miniwhile($kid)) {
1151 my $top = $kid->first;
1152 my $name = $top->name;
1153 if ($name eq "and") {
1155 } elsif ($name eq "or") {
1157 } else { # no conditional -> while 1 or until 0
1158 return $self->deparse($top->first, 1) . " while 1";
1160 my $cond = $top->first;
1161 my $body = $cond->sibling->first; # skip lineseq
1162 $cond = $self->deparse($cond, 1);
1163 $body = $self->deparse($body, 1);
1164 return "$body $name $cond";
1169 for (; !null($kid); $kid = $kid->sibling) {
1172 if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
1173 return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
1175 my $lineseq = $self->lineseq($op, @kids);
1176 return (length ($lineseq) ? "$lineseq;" : "");
1180 sub pp_scope { scopeop(0, @_); }
1181 sub pp_lineseq { scopeop(0, @_); }
1182 sub pp_leave { scopeop(1, @_); }
1184 # This is a special case of scopeop and lineseq, for the case of the
1185 # main_root. The difference is that we print the output statements as
1186 # soon as we get them, for the sake of impatient users.
1190 local(@$self{qw'curstash warnings hints hinthash'})
1191 = @$self{qw'curstash warnings hints hinthash'};
1193 return if null $op->first; # Can happen, e.g., for Bytecode without -k
1194 for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
1197 $self->walk_lineseq($op, \@kids,
1198 sub { print $self->indent($_[0].';');
1199 print "\n" unless $_[1] == $#kids;
1204 my ($self, $op, $kids, $callback) = @_;
1206 for (my $i = 0; $i < @kids; $i++) {
1208 if (is_state $kids[$i]) {
1209 $expr = $self->deparse($kids[$i++], 0);
1211 $callback->($expr, $i);
1215 if (is_for_loop($kids[$i])) {
1216 $callback->($expr . $self->for_loop($kids[$i], 0), $i++);
1219 $expr .= $self->deparse($kids[$i], (@kids != 1)/2);
1220 $expr =~ s/;\n?\z//;
1221 $callback->($expr, $i);
1225 # The BEGIN {} is used here because otherwise this code isn't executed
1226 # when you run B::Deparse on itself.
1228 BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1229 "ENV", "ARGV", "ARGVOUT", "_"); }
1234 Carp::confess() unless ref($gv) eq "B::GV";
1235 my $stash = $gv->STASH->NAME;
1236 my $name = $gv->SAFENAME;
1237 if ($stash eq 'main' && $name =~ /^::/) {
1240 elsif (($stash eq 'main' && $globalnames{$name})
1241 or ($stash eq $self->{'curstash'} && !$globalnames{$name}
1242 && ($stash eq 'main' || $name !~ /::/))
1243 or $name =~ /^[^A-Za-z_:]/)
1247 $stash = $stash . "::";
1249 if ($name =~ /^(\^..|{)/) {
1250 $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
1252 return $stash . $name;
1255 # Return the name to use for a stash variable.
1256 # If a lexical with the same name is in scope, it may need to be
1258 sub stash_variable {
1259 my ($self, $prefix, $name) = @_;
1261 return "$prefix$name" if $name =~ /::/;
1263 unless ($prefix eq '$' || $prefix eq '@' || #'
1264 $prefix eq '%' || $prefix eq '$#') {
1265 return "$prefix$name";
1268 my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1269 return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
1270 return "$prefix$name";
1274 my ($self, $name) = @_;
1275 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1277 return 0 if !defined($self->{'curcop'});
1278 my $seq = $self->{'curcop'}->cop_seq;
1279 return 0 if !exists $self->{'curcvlex'}{$name};
1280 for my $a (@{$self->{'curcvlex'}{$name}}) {
1281 my ($st, $en) = @$a;
1282 return 1 if $seq > $st && $seq <= $en;
1287 sub populate_curcvlex {
1289 for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
1290 my $padlist = $cv->PADLIST;
1291 # an undef CV still in lexical chain
1292 next if class($padlist) eq "SPECIAL";
1293 my @padlist = $padlist->ARRAY;
1294 my @ns = $padlist[0]->ARRAY;
1296 for (my $i=0; $i<@ns; ++$i) {
1297 next if class($ns[$i]) eq "SPECIAL";
1298 next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars
1299 if (class($ns[$i]) eq "PV") {
1300 # Probably that pesky lexical @_
1303 my $name = $ns[$i]->PVX;
1304 my ($seq_st, $seq_en) =
1305 ($ns[$i]->FLAGS & SVf_FAKE)
1307 : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
1309 push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
1314 sub find_scope_st { ((find_scope(@_))[0]); }
1315 sub find_scope_en { ((find_scope(@_))[1]); }
1317 # Recurses down the tree, looking for pad variable introductions and COPs
1319 my ($self, $op, $scope_st, $scope_en) = @_;
1320 carp("Undefined op in find_scope") if !defined $op;
1321 return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1324 while(my $op = shift @queue ) {
1325 for (my $o=$op->first; $$o; $o=$o->sibling) {
1326 if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1327 my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW);
1328 my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH;
1329 $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1330 $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1331 return ($scope_st, $scope_en);
1333 elsif (is_state($o)) {
1334 my $c = $o->cop_seq;
1335 $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1336 $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1337 return ($scope_st, $scope_en);
1339 elsif ($o->flags & OPf_KIDS) {
1340 unshift (@queue, $o);
1345 return ($scope_st, $scope_en);
1348 # Returns a list of subs which should be inserted before the COP
1350 my ($self, $op, $out_seq) = @_;
1351 my $seq = $op->cop_seq;
1352 # If we have nephews, then our sequence number indicates
1353 # the cop_seq of the end of some sort of scope.
1354 if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
1355 and my $nseq = $self->find_scope_st($op->sibling) ) {
1358 $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1359 return $self->seq_subs($seq);
1363 my ($self, $seq) = @_;
1365 #push @text, "# ($seq)\n";
1367 return "" if !defined $seq;
1368 while (scalar(@{$self->{'subs_todo'}})
1369 and $seq > $self->{'subs_todo'}[0][0]) {
1370 push @text, $self->next_todo;
1375 # Notice how subs and formats are inserted between statements here;
1376 # also $[ assignments and pragmas.
1380 $self->{'curcop'} = $op;
1382 push @text, $self->cop_subs($op);
1383 my $stash = $op->stashpv;
1384 if ($stash ne $self->{'curstash'}) {
1385 push @text, "package $stash;\n";
1386 $self->{'curstash'} = $stash;
1389 if ($self->{'arybase'} != $op->arybase) {
1390 push @text, '$[ = '. $op->arybase .";\n";
1391 $self->{'arybase'} = $op->arybase;
1394 my $warnings = $op->warnings;
1396 if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
1397 $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
1399 elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
1400 $warning_bits = $warnings::NONE;
1402 elsif ($warnings->isa("B::SPECIAL")) {
1403 $warning_bits = undef;
1406 $warning_bits = $warnings->PV & WARN_MASK;
1409 if (defined ($warning_bits) and
1410 !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
1411 push @text, declare_warnings($self->{'warnings'}, $warning_bits);
1412 $self->{'warnings'} = $warning_bits;
1415 if ($self->{'hints'} != $op->hints) {
1416 push @text, declare_hints($self->{'hints'}, $op->hints);
1417 $self->{'hints'} = $op->hints;
1420 # hack to check that the hint hash hasn't changed
1422 "@{[sort %{$self->{'hinthash'} || {}}]}"
1423 ne "@{[sort %{$op->hints_hash->HASH || {}}]}") {
1424 push @text, declare_hinthash($self->{'hinthash'}, $op->hints_hash->HASH, $self->{indent_size});
1425 $self->{'hinthash'} = $op->hints_hash->HASH;
1428 # This should go after of any branches that add statements, to
1429 # increase the chances that it refers to the same line it did in
1430 # the original program.
1431 if ($self->{'linenums'}) {
1432 push @text, "\f#line " . $op->line .
1433 ' "' . $op->file, qq'"\n';
1436 push @text, $op->label . ": " if $op->label;
1438 return join("", @text);
1441 sub declare_warnings {
1442 my ($from, $to) = @_;
1443 if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
1444 return "use warnings;\n";
1446 elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
1447 return "no warnings;\n";
1449 return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n";
1453 my ($from, $to) = @_;
1454 my $use = $to & ~$from;
1455 my $no = $from & ~$to;
1457 for my $pragma (hint_pragmas($use)) {
1458 $decls .= "use $pragma;\n";
1460 for my $pragma (hint_pragmas($no)) {
1461 $decls .= "no $pragma;\n";
1466 # Internal implementation hints that the core sets automatically, so don't need
1467 # (or want) to be passed back to the user
1468 my %ignored_hints = (
1474 sub declare_hinthash {
1475 my ($from, $to, $indent) = @_;
1477 for my $key (keys %$to) {
1478 next if $ignored_hints{$key};
1479 if (!defined $from->{$key} or $from->{$key} ne $to->{$key}) {
1480 push @decls, qq(\$^H{'$key'} = q($to->{$key}););
1483 for my $key (keys %$from) {
1484 next if $ignored_hints{$key};
1485 if (!exists $to->{$key}) {
1486 push @decls, qq(delete \$^H{'$key'};);
1489 @decls or return '';
1490 return join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n";
1496 push @pragmas, "integer" if $bits & 0x1;
1497 push @pragmas, "strict 'refs'" if $bits & 0x2;
1498 push @pragmas, "bytes" if $bits & 0x8;
1502 sub pp_dbstate { pp_nextstate(@_) }
1503 sub pp_setstate { pp_nextstate(@_) }
1505 sub pp_unstack { return "" } # see also leaveloop
1509 my($op, $cx, $name) = @_;
1515 my($op, $cx, $name) = @_;
1523 sub pp_wantarray { baseop(@_, "wantarray") }
1524 sub pp_fork { baseop(@_, "fork") }
1525 sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
1526 sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
1527 sub pp_time { maybe_targmy(@_, \&baseop, "time") }
1528 sub pp_tms { baseop(@_, "times") }
1529 sub pp_ghostent { baseop(@_, "gethostent") }
1530 sub pp_gnetent { baseop(@_, "getnetent") }
1531 sub pp_gprotoent { baseop(@_, "getprotoent") }
1532 sub pp_gservent { baseop(@_, "getservent") }
1533 sub pp_ehostent { baseop(@_, "endhostent") }
1534 sub pp_enetent { baseop(@_, "endnetent") }
1535 sub pp_eprotoent { baseop(@_, "endprotoent") }
1536 sub pp_eservent { baseop(@_, "endservent") }
1537 sub pp_gpwent { baseop(@_, "getpwent") }
1538 sub pp_spwent { baseop(@_, "setpwent") }
1539 sub pp_epwent { baseop(@_, "endpwent") }
1540 sub pp_ggrent { baseop(@_, "getgrent") }
1541 sub pp_sgrent { baseop(@_, "setgrent") }
1542 sub pp_egrent { baseop(@_, "endgrent") }
1543 sub pp_getlogin { baseop(@_, "getlogin") }
1545 sub POSTFIX () { 1 }
1547 # I couldn't think of a good short name, but this is the category of
1548 # symbolic unary operators with interesting precedence
1552 my($op, $cx, $name, $prec, $flags) = (@_, 0);
1553 my $kid = $op->first;
1554 $kid = $self->deparse($kid, $prec);
1555 return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
1559 sub pp_preinc { pfixop(@_, "++", 23) }
1560 sub pp_predec { pfixop(@_, "--", 23) }
1561 sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1562 sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1563 sub pp_i_preinc { pfixop(@_, "++", 23) }
1564 sub pp_i_predec { pfixop(@_, "--", 23) }
1565 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1566 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1567 sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
1569 sub pp_negate { maybe_targmy(@_, \&real_negate) }
1573 if ($op->first->name =~ /^(i_)?negate$/) {
1575 $self->pfixop($op, $cx, "-", 21.5);
1577 $self->pfixop($op, $cx, "-", 21);
1580 sub pp_i_negate { pp_negate(@_) }
1586 $self->pfixop($op, $cx, "not ", 4);
1588 $self->pfixop($op, $cx, "!", 21);
1594 my($op, $cx, $name) = @_;
1596 if ($op->flags & OPf_KIDS) {
1599 # this deals with 'boolkeys' right now
1600 return $self->deparse($kid,$cx);
1602 my $builtinname = $name;
1603 $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name";
1604 if (defined prototype($builtinname)
1605 && prototype($builtinname) =~ /^;?\*/
1606 && $kid->name eq "rv2gv") {
1610 return $self->maybe_parens_unop($name, $kid, $cx);
1612 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1616 sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
1617 sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
1618 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
1619 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
1620 sub pp_defined { unop(@_, "defined") }
1621 sub pp_undef { unop(@_, "undef") }
1622 sub pp_study { unop(@_, "study") }
1623 sub pp_ref { unop(@_, "ref") }
1624 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
1626 sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
1627 sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
1628 sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
1629 sub pp_srand { unop(@_, "srand") }
1630 sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
1631 sub pp_log { maybe_targmy(@_, \&unop, "log") }
1632 sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
1633 sub pp_int { maybe_targmy(@_, \&unop, "int") }
1634 sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
1635 sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
1636 sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
1638 sub pp_length { maybe_targmy(@_, \&unop, "length") }
1639 sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
1640 sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
1642 sub pp_each { unop(@_, "each") }
1643 sub pp_values { unop(@_, "values") }
1644 sub pp_keys { unop(@_, "keys") }
1646 # no name because its an optimisation op that has no keyword
1649 sub pp_aeach { unop(@_, "each") }
1650 sub pp_avalues { unop(@_, "values") }
1651 sub pp_akeys { unop(@_, "keys") }
1652 sub pp_pop { unop(@_, "pop") }
1653 sub pp_shift { unop(@_, "shift") }
1655 sub pp_caller { unop(@_, "caller") }
1656 sub pp_reset { unop(@_, "reset") }
1657 sub pp_exit { unop(@_, "exit") }
1658 sub pp_prototype { unop(@_, "prototype") }
1660 sub pp_close { unop(@_, "close") }
1661 sub pp_fileno { unop(@_, "fileno") }
1662 sub pp_umask { unop(@_, "umask") }
1663 sub pp_untie { unop(@_, "untie") }
1664 sub pp_tied { unop(@_, "tied") }
1665 sub pp_dbmclose { unop(@_, "dbmclose") }
1666 sub pp_getc { unop(@_, "getc") }
1667 sub pp_eof { unop(@_, "eof") }
1668 sub pp_tell { unop(@_, "tell") }
1669 sub pp_getsockname { unop(@_, "getsockname") }
1670 sub pp_getpeername { unop(@_, "getpeername") }
1672 sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
1673 sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
1674 sub pp_readlink { unop(@_, "readlink") }
1675 sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
1676 sub pp_readdir { unop(@_, "readdir") }
1677 sub pp_telldir { unop(@_, "telldir") }
1678 sub pp_rewinddir { unop(@_, "rewinddir") }
1679 sub pp_closedir { unop(@_, "closedir") }
1680 sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
1681 sub pp_localtime { unop(@_, "localtime") }
1682 sub pp_gmtime { unop(@_, "gmtime") }
1683 sub pp_alarm { unop(@_, "alarm") }
1684 sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
1686 sub pp_dofile { unop(@_, "do") }
1687 sub pp_entereval { unop(@_, "eval") }
1689 sub pp_ghbyname { unop(@_, "gethostbyname") }
1690 sub pp_gnbyname { unop(@_, "getnetbyname") }
1691 sub pp_gpbyname { unop(@_, "getprotobyname") }
1692 sub pp_shostent { unop(@_, "sethostent") }
1693 sub pp_snetent { unop(@_, "setnetent") }
1694 sub pp_sprotoent { unop(@_, "setprotoent") }
1695 sub pp_sservent { unop(@_, "setservent") }
1696 sub pp_gpwnam { unop(@_, "getpwnam") }
1697 sub pp_gpwuid { unop(@_, "getpwuid") }
1698 sub pp_ggrnam { unop(@_, "getgrnam") }
1699 sub pp_ggrgid { unop(@_, "getgrgid") }
1701 sub pp_lock { unop(@_, "lock") }
1703 sub pp_continue { unop(@_, "continue"); }
1705 my ($self, $op) = @_;
1706 return "" if $op->flags & OPf_SPECIAL;
1712 my($op, $cx, $givwhen) = @_;
1714 my $enterop = $op->first;
1716 if ($enterop->flags & OPf_SPECIAL) {
1718 $block = $self->deparse($enterop->first, 0);
1721 my $cond = $enterop->first;
1722 my $cond_str = $self->deparse($cond, 1);
1723 $head = "$givwhen ($cond_str)";
1724 $block = $self->deparse($cond->sibling, 0);
1732 sub pp_leavegiven { givwhen(@_, "given"); }
1733 sub pp_leavewhen { givwhen(@_, "when"); }
1739 if ($op->private & OPpEXISTS_SUB) {
1740 # Checking for the existence of a subroutine
1741 return $self->maybe_parens_func("exists",
1742 $self->pp_rv2cv($op->first, 16), $cx, 16);
1744 if ($op->flags & OPf_SPECIAL) {
1745 # Array element, not hash element
1746 return $self->maybe_parens_func("exists",
1747 $self->pp_aelem($op->first, 16), $cx, 16);
1749 return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
1757 if ($op->private & OPpSLICE) {
1758 if ($op->flags & OPf_SPECIAL) {
1759 # Deleting from an array, not a hash
1760 return $self->maybe_parens_func("delete",
1761 $self->pp_aslice($op->first, 16),
1764 return $self->maybe_parens_func("delete",
1765 $self->pp_hslice($op->first, 16),
1768 if ($op->flags & OPf_SPECIAL) {
1769 # Deleting from an array, not a hash
1770 return $self->maybe_parens_func("delete",
1771 $self->pp_aelem($op->first, 16),
1774 return $self->maybe_parens_func("delete",
1775 $self->pp_helem($op->first, 16),
1783 my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
1784 if (class($op) eq "UNOP" and $op->first->name eq "const"
1785 and $op->first->private & OPpCONST_BARE)
1787 my $name = $self->const_sv($op->first)->PV;
1790 return "$opname $name";
1792 $self->unop($op, $cx, $op->first->private & OPpCONST_NOVER ? "no" : $opname);
1799 my $kid = $op->first;
1800 if (not null $kid->sibling) {
1801 # XXX Was a here-doc
1802 return $self->dquote($op);
1804 $self->unop(@_, "scalar");
1811 return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
1814 sub anon_hash_or_list {
1818 my($pre, $post) = @{{"anonlist" => ["[","]"],
1819 "anonhash" => ["{","}"]}->{$op->name}};
1821 $op = $op->first->sibling; # skip pushmark
1822 for (; !null($op); $op = $op->sibling) {
1823 $expr = $self->deparse($op, 6);
1826 if ($pre eq "{" and $cx < 1) {
1827 # Disambiguate that it's not a block
1830 return $pre . join(", ", @exprs) . $post;
1836 if ($op->flags & OPf_SPECIAL) {
1837 return $self->anon_hash_or_list($op, $cx);
1839 warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
1843 *pp_anonhash = \&pp_anonlist;
1848 my $kid = $op->first;
1849 if ($kid->name eq "null") {
1851 if (!null($kid->sibling) and
1852 $kid->sibling->name eq "anoncode") {
1853 return $self->e_anoncode({ code => $self->padval($kid->sibling->targ) });
1854 } elsif ($kid->name eq "pushmark") {
1855 my $sib_name = $kid->sibling->name;
1856 if ($sib_name =~ /^(pad|rv2)[ah]v$/
1857 and not $kid->sibling->flags & OPf_REF)
1859 # The @a in \(@a) isn't in ref context, but only when the
1861 return "\\(" . $self->pp_list($op->first) . ")";
1862 } elsif ($sib_name eq 'entersub') {
1863 my $text = $self->deparse($kid->sibling, 1);
1864 # Always show parens for \(&func()), but only with -p otherwise
1865 $text = "($text)" if $self->{'parens'}
1866 or $kid->sibling->private & OPpENTERSUB_AMPER;
1871 $self->pfixop($op, $cx, "\\", 20);
1875 my ($self, $info) = @_;
1876 my $text = $self->deparse_sub($info->{code});
1877 return "sub " . $text;
1880 sub pp_srefgen { pp_refgen(@_) }
1885 my $kid = $op->first;
1886 $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
1887 return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
1888 return $self->unop($op, $cx, "readline");
1894 return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
1897 # Unary operators that can occur as pseudo-listops inside double quotes
1900 my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
1902 if ($op->flags & OPf_KIDS) {
1904 # If there's more than one kid, the first is an ex-pushmark.
1905 $kid = $kid->sibling if not null $kid->sibling;
1906 return $self->maybe_parens_unop($name, $kid, $cx);
1908 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1912 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
1913 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
1914 sub pp_uc { dq_unop(@_, "uc") }
1915 sub pp_lc { dq_unop(@_, "lc") }
1916 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
1920 my ($op, $cx, $name) = @_;
1921 if (class($op) eq "PVOP") {
1922 return "$name " . $op->pv;
1923 } elsif (class($op) eq "OP") {
1925 } elsif (class($op) eq "UNOP") {
1926 # Note -- loop exits are actually exempt from the
1927 # looks-like-a-func rule, but a few extra parens won't hurt
1928 return $self->maybe_parens_unop($name, $op->first, $cx);
1932 sub pp_last { loopex(@_, "last") }
1933 sub pp_next { loopex(@_, "next") }
1934 sub pp_redo { loopex(@_, "redo") }
1935 sub pp_goto { loopex(@_, "goto") }
1936 sub pp_dump { loopex(@_, "dump") }
1940 my($op, $cx, $name) = @_;
1941 if (class($op) eq "UNOP") {
1942 # Genuine `-X' filetests are exempt from the LLAFR, but not
1943 # l?stat(); for the sake of clarity, give'em all parens
1944 return $self->maybe_parens_unop($name, $op->first, $cx);
1945 } elsif (class($op) =~ /^(SV|PAD)OP$/) {
1946 return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
1947 } else { # I don't think baseop filetests ever survive ck_ftst, but...
1952 sub pp_lstat { ftst(@_, "lstat") }
1953 sub pp_stat { ftst(@_, "stat") }
1954 sub pp_ftrread { ftst(@_, "-R") }
1955 sub pp_ftrwrite { ftst(@_, "-W") }
1956 sub pp_ftrexec { ftst(@_, "-X") }
1957 sub pp_fteread { ftst(@_, "-r") }
1958 sub pp_ftewrite { ftst(@_, "-w") }
1959 sub pp_fteexec { ftst(@_, "-x") }
1960 sub pp_ftis { ftst(@_, "-e") }
1961 sub pp_fteowned { ftst(@_, "-O") }
1962 sub pp_ftrowned { ftst(@_, "-o") }
1963 sub pp_ftzero { ftst(@_, "-z") }
1964 sub pp_ftsize { ftst(@_, "-s") }
1965 sub pp_ftmtime { ftst(@_, "-M") }
1966 sub pp_ftatime { ftst(@_, "-A") }
1967 sub pp_ftctime { ftst(@_, "-C") }
1968 sub pp_ftsock { ftst(@_, "-S") }
1969 sub pp_ftchr { ftst(@_, "-c") }
1970 sub pp_ftblk { ftst(@_, "-b") }
1971 sub pp_ftfile { ftst(@_, "-f") }
1972 sub pp_ftdir { ftst(@_, "-d") }
1973 sub pp_ftpipe { ftst(@_, "-p") }
1974 sub pp_ftlink { ftst(@_, "-l") }
1975 sub pp_ftsuid { ftst(@_, "-u") }
1976 sub pp_ftsgid { ftst(@_, "-g") }
1977 sub pp_ftsvtx { ftst(@_, "-k") }
1978 sub pp_fttty { ftst(@_, "-t") }
1979 sub pp_fttext { ftst(@_, "-T") }
1980 sub pp_ftbinary { ftst(@_, "-B") }
1982 sub SWAP_CHILDREN () { 1 }
1983 sub ASSIGN () { 2 } # has OP= variant
1984 sub LIST_CONTEXT () { 4 } # Assignment is in list context
1990 my $name = $op->name;
1991 if ($name eq "concat" and $op->first->name eq "concat") {
1992 # avoid spurious `=' -- see comment in pp_concat
1995 if ($name eq "null" and class($op) eq "UNOP"
1996 and $op->first->name =~ /^(and|x?or)$/
1997 and null $op->first->sibling)
1999 # Like all conditional constructs, OP_ANDs and OP_ORs are topped
2000 # with a null that's used as the common end point of the two
2001 # flows of control. For precedence purposes, ignore it.
2002 # (COND_EXPRs have these too, but we don't bother with
2003 # their associativity).
2004 return assoc_class($op->first);
2006 return $name . ($op->flags & OPf_STACKED ? "=" : "");
2009 # Left associative operators, like `+', for which
2010 # $a + $b + $c is equivalent to ($a + $b) + $c
2013 %left = ('multiply' => 19, 'i_multiply' => 19,
2014 'divide' => 19, 'i_divide' => 19,
2015 'modulo' => 19, 'i_modulo' => 19,
2017 'add' => 18, 'i_add' => 18,
2018 'subtract' => 18, 'i_subtract' => 18,
2020 'left_shift' => 17, 'right_shift' => 17,
2022 'bit_or' => 12, 'bit_xor' => 12,
2024 'or' => 2, 'xor' => 2,
2028 sub deparse_binop_left {
2030 my($op, $left, $prec) = @_;
2031 if ($left{assoc_class($op)} && $left{assoc_class($left)}
2032 and $left{assoc_class($op)} == $left{assoc_class($left)})
2034 return $self->deparse($left, $prec - .00001);
2036 return $self->deparse($left, $prec);
2040 # Right associative operators, like `=', for which
2041 # $a = $b = $c is equivalent to $a = ($b = $c)
2044 %right = ('pow' => 22,
2045 'sassign=' => 7, 'aassign=' => 7,
2046 'multiply=' => 7, 'i_multiply=' => 7,
2047 'divide=' => 7, 'i_divide=' => 7,
2048 'modulo=' => 7, 'i_modulo=' => 7,
2050 'add=' => 7, 'i_add=' => 7,
2051 'subtract=' => 7, 'i_subtract=' => 7,
2053 'left_shift=' => 7, 'right_shift=' => 7,
2055 'bit_or=' => 7, 'bit_xor=' => 7,
2061 sub deparse_binop_right {
2063 my($op, $right, $prec) = @_;
2064 if ($right{assoc_class($op)} && $right{assoc_class($right)}
2065 and $right{assoc_class($op)} == $right{assoc_class($right)})
2067 return $self->deparse($right, $prec - .00001);
2069 return $self->deparse($right, $prec);
2075 my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
2076 my $left = $op->first;
2077 my $right = $op->last;
2079 if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
2083 if ($flags & SWAP_CHILDREN) {
2084 ($left, $right) = ($right, $left);
2086 $left = $self->deparse_binop_left($op, $left, $prec);
2087 $left = "($left)" if $flags & LIST_CONTEXT
2088 && $left !~ /^(my|our|local|)[\@\(]/;
2089 $right = $self->deparse_binop_right($op, $right, $prec);
2090 return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
2093 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2094 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2095 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
2096 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2097 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2098 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2099 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2100 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
2101 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2102 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2103 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
2105 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
2106 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
2107 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
2108 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
2109 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
2111 sub pp_eq { binop(@_, "==", 14) }
2112 sub pp_ne { binop(@_, "!=", 14) }
2113 sub pp_lt { binop(@_, "<", 15) }
2114 sub pp_gt { binop(@_, ">", 15) }
2115 sub pp_ge { binop(@_, ">=", 15) }
2116 sub pp_le { binop(@_, "<=", 15) }
2117 sub pp_ncmp { binop(@_, "<=>", 14) }
2118 sub pp_i_eq { binop(@_, "==", 14) }
2119 sub pp_i_ne { binop(@_, "!=", 14) }
2120 sub pp_i_lt { binop(@_, "<", 15) }
2121 sub pp_i_gt { binop(@_, ">", 15) }
2122 sub pp_i_ge { binop(@_, ">=", 15) }
2123 sub pp_i_le { binop(@_, "<=", 15) }
2124 sub pp_i_ncmp { binop(@_, "<=>", 14) }
2126 sub pp_seq { binop(@_, "eq", 14) }
2127 sub pp_sne { binop(@_, "ne", 14) }
2128 sub pp_slt { binop(@_, "lt", 15) }
2129 sub pp_sgt { binop(@_, "gt", 15) }
2130 sub pp_sge { binop(@_, "ge", 15) }
2131 sub pp_sle { binop(@_, "le", 15) }
2132 sub pp_scmp { binop(@_, "cmp", 14) }
2134 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
2135 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
2138 my ($self, $op, $cx) = @_;
2139 if ($op->flags & OPf_SPECIAL) {
2140 return $self->deparse($op->last, $cx);
2143 binop(@_, "~~", 14);
2147 # `.' is special because concats-of-concats are optimized to save copying
2148 # by making all but the first concat stacked. The effect is as if the
2149 # programmer had written `($a . $b) .= $c', except legal.
2150 sub pp_concat { maybe_targmy(@_, \&real_concat) }
2154 my $left = $op->first;
2155 my $right = $op->last;
2158 if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
2162 $left = $self->deparse_binop_left($op, $left, $prec);
2163 $right = $self->deparse_binop_right($op, $right, $prec);
2164 return $self->maybe_parens("$left .$eq $right", $cx, $prec);
2167 # `x' is weird when the left arg is a list
2171 my $left = $op->first;
2172 my $right = $op->last;
2175 if ($op->flags & OPf_STACKED) {
2179 if (null($right)) { # list repeat; count is inside left-side ex-list
2180 my $kid = $left->first->sibling; # skip pushmark
2182 for (; !null($kid->sibling); $kid = $kid->sibling) {
2183 push @exprs, $self->deparse($kid, 6);
2186 $left = "(" . join(", ", @exprs). ")";
2188 $left = $self->deparse_binop_left($op, $left, $prec);
2190 $right = $self->deparse_binop_right($op, $right, $prec);
2191 return $self->maybe_parens("$left x$eq $right", $cx, $prec);
2196 my ($op, $cx, $type) = @_;
2197 my $left = $op->first;
2198 my $right = $left->sibling;
2199 $left = $self->deparse($left, 9);
2200 $right = $self->deparse($right, 9);
2201 return $self->maybe_parens("$left $type $right", $cx, 9);
2207 my $flip = $op->first;
2208 my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
2209 return $self->range($flip->first, $cx, $type);
2212 # one-line while/until is handled in pp_leave
2216 my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
2217 my $left = $op->first;
2218 my $right = $op->first->sibling;
2219 if ($cx < 1 and is_scope($right) and $blockname
2220 and $self->{'expand'} < 7)
2222 $left = $self->deparse($left, 1);
2223 $right = $self->deparse($right, 0);
2224 return "$blockname ($left) {\n\t$right\n\b}\cK";
2225 } elsif ($cx < 1 and $blockname and not $self->{'parens'}
2226 and $self->{'expand'} < 7) { # $b if $a
2227 $right = $self->deparse($right, 1);
2228 $left = $self->deparse($left, 1);
2229 return "$right $blockname $left";
2230 } elsif ($cx > $lowprec and $highop) { # $a && $b
2231 $left = $self->deparse_binop_left($op, $left, $highprec);
2232 $right = $self->deparse_binop_right($op, $right, $highprec);
2233 return $self->maybe_parens("$left $highop $right", $cx, $highprec);
2234 } else { # $a and $b
2235 $left = $self->deparse_binop_left($op, $left, $lowprec);
2236 $right = $self->deparse_binop_right($op, $right, $lowprec);
2237 return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
2241 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
2242 sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
2243 sub pp_dor { logop(@_, "//", 10) }
2245 # xor is syntactically a logop, but it's really a binop (contrary to
2246 # old versions of opcode.pl). Syntax is what matters here.
2247 sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
2251 my ($op, $cx, $opname) = @_;
2252 my $left = $op->first;
2253 my $right = $op->first->sibling->first; # skip sassign
2254 $left = $self->deparse($left, 7);
2255 $right = $self->deparse($right, 7);
2256 return $self->maybe_parens("$left $opname $right", $cx, 7);
2259 sub pp_andassign { logassignop(@_, "&&=") }
2260 sub pp_orassign { logassignop(@_, "||=") }
2261 sub pp_dorassign { logassignop(@_, "//=") }
2265 my($op, $cx, $name) = @_;
2267 my $parens = ($cx >= 5) || $self->{'parens'};
2268 my $kid = $op->first->sibling;
2269 return $name if null $kid;
2271 $name = "socketpair" if $name eq "sockpair";
2272 my $proto = prototype("CORE::$name");
2274 && $proto =~ /^;?\*/
2275 && $kid->name eq "rv2gv") {
2276 $first = $self->deparse($kid->first, 6);
2279 $first = $self->deparse($kid, 6);
2281 if ($name eq "chmod" && $first =~ /^\d+$/) {
2282 $first = sprintf("%#o", $first);
2284 $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
2285 push @exprs, $first;
2286 $kid = $kid->sibling;
2287 if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") {
2288 push @exprs, $self->deparse($kid->first, 6);
2289 $kid = $kid->sibling;
2291 for (; !null($kid); $kid = $kid->sibling) {
2292 push @exprs, $self->deparse($kid, 6);
2294 if ($name eq "reverse" && ($op->private & OPpREVERSE_INPLACE)) {
2295 return "$exprs[0] = $name" . ($parens ? "($exprs[0])" : " $exprs[0]");
2298 return "$name(" . join(", ", @exprs) . ")";
2300 return "$name " . join(", ", @exprs);
2304 sub pp_bless { listop(@_, "bless") }
2305 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
2306 sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
2307 sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
2308 sub pp_index { maybe_targmy(@_, \&listop, "index") }
2309 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
2310 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
2311 sub pp_formline { listop(@_, "formline") } # see also deparse_format
2312 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
2313 sub pp_unpack { listop(@_, "unpack") }
2314 sub pp_pack { listop(@_, "pack") }
2315 sub pp_join { maybe_targmy(@_, \&listop, "join") }
2316 sub pp_splice { listop(@_, "splice") }
2317 sub pp_push { maybe_targmy(@_, \&listop, "push") }
2318 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
2319 sub pp_reverse { listop(@_, "reverse") }
2320 sub pp_warn { listop(@_, "warn") }
2321 sub pp_die { listop(@_, "die") }
2322 # Actually, return is exempt from the LLAFR (see examples in this very
2323 # module!), but for consistency's sake, ignore that fact
2324 sub pp_return { listop(@_, "return") }
2325 sub pp_open { listop(@_, "open") }
2326 sub pp_pipe_op { listop(@_, "pipe") }
2327 sub pp_tie { listop(@_, "tie") }
2328 sub pp_binmode { listop(@_, "binmode") }
2329 sub pp_dbmopen { listop(@_, "dbmopen") }
2330 sub pp_sselect { listop(@_, "select") }
2331 sub pp_select { listop(@_, "select") }
2332 sub pp_read { listop(@_, "read") }
2333 sub pp_sysopen { listop(@_, "sysopen") }
2334 sub pp_sysseek { listop(@_, "sysseek") }
2335 sub pp_sysread { listop(@_, "sysread") }
2336 sub pp_syswrite { listop(@_, "syswrite") }
2337 sub pp_send { listop(@_, "send") }
2338 sub pp_recv { listop(@_, "recv") }
2339 sub pp_seek { listop(@_, "seek") }
2340 sub pp_fcntl { listop(@_, "fcntl") }
2341 sub pp_ioctl { listop(@_, "ioctl") }
2342 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
2343 sub pp_socket { listop(@_, "socket") }
2344 sub pp_sockpair { listop(@_, "sockpair") }
2345 sub pp_bind { listop(@_, "bind") }
2346 sub pp_connect { listop(@_, "connect") }
2347 sub pp_listen { listop(@_, "listen") }
2348 sub pp_accept { listop(@_, "accept") }
2349 sub pp_shutdown { listop(@_, "shutdown") }
2350 sub pp_gsockopt { listop(@_, "getsockopt") }
2351 sub pp_ssockopt { listop(@_, "setsockopt") }
2352 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
2353 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
2354 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
2355 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
2356 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
2357 sub pp_link { maybe_targmy(@_, \&listop, "link") }
2358 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
2359 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
2360 sub pp_open_dir { listop(@_, "opendir") }
2361 sub pp_seekdir { listop(@_, "seekdir") }
2362 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
2363 sub pp_system { maybe_targmy(@_, \&listop, "system") }
2364 sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
2365 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
2366 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
2367 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
2368 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
2369 sub pp_shmget { listop(@_, "shmget") }
2370 sub pp_shmctl { listop(@_, "shmctl") }
2371 sub pp_shmread { listop(@_, "shmread") }
2372 sub pp_shmwrite { listop(@_, "shmwrite") }
2373 sub pp_msgget { listop(@_, "msgget") }
2374 sub pp_msgctl { listop(@_, "msgctl") }
2375 sub pp_msgsnd { listop(@_, "msgsnd") }
2376 sub pp_msgrcv { listop(@_, "msgrcv") }
2377 sub pp_semget { listop(@_, "semget") }
2378 sub pp_semctl { listop(@_, "semctl") }
2379 sub pp_semop { listop(@_, "semop") }
2380 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
2381 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
2382 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
2383 sub pp_gsbyname { listop(@_, "getservbyname") }
2384 sub pp_gsbyport { listop(@_, "getservbyport") }
2385 sub pp_syscall { listop(@_, "syscall") }
2390 my $text = $self->dq($op->first->sibling); # skip pushmark
2391 if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
2392 or $text =~ /[<>]/) {
2393 return 'glob(' . single_delim('qq', '"', $text) . ')';
2395 return '<' . $text . '>';
2399 # Truncate is special because OPf_SPECIAL makes a bareword first arg
2400 # be a filehandle. This could probably be better fixed in the core
2401 # by moving the GV lookup into ck_truc.
2407 my $parens = ($cx >= 5) || $self->{'parens'};
2408 my $kid = $op->first->sibling;
2410 if ($op->flags & OPf_SPECIAL) {
2411 # $kid is an OP_CONST
2412 $fh = $self->const_sv($kid)->PV;
2414 $fh = $self->deparse($kid, 6);
2415 $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
2417 my $len = $self->deparse($kid->sibling, 6);
2419 return "truncate($fh, $len)";
2421 return "truncate $fh, $len";
2427 my($op, $cx, $name) = @_;
2429 my $kid = $op->first->sibling;
2431 if ($op->flags & OPf_STACKED) {
2433 $indir = $indir->first; # skip rv2gv
2434 if (is_scope($indir)) {
2435 $indir = "{" . $self->deparse($indir, 0) . "}";
2436 $indir = "{;}" if $indir eq "{}";
2437 } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
2438 $indir = $self->const_sv($indir)->PV;
2440 $indir = $self->deparse($indir, 24);
2442 $indir = $indir . " ";
2443 $kid = $kid->sibling;
2445 if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
2446 $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
2449 elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
2450 $indir = '{$b cmp $a} ';
2452 for (; !null($kid); $kid = $kid->sibling) {
2453 $expr = $self->deparse($kid, 6);
2457 if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
2458 $name2 = 'reverse sort';
2460 if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
2461 return "$exprs[0] = $name2 $indir $exprs[0]";
2464 my $args = $indir . join(", ", @exprs);
2465 if ($indir ne "" and $name eq "sort") {
2466 # We don't want to say "sort(f 1, 2, 3)", since perl -w will
2467 # give bareword warnings in that case. Therefore if context
2468 # requires, we'll put parens around the outside "(sort f 1, 2,
2469 # 3)". Unfortunately, we'll currently think the parens are
2470 # necessary more often that they really are, because we don't
2471 # distinguish which side of an assignment we're on.
2473 return "($name2 $args)";
2475 return "$name2 $args";
2478 return $self->maybe_parens_func($name2, $args, $cx, 5);
2483 sub pp_prtf { indirop(@_, "printf") }
2484 sub pp_print { indirop(@_, "print") }
2485 sub pp_say { indirop(@_, "say") }
2486 sub pp_sort { indirop(@_, "sort") }
2490 my($op, $cx, $name) = @_;
2492 my $kid = $op->first; # this is the (map|grep)start
2493 $kid = $kid->first->sibling; # skip a pushmark
2494 my $code = $kid->first; # skip a null
2495 if (is_scope $code) {
2496 $code = "{" . $self->deparse($code, 0) . "} ";
2498 $code = $self->deparse($code, 24) . ", ";
2500 $kid = $kid->sibling;
2501 for (; !null($kid); $kid = $kid->sibling) {
2502 $expr = $self->deparse($kid, 6);
2503 push @exprs, $expr if defined $expr;
2505 return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
2508 sub pp_mapwhile { mapop(@_, "map") }
2509 sub pp_grepwhile { mapop(@_, "grep") }
2510 sub pp_mapstart { baseop(@_, "map") }
2511 sub pp_grepstart { baseop(@_, "grep") }
2517 my $kid = $op->first->sibling; # skip pushmark
2519 my $local = "either"; # could be local(...), my(...), state(...) or our(...)
2520 for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
2521 # This assumes that no other private flags equal 128, and that
2522 # OPs that store things other than flags in their op_private,
2523 # like OP_AELEMFAST, won't be immediate children of a list.
2525 # OP_ENTERSUB can break this logic, so check for it.
2526 # I suspect that open and exit can too.
2528 if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
2529 or $lop->name eq "undef")
2530 or $lop->name eq "entersub"
2531 or $lop->name eq "exit"
2532 or $lop->name eq "open")
2534 $local = ""; # or not
2537 if ($lop->name =~ /^pad[ash]v$/) {
2538 if ($lop->private & OPpPAD_STATE) { # state()
2539 ($local = "", last) if $local =~ /^(?:local|our|my)$/;
2542 ($local = "", last) if $local =~ /^(?:local|our|state)$/;
2545 } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
2546 && $lop->private & OPpOUR_INTRO
2547 or $lop->name eq "null" && $lop->first->name eq "gvsv"
2548 && $lop->first->private & OPpOUR_INTRO) { # our()
2549 ($local = "", last) if $local =~ /^(?:my|local|state)$/;
2551 } elsif ($lop->name ne "undef"
2552 # specifically avoid the "reverse sort" optimisation,
2553 # where "reverse" is nullified
2554 && !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE)))
2557 ($local = "", last) if $local =~ /^(?:my|our|state)$/;
2561 $local = "" if $local eq "either"; # no point if it's all undefs
2562 return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
2563 for (; !null($kid); $kid = $kid->sibling) {
2565 if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
2570 $self->{'avoid_local'}{$$lop}++;
2571 $expr = $self->deparse($kid, 6);
2572 delete $self->{'avoid_local'}{$$lop};
2574 $expr = $self->deparse($kid, 6);
2579 return "$local(" . join(", ", @exprs) . ")";
2581 return $self->maybe_parens( join(", ", @exprs), $cx, 6);
2585 sub is_ifelse_cont {
2587 return ($op->name eq "null" and class($op) eq "UNOP"
2588 and $op->first->name =~ /^(and|cond_expr)$/
2589 and is_scope($op->first->first->sibling));
2595 my $cond = $op->first;
2596 my $true = $cond->sibling;
2597 my $false = $true->sibling;
2598 my $cuddle = $self->{'cuddle'};
2599 unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
2600 (is_scope($false) || is_ifelse_cont($false))
2601 and $self->{'expand'} < 7) {
2602 $cond = $self->deparse($cond, 8);
2603 $true = $self->deparse($true, 6);
2604 $false = $self->deparse($false, 8);
2605 return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
2608 $cond = $self->deparse($cond, 1);
2609 $true = $self->deparse($true, 0);
2610 my $head = "if ($cond) {\n\t$true\n\b}";
2612 while (!null($false) and is_ifelse_cont($false)) {
2613 my $newop = $false->first;
2614 my $newcond = $newop->first;
2615 my $newtrue = $newcond->sibling;
2616 $false = $newtrue->sibling; # last in chain is OP_AND => no else
2617 if ($newcond->name eq "lineseq")
2619 # lineseq to ensure correct line numbers in elsif()
2620 # Bug #37302 fixed by change #33710.
2621 $newcond = $newcond->first->sibling;
2623 $newcond = $self->deparse($newcond, 1);
2624 $newtrue = $self->deparse($newtrue, 0);
2625 push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
2627 if (!null($false)) {
2628 $false = $cuddle . "else {\n\t" .
2629 $self->deparse($false, 0) . "\n\b}\cK";
2633 return $head . join($cuddle, "", @elsifs) . $false;
2637 my ($self, $op, $cx) = @_;
2638 my $cond = $op->first;
2639 my $true = $cond->sibling;
2641 return $self->deparse($true, $cx);
2646 my($op, $cx, $init) = @_;
2647 my $enter = $op->first;
2648 my $kid = $enter->sibling;
2649 local(@$self{qw'curstash warnings hints hinthash'})
2650 = @$self{qw'curstash warnings hints hinthash'};
2655 if ($kid->name eq "lineseq") { # bare or infinite loop
2656 if ($kid->last->name eq "unstack") { # infinite
2657 $head = "while (1) "; # Can't use for(;;) if there's a continue
2663 } elsif ($enter->name eq "enteriter") { # foreach
2664 my $ary = $enter->first->sibling; # first was pushmark
2665 my $var = $ary->sibling;
2666 if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
2667 # "reverse" was optimised away
2668 $ary = listop($self, $ary->first->sibling, 1, 'reverse');
2669 } elsif ($enter->flags & OPf_STACKED
2670 and not null $ary->first->sibling->sibling)
2672 $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
2673 $self->deparse($ary->first->sibling->sibling, 9);
2675 $ary = $self->deparse($ary, 1);
2678 if ($enter->flags & OPf_SPECIAL) { # thread special var
2679 $var = $self->pp_threadsv($enter, 1);
2680 } else { # regular my() variable
2681 $var = $self->pp_padsv($enter, 1);
2683 } elsif ($var->name eq "rv2gv") {
2684 $var = $self->pp_rv2sv($var, 1);
2685 if ($enter->private & OPpOUR_INTRO) {
2686 # our declarations don't have package names
2687 $var =~ s/^(.).*::/$1/;
2690 } elsif ($var->name eq "gv") {
2691 $var = "\$" . $self->deparse($var, 1);
2693 $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
2694 if (!is_state $body->first and $body->first->name ne "stub") {
2695 confess unless $var eq '$_';
2696 $body = $body->first;
2697 return $self->deparse($body, 2) . " foreach ($ary)";
2699 $head = "foreach $var ($ary) ";
2700 } elsif ($kid->name eq "null") { # while/until
2702 my $name = {"and" => "while", "or" => "until"}->{$kid->name};
2703 $cond = $self->deparse($kid->first, 1);
2704 $head = "$name ($cond) ";
2705 $body = $kid->first->sibling;
2706 } elsif ($kid->name eq "stub") { # bare and empty
2707 return "{;}"; # {} could be a hashref
2709 # If there isn't a continue block, then the next pointer for the loop
2710 # will point to the unstack, which is kid's last child, except
2711 # in a bare loop, when it will point to the leaveloop. When neither of
2712 # these conditions hold, then the second-to-last child is the continue
2713 # block (or the last in a bare loop).
2714 my $cont_start = $enter->nextop;
2716 if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
2718 $cont = $body->last;
2720 $cont = $body->first;
2721 while (!null($cont->sibling->sibling)) {
2722 $cont = $cont->sibling;
2725 my $state = $body->first;
2726 my $cuddle = $self->{'cuddle'};
2728 for (; $$state != $$cont; $state = $state->sibling) {
2729 push @states, $state;
2731 $body = $self->lineseq(undef, @states);
2732 if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
2733 $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
2736 $cont = $cuddle . "continue {\n\t" .
2737 $self->deparse($cont, 0) . "\n\b}\cK";
2740 return "" if !defined $body;
2742 $head = "for ($init; $cond;) ";
2745 $body = $self->deparse($body, 0);
2747 $body =~ s/;?$/;\n/;
2749 return $head . "{\n\t" . $body . "\b}" . $cont;
2752 sub pp_leaveloop { shift->loop_common(@_, "") }
2757 my $init = $self->deparse($op, 1);
2758 return $self->loop_common($op->sibling->first->sibling, $cx, $init);
2763 return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
2766 BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
2767 BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
2768 BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
2769 BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
2774 if (class($op) eq "OP") {
2776 return $self->{'ex_const'} if $op->targ == OP_CONST;
2777 } elsif ($op->first->name eq "pushmark") {
2778 return $self->pp_list($op, $cx);
2779 } elsif ($op->first->name eq "enter") {
2780 return $self->pp_leave($op, $cx);
2781 } elsif ($op->first->name eq "leave") {
2782 return $self->pp_leave($op->first, $cx);
2783 } elsif ($op->first->name eq "scope") {
2784 return $self->pp_scope($op->first, $cx);
2785 } elsif ($op->targ == OP_STRINGIFY) {
2786 return $self->dquote($op, $cx);
2787 } elsif (!null($op->first->sibling) and
2788 $op->first->sibling->name eq "readline" and
2789 $op->first->sibling->flags & OPf_STACKED) {
2790 return $self->maybe_parens($self->deparse($op->first, 7) . " = "
2791 . $self->deparse($op->first->sibling, 7),
2793 } elsif (!null($op->first->sibling) and
2794 $op->first->sibling->name eq "trans" and
2795 $op->first->sibling->flags & OPf_STACKED) {
2796 return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
2797 . $self->deparse($op->first->sibling, 20),
2799 } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
2800 return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2801 } elsif (!null($op->first->sibling) and
2802 $op->first->sibling->name eq "null" and
2803 class($op->first->sibling) eq "UNOP" and
2804 $op->first->sibling->first->flags & OPf_STACKED and
2805 $op->first->sibling->first->name eq "rcatline") {
2806 return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2807 . $self->deparse($op->first->sibling, 18),
2810 return $self->deparse($op->first, $cx);
2817 return $self->padname_sv($targ)->PVX;
2823 return substr($self->padname($op->targ), 1); # skip $/@/%
2829 return $self->maybe_my($op, $cx, $self->padname($op->targ));
2832 sub pp_padav { pp_padsv(@_) }
2833 sub pp_padhv { pp_padsv(@_) }
2838 @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
2839 "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
2840 "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
2847 return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
2853 if (class($op) eq "PADOP") {
2854 return $self->padval($op->padix);
2855 } else { # class($op) eq "SVOP"
2863 my $gv = $self->gv_or_padgv($op);
2864 return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2865 $self->gv_name($gv)));
2871 my $gv = $self->gv_or_padgv($op);
2872 return $self->gv_name($gv);
2879 if ($op->flags & OPf_SPECIAL) { # optimised PADAV
2880 $name = $self->padname($op->targ);
2884 my $gv = $self->gv_or_padgv($op);
2885 $name = $self->gv_name($gv);
2886 $name = $self->{'curstash'}."::$name"
2887 if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2888 $name = '$' . $name;
2891 return $name . "[" . ($op->private + $self->{'arybase'}) . "]";
2896 my($op, $cx, $type) = @_;
2898 if (class($op) eq 'NULL' || !$op->can("first")) {
2899 carp("Unexpected op in pp_rv2x");
2902 my $kid = $op->first;
2903 if ($kid->name eq "gv") {
2904 return $self->stash_variable($type, $self->deparse($kid, 0));
2905 } elsif (is_scalar $kid) {
2906 my $str = $self->deparse($kid, 0);
2907 if ($str =~ /^\$([^\w\d])\z/) {
2908 # "$$+" isn't a legal way to write the scalar dereference
2909 # of $+, since the lexer can't tell you aren't trying to
2910 # do something like "$$ + 1" to get one more than your
2911 # PID. Either "${$+}" or "$${+}" are workable
2912 # disambiguations, but if the programmer did the former,
2913 # they'd be in the "else" clause below rather than here.
2914 # It's not clear if this should somehow be unified with
2915 # the code in dq and re_dq that also adds lexer
2916 # disambiguation braces.
2917 $str = '$' . "{$1}"; #'
2919 return $type . $str;
2921 return $type . "{" . $self->deparse($kid, 0) . "}";
2925 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2926 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2927 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2933 if ($op->first->name eq "padav") {
2934 return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2936 return $self->maybe_local($op, $cx,
2937 $self->rv2x($op->first, $cx, '$#'));
2941 # skip down to the old, ex-rv2cv
2943 my ($self, $op, $cx) = @_;
2944 if (!null($op->first) && $op->first->name eq 'null' &&
2945 $op->first->targ eq OP_LIST)
2947 return $self->rv2x($op->first->first->sibling, $cx, "&")
2950 return $self->rv2x($op, $cx, "")
2956 my($cx, @list) = @_;
2957 my @a = map $self->const($_, 6), @list;
2962 } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
2963 # collapse (-1,0,1,2) into (-1..2)
2964 my ($s, $e) = @a[0,-1];
2966 return $self->maybe_parens("$s..$e", $cx, 9)
2967 unless grep $i++ != $_, @a;
2969 return $self->maybe_parens(join(", ", @a), $cx, 6);
2975 my $kid = $op->first;
2976 if ($kid->name eq "const") { # constant list
2977 my $av = $self->const_sv($kid);
2978 return $self->list_const($cx, $av->ARRAY);
2980 return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
2984 sub is_subscriptable {
2986 if ($op->name =~ /^[ahg]elem/) {
2988 } elsif ($op->name eq "entersub") {
2989 my $kid = $op->first;
2990 return 0 unless null $kid->sibling;
2992 $kid = $kid->sibling until null $kid->sibling;
2993 return 0 if is_scope($kid);
2995 return 0 if $kid->name eq "gv";
2996 return 0 if is_scalar($kid);
2997 return is_subscriptable($kid);
3003 sub elem_or_slice_array_name
3006 my ($array, $left, $padname, $allow_arrow) = @_;
3008 if ($array->name eq $padname) {
3009 return $self->padany($array);
3010 } elsif (is_scope($array)) { # ${expr}[0]
3011 return "{" . $self->deparse($array, 0) . "}";
3012 } elsif ($array->name eq "gv") {
3013 $array = $self->gv_name($self->gv_or_padgv($array));
3014 if ($array !~ /::/) {
3015 my $prefix = ($left eq '[' ? '@' : '%');
3016 $array = $self->{curstash}.'::'.$array
3017 if $self->lex_in_scope($prefix . $array);
3020 } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
3021 return $self->deparse($array, 24);
3027 sub elem_or_slice_single_index
3032 $idx = $self->deparse($idx, 1);
3034 # Outer parens in an array index will confuse perl
3035 # if we're interpolating in a regular expression, i.e.
3036 # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
3038 # If $self->{parens}, then an initial '(' will
3039 # definitely be paired with a final ')'. If
3040 # !$self->{parens}, the misleading parens won't
3041 # have been added in the first place.
3043 # [You might think that we could get "(...)...(...)"
3044 # where the initial and final parens do not match
3045 # each other. But we can't, because the above would
3046 # only happen if there's an infix binop between the
3047 # two pairs of parens, and *that* means that the whole
3048 # expression would be parenthesized as well.]
3050 $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
3052 # Hash-element braces will autoquote a bareword inside themselves.
3053 # We need to make sure that C<$hash{warn()}> doesn't come out as
3054 # C<$hash{warn}>, which has a quite different meaning. Currently
3055 # B::Deparse will always quote strings, even if the string was a
3056 # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
3057 # for constant strings.) So we can cheat slightly here - if we see
3058 # a bareword, we know that it is supposed to be a function call.
3060 $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
3067 my ($op, $cx, $left, $right, $padname) = @_;
3068 my($array, $idx) = ($op->first, $op->first->sibling);
3070 $idx = $self->elem_or_slice_single_index($idx);
3072 unless ($array->name eq $padname) { # Maybe this has been fixed
3073 $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
3075 if (my $array_name=$self->elem_or_slice_array_name
3076 ($array, $left, $padname, 1)) {
3077 return "\$" . $array_name . $left . $idx . $right;
3079 # $x[20][3]{hi} or expr->[20]
3080 my $arrow = is_subscriptable($array) ? "" : "->";
3081 return $self->deparse($array, 24) . $arrow . $left . $idx . $right;
3086 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
3087 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
3092 my($glob, $part) = ($op->first, $op->last);
3093 $glob = $glob->first; # skip rv2gv
3094 $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
3095 my $scope = is_scope($glob);
3096 $glob = $self->deparse($glob, 0);
3097 $part = $self->deparse($part, 1);
3098 return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
3103 my ($op, $cx, $left, $right, $regname, $padname) = @_;
3105 my(@elems, $kid, $array, $list);
3106 if (class($op) eq "LISTOP") {
3108 } else { # ex-hslice inside delete()
3109 for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
3113 $array = $array->first
3114 if $array->name eq $regname or $array->name eq "null";
3115 $array = $self->elem_or_slice_array_name($array,$left,$padname,0);
3116 $kid = $op->first->sibling; # skip pushmark
3117 if ($kid->name eq "list") {
3118 $kid = $kid->first->sibling; # skip list, pushmark
3119 for (; !null $kid; $kid = $kid->sibling) {
3120 push @elems, $self->deparse($kid, 6);
3122 $list = join(", ", @elems);
3124 $list = $self->elem_or_slice_single_index($kid);
3126 return "\@" . $array . $left . $list . $right;
3129 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
3130 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
3135 my $idx = $op->first;
3136 my $list = $op->last;
3138 $list = $self->deparse($list, 1);
3139 $idx = $self->deparse($idx, 1);
3140 return "($list)" . "[$idx]";
3145 return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
3150 return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
3156 my $kid = $op->first->sibling; # skip pushmark
3157 my($meth, $obj, @exprs);
3158 if ($kid->name eq "list" and want_list $kid) {
3159 # When an indirect object isn't a bareword but the args are in
3160 # parens, the parens aren't part of the method syntax (the LLAFR
3161 # doesn't apply), but they make a list with OPf_PARENS set that
3162 # doesn't get flattened by the append_elem that adds the method,
3163 # making a (object, arg1, arg2, ...) list where the object
3164 # usually is. This can be distinguished from
3165 # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
3166 # object) because in the later the list is in scalar context
3167 # as the left side of -> always is, while in the former
3168 # the list is in list context as method arguments always are.
3169 # (Good thing there aren't method prototypes!)
3170 $meth = $kid->sibling;
3171 $kid = $kid->first->sibling; # skip pushmark
3173 $kid = $kid->sibling;
3174 for (; not null $kid; $kid = $kid->sibling) {
3179 $kid = $kid->sibling;
3180 for (; !null ($kid->sibling) && $kid->name ne "method_named";
3181 $kid = $kid->sibling) {
3187 if ($meth->name eq "method_named") {
3188 $meth = $self->const_sv($meth)->PV;
3190 $meth = $meth->first;
3191 if ($meth->name eq "const") {
3192 # As of 5.005_58, this case is probably obsoleted by the
3193 # method_named case above
3194 $meth = $self->const_sv($meth)->PV; # needs to be bare
3198 return { method => $meth, variable_method => ref($meth),
3199 object => $obj, args => \@exprs };
3202 # compat function only
3205 my $info = $self->_method(@_);
3206 return $self->e_method( $self->_method(@_) );
3210 my ($self, $info) = @_;
3211 my $obj = $self->deparse($info->{object}, 24);
3213 my $meth = $info->{method};
3214 $meth = $self->deparse($meth, 1) if $info->{variable_method};
3215 my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} );
3216 my $kid = $obj . "->" . $meth;
3218 return $kid . "(" . $args . ")"; # parens mandatory
3224 # returns "&" if the prototype doesn't match the args,
3225 # or ("", $args_after_prototype_demunging) if it does.
3228 return "&" if $self->{'noproto'};
3229 my($proto, @args) = @_;
3233 # An unbackslashed @ or % gobbles up the rest of the args
3234 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
3236 $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;)//;
3239 return "&" if @args;
3240 } elsif ($chr eq ";") {
3242 } elsif ($chr eq "@" or $chr eq "%") {
3243 push @reals, map($self->deparse($_, 6), @args);
3248 if ($chr eq "\$" || $chr eq "_") {
3249 if (want_scalar $arg) {
3250 push @reals, $self->deparse($arg, 6);
3254 } elsif ($chr eq "&") {
3255 if ($arg->name =~ /^(s?refgen|undef)$/) {
3256 push @reals, $self->deparse($arg, 6);
3260 } elsif ($chr eq "*") {
3261 if ($arg->name =~ /^s?refgen$/
3262 and $arg->first->first->name eq "rv2gv")
3264 $real = $arg->first->first; # skip refgen, null
3265 if ($real->first->name eq "gv") {
3266 push @reals, $self->deparse($real, 6);
3268 push @reals, $self->deparse($real->first, 6);
3273 } elsif (substr($chr, 0, 1) eq "\\") {
3275 if ($arg->name =~ /^s?refgen$/ and
3276 !null($real = $arg->first) and
3277 ($chr =~ /\$/ && is_scalar($real->first)
3279 && class($real->first->sibling) ne 'NULL'
3280 && $real->first->sibling->name
3283 && class($real->first->sibling) ne 'NULL'
3284 && $real->first->sibling->name
3286 #or ($chr =~ /&/ # This doesn't work
3287 # && $real->first->name eq "rv2cv")
3289 && $real->first->name eq "rv2gv")))
3291 push @reals, $self->deparse($real, 6);
3298 return "&" if $proto and !$doneok; # too few args and no `;'
3299 return "&" if @args; # too many args
3300 return ("", join ", ", @reals);
3306 return $self->e_method($self->_method($op, $cx))
3307 unless null $op->first->sibling;
3311 if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
3313 } elsif ($op->private & OPpENTERSUB_AMPER) {
3317 $kid = $kid->first->sibling; # skip ex-list, pushmark
3318 for (; not null $kid->sibling; $kid = $kid->sibling) {
3323 if (is_scope($kid)) {
3325 $kid = "{" . $self->deparse($kid, 0) . "}";
3326 } elsif ($kid->first->name eq "gv") {
3327 my $gv = $self->gv_or_padgv($kid->first);
3328 if (class($gv->CV) ne "SPECIAL") {
3329 $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
3331 $simple = 1; # only calls of named functions can be prototyped
3332 $kid = $self->deparse($kid, 24);
3334 if ($kid eq 'main::') {
3336 } elsif ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) {
3337 $kid = single_delim("q", "'", $kid) . '->';
3340 } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
3342 $kid = $self->deparse($kid, 24);
3345 my $arrow = is_subscriptable($kid->first) ? "" : "->";
3346 $kid = $self->deparse($kid, 24) . $arrow;
3349 # Doesn't matter how many prototypes there are, if
3350 # they haven't happened yet!
3354 no warnings 'uninitialized';
3355 $declared = exists $self->{'subs_declared'}{$kid}
3357 defined &{ ${$self->{'curstash'}."::"}{$kid} }
3359 $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
3360 && defined prototype $self->{'curstash'}."::".$kid
3362 if (!$declared && defined($proto)) {
3363 # Avoid "too early to check prototype" warning
3364 ($amper, $proto) = ('&');
3369 if ($declared and defined $proto and not $amper) {
3370 ($amper, $args) = $self->check_proto($proto, @exprs);
3371 if ($amper eq "&") {
3372 $args = join(", ", map($self->deparse($_, 6), @exprs));
3375 $args = join(", ", map($self->deparse($_, 6), @exprs));
3377 if ($prefix or $amper) {
3378 if ($op->flags & OPf_STACKED) {
3379 return $prefix . $amper . $kid . "(" . $args . ")";
3381 return $prefix . $amper. $kid;
3384 # glob() invocations can be translated into calls of
3385 # CORE::GLOBAL::glob with a second parameter, a number.
3387 if ($kid eq "CORE::GLOBAL::glob") {
3389 $args =~ s/\s*,[^,]+$//;
3392 # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
3393 # so it must have been translated from a keyword call. Translate
3395 $kid =~ s/^CORE::GLOBAL:://;
3397 my $dproto = defined($proto) ? $proto : "undefined";
3399 return "$kid(" . $args . ")";
3400 } elsif ($dproto eq "") {
3402 } elsif ($dproto eq "\$" and is_scalar($exprs[0])) {
3403 # is_scalar is an excessively conservative test here:
3404 # really, we should be comparing to the precedence of the
3405 # top operator of $exprs[0] (ala unop()), but that would
3406 # take some major code restructuring to do right.
3407 return $self->maybe_parens_func($kid, $args, $cx, 16);
3408 } elsif ($dproto ne '$' and defined($proto) || $simple) { #'
3409 return $self->maybe_parens_func($kid, $args, $cx, 5);
3411 return "$kid(" . $args . ")";
3416 sub pp_enterwrite { unop(@_, "write") }
3418 # escape things that cause interpolation in double quotes,
3419 # but not character escapes
3422 $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
3430 # Matches any string which is balanced with respect to {braces}
3441 # the same, but treat $|, $), $( and $ at the end of the string differently
3455 (\(\?\??\{$bal\}\)) # $4
3461 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3466 # This is for regular expressions with the /x modifier
3467 # We have to leave comments unmangled.
3468 sub re_uninterp_extended {
3481 ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
3482 | \#[^\n]* # (skip over comments)
3489 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3495 my %unctrl = # portable to to EBCDIC
3497 "\c@" => '\c@', # unused
3524 "\c[" => '\c[', # unused
3525 "\c\\" => '\c\\', # unused
3526 "\c]" => '\c]', # unused
3527 "\c_" => '\c_', # unused
3530 # character escapes, but not delimiters that might need to be escaped
3531 sub escape_str { # ASCII, UTF8
3533 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3535 # $str =~ s/\cH/\\b/g; # \b means something different in a regex
3541 $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
3542 $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
3546 # For regexes with the /x modifier.
3547 # Leave whitespace unmangled.
3548 sub escape_extended_re {
3550 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3551 $str =~ s/([[:^print:]])/
3552 ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
3553 $str =~ s/\n/\n\f/g;
3557 # Don't do this for regexen
3560 $str =~ s/\\/\\\\/g;
3564 # Remove backslashes which precede literal control characters,
3565 # to avoid creating ambiguity when we escape the latter.
3569 # the insane complexity here is due to the behaviour of "\c\"
3570 $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
3574 sub balanced_delim {
3576 my @str = split //, $str;
3577 my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
3578 for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3579 ($open, $close) = @$ar;
3580 $fail = 0; $cnt = 0; $last_bs = 0;
3583 $fail = 1 if $last_bs;
3585 } elsif ($c eq $close) {
3586 $fail = 1 if $last_bs;
3594 $last_bs = $c eq '\\';
3596 $fail = 1 if $cnt != 0;
3597 return ($open, "$open$str$close") if not $fail;
3603 my($q, $default, $str) = @_;
3604 return "$default$str$default" if $default and index($str, $default) == -1;
3606 (my $succeed, $str) = balanced_delim($str);
3607 return "$q$str" if $succeed;
3609 for my $delim ('/', '"', '#') {
3610 return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3613 $str =~ s/$default/\\$default/g;
3614 return "$default$str$default";
3622 BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
3624 # Split a floating point number into an integer mantissa and a binary
3625 # exponent. Assumes you've already made sure the number isn't zero or
3626 # some weird infinity or NaN.
3630 if ($f == int($f)) {
3631 while ($f % 2 == 0) {
3636 while ($f != int($f)) {
3641 my $mantissa = sprintf("%.0f", $f);
3642 return ($mantissa, $exponent);
3648 if ($self->{'use_dumper'}) {
3649 return $self->const_dumper($sv, $cx);
3651 if (class($sv) eq "SPECIAL") {
3652 # sv_undef, sv_yes, sv_no
3653 return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1];
3655 if (class($sv) eq "NULL") {
3658 # convert a version object into the "v1.2.3" string in its V magic
3659 if ($sv->FLAGS & SVs_RMG) {
3660 for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3661 return $mg->PTR if $mg->TYPE eq 'V';
3665 if ($sv->FLAGS & SVf_IOK) {
3666 my $str = $sv->int_value;
3667 $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
3669 } elsif ($sv->FLAGS & SVf_NOK) {
3672 if (pack("F", $nv) eq pack("F", 0)) {
3677 return $self->maybe_parens("-.0", $cx, 21);
3679 } elsif (1/$nv == 0) {
3682 return $self->maybe_parens("9**9**9", $cx, 22);
3685 return $self->maybe_parens("-9**9**9", $cx, 21);
3687 } elsif ($nv != $nv) {
3689 if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
3691 return "sin(9**9**9)";
3692 } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
3694 return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
3697 my $hex = unpack("h*", pack("F", $nv));
3698 return qq'unpack("F", pack("h*", "$hex"))';
3701 # first, try the default stringification
3704 # failing that, try using more precision
3705 $str = sprintf("%.${max_prec}g", $nv);
3706 # if (pack("F", $str) ne pack("F", $nv)) {
3708 # not representable in decimal with whatever sprintf()
3709 # and atof() Perl is using here.
3710 my($mant, $exp) = split_float($nv);
3711 return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
3714 $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
3716 } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3718 if (class($ref) eq "AV") {
3719 return "[" . $self->list_const(2, $ref->ARRAY) . "]";
3720 } elsif (class($ref) eq "HV") {
3721 my %hash = $ref->ARRAY;
3723 for my $k (sort keys %hash) {
3724 push @elts, "$k => " . $self->const($hash{$k}, 6);
3726 return "{" . join(", ", @elts) . "}";
3727 } elsif (class($ref) eq "CV") {
3728 return "sub " . $self->deparse_sub($ref);
3730 if ($ref->FLAGS & SVs_SMG) {
3731 for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3732 if ($mg->TYPE eq 'r') {
3733 my $re = re_uninterp(escape_str(re_unback($mg->precomp)));
3734 return single_delim("qr", "", $re);
3739 return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20);
3740 } elsif ($sv->FLAGS & SVf_POK) {
3742 if ($str =~ /[[:^print:]]/) {
3743 return single_delim("qq", '"', uninterp escape_str unback $str);
3745 return single_delim("q", "'", unback $str);
3755 my $ref = $sv->object_2svref();
3756 my $dumper = Data::Dumper->new([$$ref], ['$v']);
3757 $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
3758 my $str = $dumper->Dump();
3759 if ($str =~ /^\$v/) {
3760 return '${my ' . $str . ' \$v}';
3770 # the constant could be in the pad (under useithreads)
3771 $sv = $self->padval($op->targ) unless $$sv;
3778 if ($op->private & OPpCONST_ARYBASE) {
3781 # if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
3782 # return $self->const_sv($op)->PV;
3784 my $sv = $self->const_sv($op);
3785 return $self->const($sv, $cx);
3791 my $type = $op->name;
3792 if ($type eq "const") {
3793 return '$[' if $op->private & OPpCONST_ARYBASE;
3794 return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3795 } elsif ($type eq "concat") {
3796 my $first = $self->dq($op->first);
3797 my $last = $self->dq($op->last);
3799 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
3800 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3801 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
3802 || ($last =~ /^[:'{\[\w_]/ && #'
3803 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3805 return $first . $last;
3806 } elsif ($type eq "uc") {
3807 return '\U' . $self->dq($op->first->sibling) . '\E';
3808 } elsif ($type eq "lc") {
3809 return '\L' . $self->dq($op->first->sibling) . '\E';
3810 } elsif ($type eq "ucfirst") {
3811 return '\u' . $self->dq($op->first->sibling);
3812 } elsif ($type eq "lcfirst") {
3813 return '\l' . $self->dq($op->first->sibling);
3814 } elsif ($type eq "quotemeta") {
3815 return '\Q' . $self->dq($op->first->sibling) . '\E';
3816 } elsif ($type eq "join") {
3817 return $self->deparse($op->last, 26); # was join($", @ary)
3819 return $self->deparse($op, 26);
3826 # skip pushmark if it exists (readpipe() vs ``)
3827 my $child = $op->first->sibling->isa('B::NULL')
3828 ? $op->first : $op->first->sibling;
3829 return single_delim("qx", '`', $self->dq($child));
3835 my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3836 return $self->deparse($kid, $cx) if $self->{'unquote'};
3837 $self->maybe_targmy($kid, $cx,
3838 sub {single_delim("qq", '"', $self->dq($_[1]))});
3841 # OP_STRINGIFY is a listop, but it only ever has one arg
3842 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3844 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3845 # note that tr(from)/to/ is OK, but not tr/from/(to)
3847 my($from, $to) = @_;
3848 my($succeed, $delim);
3849 if ($from !~ m[/] and $to !~ m[/]) {
3850 return "/$from/$to/";
3851 } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3852 if (($succeed, $to) = balanced_delim($to) and $succeed) {
3855 for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3856 return "$from$delim$to$delim" if index($to, $delim) == -1;
3859 return "$from/$to/";
3862 for $delim ('/', '"', '#') { # note no '
3863 return "$delim$from$delim$to$delim"
3864 if index($to . $from, $delim) == -1;
3866 $from =~ s[/][\\/]g;
3868 return "/$from/$to/";
3872 # Only used by tr///, so backslashes hyphens
3875 if ($n == ord '\\') {
3877 } elsif ($n == ord "-") {
3879 } elsif ($n >= ord(' ') and $n <= ord('~')) {
3881 } elsif ($n == ord "\a") {
3883 } elsif ($n == ord "\b") {
3885 } elsif ($n == ord "\t") {
3887 } elsif ($n == ord "\n") {
3889 } elsif ($n == ord "\e") {
3891 } elsif ($n == ord "\f") {
3893 } elsif ($n == ord "\r") {
3895 } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3896 return '\\c' . chr(ord("@") + $n);
3898 # return '\x' . sprintf("%02x", $n);
3899 return '\\' . sprintf("%03o", $n);
3905 my($str, $c, $tr) = ("");
3906 for ($c = 0; $c < @chars; $c++) {
3909 if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3910 $chars[$c + 2] == $tr + 2)
3912 for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3915 $str .= pchr($chars[$c]);
3921 sub tr_decode_byte {
3922 my($table, $flags) = @_;
3923 my(@table) = unpack("s*", $table);
3924 splice @table, 0x100, 1; # Number of subsequent elements
3925 my($c, $tr, @from, @to, @delfrom, $delhyphen);
3926 if ($table[ord "-"] != -1 and
3927 $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3929 $tr = $table[ord "-"];
3930 $table[ord "-"] = -1;
3934 } else { # -2 ==> delete
3938 for ($c = 0; $c < @table; $c++) {
3941 push @from, $c; push @to, $tr;
3942 } elsif ($tr == -2) {
3946 @from = (@from, @delfrom);
3947 if ($flags & OPpTRANS_COMPLEMENT) {
3950 @from{@from} = (1) x @from;
3951 for ($c = 0; $c < 256; $c++) {
3952 push @newfrom, $c unless $from{$c};
3956 unless ($flags & OPpTRANS_DELETE || !@to) {
3957 pop @to while $#to and $to[$#to] == $to[$#to -1];
3960 $from = collapse(@from);
3961 $to = collapse(@to);
3962 $from .= "-" if $delhyphen;
3963 return ($from, $to);
3968 if ($x == ord "-") {
3970 } elsif ($x == ord "\\") {
3977 # XXX This doesn't yet handle all cases correctly either
3979 sub tr_decode_utf8 {
3980 my($swash_hv, $flags) = @_;
3981 my %swash = $swash_hv->ARRAY;
3983 $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
3984 my $none = $swash{"NONE"}->IV;
3985 my $extra = $none + 1;
3986 my(@from, @delfrom, @to);
3988 foreach $line (split /\n/, $swash{'LIST'}->PV) {
3989 my($min, $max, $result) = split(/\t/, $line);
3996 $result = hex $result;
3997 if ($result == $extra) {
3998 push @delfrom, [$min, $max];
4000 push @from, [$min, $max];
4001 push @to, [$result, $result + $max - $min];
4004 for my $i (0 .. $#from) {
4005 if ($from[$i][0] == ord '-') {
4006 unshift @from, splice(@from, $i, 1);
4007 unshift @to, splice(@to, $i, 1);
4009 } elsif ($from[$i][1] == ord '-') {
4012 unshift @from, ord '-';
4013 unshift @to, ord '-';
4017 for my $i (0 .. $#delfrom) {
4018 if ($delfrom[$i][0] == ord '-') {
4019 push @delfrom, splice(@delfrom, $i, 1);
4021 } elsif ($delfrom[$i][1] == ord '-') {
4023 push @delfrom, ord '-';
4027 if (defined $final and $to[$#to][1] != $final) {
4028 push @to, [$final, $final];
4030 push @from, @delfrom;
4031 if ($flags & OPpTRANS_COMPLEMENT) {
4034 for my $i (0 .. $#from) {
4035 push @newfrom, [$next, $from[$i][0] - 1];
4036 $next = $from[$i][1] + 1;
4039 for my $range (@newfrom) {
4040 if ($range->[0] <= $range->[1]) {
4045 my($from, $to, $diff);
4046 for my $chunk (@from) {
4047 $diff = $chunk->[1] - $chunk->[0];
4049 $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
4050 } elsif ($diff == 1) {
4051 $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
4053 $from .= tr_chr($chunk->[0]);
4056 for my $chunk (@to) {
4057 $diff = $chunk->[1] - $chunk->[0];
4059 $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
4060 } elsif ($diff == 1) {
4061 $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
4063 $to .= tr_chr($chunk->[0]);
4066 #$final = sprintf("%04x", $final) if defined $final;
4067 #$none = sprintf("%04x", $none) if defined $none;
4068 #$extra = sprintf("%04x", $extra) if defined $extra;
4069 #print STDERR "final: $final\n none: $none\nextra: $extra\n";
4070 #print STDERR $swash{'LIST'}->PV;
4071 return (escape_str($from), escape_str($to));
4078 if (class($op) eq "PVOP") {
4079 ($from, $to) = tr_decode_byte($op->pv, $op->private);
4080 } else { # class($op) eq "SVOP"
4081 ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
4084 $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
4085 $flags .= "d" if $op->private & OPpTRANS_DELETE;
4086 $to = "" if $from eq $to and $flags eq "";
4087 $flags .= "s" if $op->private & OPpTRANS_SQUASH;
4088 return "tr" . double_delim($from, $to) . $flags;
4091 sub re_dq_disambiguate {
4092 my ($first, $last) = @_;
4093 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
4094 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
4095 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
4096 || ($last =~ /^[{\[\w_]/ &&
4097 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
4098 return $first . $last;
4101 # Like dq(), but different
4104 my ($op, $extended) = @_;
4106 my $type = $op->name;
4107 if ($type eq "const") {
4108 return '$[' if $op->private & OPpCONST_ARYBASE;
4109 my $unbacked = re_unback($self->const_sv($op)->as_string);
4110 return re_uninterp_extended(escape_extended_re($unbacked))
4112 return re_uninterp(escape_str($unbacked));
4113 } elsif ($type eq "concat") {
4114 my $first = $self->re_dq($op->first, $extended);
4115 my $last = $self->re_dq($op->last, $extended);
4116 return re_dq_disambiguate($first, $last);
4117 } elsif ($type eq "uc") {
4118 return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
4119 } elsif ($type eq "lc") {
4120 return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
4121 } elsif ($type eq "ucfirst") {
4122 return '\u' . $self->re_dq($op->first->sibling, $extended);
4123 } elsif ($type eq "lcfirst") {
4124 return '\l' . $self->re_dq($op->first->sibling, $extended);
4125 } elsif ($type eq "quotemeta") {
4126 return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
4127 } elsif ($type eq "join") {
4128 return $self->deparse($op->last, 26); # was join($", @ary)
4130 return $self->deparse($op, 26);
4135 my ($self, $op) = @_;
4136 return 0 if null $op;
4137 my $type = $op->name;
4139 if ($type eq 'const') {
4142 elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
4143 return $self->pure_string($op->first->sibling);
4145 elsif ($type eq 'join') {
4146 my $join_op = $op->first->sibling; # Skip pushmark
4147 return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
4149 my $gvop = $join_op->first;
4150 return 0 unless $gvop->name eq 'gvsv';
4151 return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
4153 return 0 unless ${$join_op->sibling} eq ${$op->last};
4154 return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/;
4156 elsif ($type eq 'concat') {
4157 return $self->pure_string($op->first)
4158 && $self->pure_string($op->last);
4160 elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
4163 elsif ($type eq "null" and $op->can('first') and not null $op->first and
4164 $op->first->name eq "null" and $op->first->can('first')
4165 and not null $op->first->first and
4166 $op->first->first->name eq "aelemfast") {
4178 my($op, $cx, $extended) = @_;
4179 my $kid = $op->first;
4180 $kid = $kid->first if $kid->name eq "regcmaybe";
4181 $kid = $kid->first if $kid->name eq "regcreset";
4182 if ($kid->name eq "null" and !null($kid->first)
4183 and $kid->first->name eq 'pushmark')
4186 $kid = $kid->first->sibling;
4187 while (!null($kid)) {
4189 my $last = $self->re_dq($kid, $extended);
4190 $str = re_dq_disambiguate($first, $last);
4191 $kid = $kid->sibling;
4196 return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
4197 return ($self->deparse($kid, $cx), 0);
4201 my ($self, $op, $cx) = @_;
4202 return (($self->regcomp($op, $cx, 0))[0]);
4205 # osmic acid -- see osmium tetroxide
4208 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
4209 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
4210 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
4214 my($op, $cx, $name, $delim) = @_;
4215 my $kid = $op->first;
4216 my ($binop, $var, $re) = ("", "", "");
4217 if ($op->flags & OPf_STACKED) {
4219 $var = $self->deparse($kid, 20);
4220 $kid = $kid->sibling;
4223 my $extended = ($op->pmflags & PMf_EXTENDED);
4225 my $unbacked = re_unback($op->precomp);
4227 $re = re_uninterp_extended(escape_extended_re($unbacked));
4229 $re = re_uninterp(escape_str(re_unback($op->precomp)));
4231 } elsif ($kid->name ne 'regcomp') {
4232 carp("found ".$kid->name." where regcomp expected");
4234 ($re, $quote) = $self->regcomp($kid, 21, $extended);
4237 $flags .= "c" if $op->pmflags & PMf_CONTINUE;
4238 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4239 $flags .= "i" if $op->pmflags & PMf_FOLD;
4240 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4241 $flags .= "o" if $op->pmflags & PMf_KEEP;
4242 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4243 $flags .= "x" if $op->pmflags & PMf_EXTENDED;
4244 $flags = $matchwords{$flags} if $matchwords{$flags};
4245 if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
4249 $re = single_delim($name, $delim, $re);
4251 $re = $re . $flags if $quote;
4253 return $self->maybe_parens("$var =~ $re", $cx, 20);
4259 sub pp_match { matchop(@_, "m", "/") }
4260 sub pp_pushre { matchop(@_, "m", "/") }
4261 sub pp_qr { matchop(@_, "qr", "") }
4266 my($kid, @exprs, $ary, $expr);
4269 # For our kid (an OP_PUSHRE), pmreplroot is never actually the
4270 # root of a replacement; it's either empty, or abused to point to
4271 # the GV for an array we split into (an optimization to save
4272 # assignment overhead). Depending on whether we're using ithreads,
4273 # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
4274 # figures out for us which it is.
4275 my $replroot = $kid->pmreplroot;
4277 if (ref($replroot) eq "B::GV") {
4279 } elsif (!ref($replroot) and $replroot > 0) {
4280 $gv = $self->padval($replroot);
4282 $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
4284 for (; !null($kid); $kid = $kid->sibling) {
4285 push @exprs, $self->deparse($kid, 6);
4288 # handle special case of split(), and split(' ') that compiles to /\s+/
4289 # Under 5.10, the reflags may be undef if the split regexp isn't a constant
4291 if ( $kid->flags & OPf_SPECIAL
4292 and ( $] < 5.009 ? $kid->pmflags & PMf_SKIPWHITE()
4293 : ($kid->reflags || 0) & RXf_SKIPWHITE() ) ) {
4297 $expr = "split(" . join(", ", @exprs) . ")";
4299 return $self->maybe_parens("$ary = $expr", $cx, 7);
4305 # oxime -- any of various compounds obtained chiefly by the action of
4306 # hydroxylamine on aldehydes and ketones and characterized by the
4307 # bivalent grouping C=NOH [Webster's Tenth]
4310 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
4311 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
4312 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
4313 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi',
4314 'sir', 'rise', 'smore', 'more', 'seer', 'rome', 'gore', 'grim', 'grime',
4315 'or', 'rose', 'rosie');
4320 my $kid = $op->first;
4321 my($binop, $var, $re, $repl) = ("", "", "", "");
4322 if ($op->flags & OPf_STACKED) {
4324 $var = $self->deparse($kid, 20);
4325 $kid = $kid->sibling;
4328 if (null($op->pmreplroot)) {
4329 $repl = $self->dq($kid);
4330 $kid = $kid->sibling;
4332 $repl = $op->pmreplroot->first; # skip substcont
4333 while ($repl->name eq "entereval") {
4334 $repl = $repl->first;
4337 if ($op->pmflags & PMf_EVAL) {
4338 $repl = $self->deparse($repl->first, 0);
4340 $repl = $self->dq($repl);
4343 my $extended = ($op->pmflags & PMf_EXTENDED);
4345 my $unbacked = re_unback($op->precomp);
4347 $re = re_uninterp_extended(escape_extended_re($unbacked));
4350 $re = re_uninterp(escape_str($unbacked));
4353 ($re) = $self->regcomp($kid, 1, $extended);
4355 $flags .= "e" if $op->pmflags & PMf_EVAL;
4356 $flags .= "r" if $op->pmflags & PMf_NONDESTRUCT;
4357 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4358 $flags .= "i" if $op->pmflags & PMf_FOLD;
4359 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4360 $flags .= "o" if $op->pmflags & PMf_KEEP;
4361 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4362 $flags .= "x" if $extended;
4363 $flags = $substwords{$flags} if $substwords{$flags};
4365 return $self->maybe_parens("$var =~ s"
4366 . double_delim($re, $repl) . $flags,
4369 return "s". double_delim($re, $repl) . $flags;
4378 B::Deparse - Perl compiler backend to produce perl code
4382 B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
4383 [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
4387 B::Deparse is a backend module for the Perl compiler that generates
4388 perl source code, based on the internal compiled structure that perl
4389 itself creates after parsing a program. The output of B::Deparse won't
4390 be exactly the same as the original source, since perl doesn't keep
4391 track of comments or whitespace, and there isn't a one-to-one
4392 correspondence between perl's syntactical constructions and their
4393 compiled form, but it will often be close. When you use the B<-p>
4394 option, the output also includes parentheses even when they are not
4395 required by precedence, which can make it easy to see if perl is
4396 parsing your expressions the way you intended.
4398 While B::Deparse goes to some lengths to try to figure out what your
4399 original program was doing, some parts of the language can still trip
4400 it up; it still fails even on some parts of Perl's own test suite. If
4401 you encounter a failure other than the most common ones described in
4402 the BUGS section below, you can help contribute to B::Deparse's
4403 ongoing development by submitting a bug report with a small
4408 As with all compiler backend options, these must follow directly after
4409 the '-MO=Deparse', separated by a comma but not any white space.
4415 Output data values (when they appear as constants) using Data::Dumper.
4416 Without this option, B::Deparse will use some simple routines of its
4417 own for the same purpose. Currently, Data::Dumper is better for some
4418 kinds of data (such as complex structures with sharing and
4419 self-reference) while the built-in routines are better for others
4420 (such as odd floating-point values).
4424 Normally, B::Deparse deparses the main code of a program, and all the subs
4425 defined in the same file. To include subs defined in other files, pass the
4426 B<-f> option with the filename. You can pass the B<-f> option several times, to
4427 include more than one secondary file. (Most of the time you don't want to
4428 use it at all.) You can also use this option to include subs which are
4429 defined in the scope of a B<#line> directive with two parameters.
4433 Add '#line' declarations to the output based on the line and file
4434 locations of the original code.
4438 Print extra parentheses. Without this option, B::Deparse includes
4439 parentheses in its output only when they are needed, based on the
4440 structure of your program. With B<-p>, it uses parentheses (almost)
4441 whenever they would be legal. This can be useful if you are used to
4442 LISP, or if you want to see how perl parses your input. If you say
4444 if ($var & 0x7f == 65) {print "Gimme an A!"}
4445 print ($which ? $a : $b), "\n";
4446 $name = $ENV{USER} or "Bob";
4448 C<B::Deparse,-p> will print
4451 print('Gimme an A!')
4453 (print(($which ? $a : $b)), '???');
4454 (($name = $ENV{'USER'}) or '???')
4456 which probably isn't what you intended (the C<'???'> is a sign that
4457 perl optimized away a constant value).
4461 Disable prototype checking. With this option, all function calls are
4462 deparsed as if no prototype was defined for them. In other words,
4464 perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
4473 making clear how the parameters are actually passed to C<foo>.
4477 Expand double-quoted strings into the corresponding combinations of
4478 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
4481 print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
4485 print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
4486 . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
4488 Note that the expanded form represents the way perl handles such
4489 constructions internally -- this option actually turns off the reverse
4490 translation that B::Deparse usually does. On the other hand, note that
4491 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
4492 of $y into a string before doing the assignment.
4494 =item B<-s>I<LETTERS>
4496 Tweak the style of B::Deparse's output. The letters should follow
4497 directly after the 's', with no space or punctuation. The following
4498 options are available:
4504 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
4521 The default is not to cuddle.
4525 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
4529 Use tabs for each 8 columns of indent. The default is to use only spaces.
4530 For instance, if the style options are B<-si4T>, a line that's indented
4531 3 times will be preceded by one tab and four spaces; if the options were
4532 B<-si8T>, the same line would be preceded by three tabs.
4534 =item B<v>I<STRING>B<.>
4536 Print I<STRING> for the value of a constant that can't be determined
4537 because it was optimized away (mnemonic: this happens when a constant
4538 is used in B<v>oid context). The end of the string is marked by a period.
4539 The string should be a valid perl expression, generally a constant.
4540 Note that unless it's a number, it probably needs to be quoted, and on
4541 a command line quotes need to be protected from the shell. Some
4542 conventional values include 0, 1, 42, '', 'foo', and
4543 'Useless use of constant omitted' (which may need to be
4544 B<-sv"'Useless use of constant omitted'.">
4545 or something similar depending on your shell). The default is '???'.
4546 If you're using B::Deparse on a module or other file that's require'd,
4547 you shouldn't use a value that evaluates to false, since the customary
4548 true constant at the end of a module will be in void context when the
4549 file is compiled as a main program.
4555 Expand conventional syntax constructions into equivalent ones that expose
4556 their internal operation. I<LEVEL> should be a digit, with higher values
4557 meaning more expansion. As with B<-q>, this actually involves turning off
4558 special cases in B::Deparse's normal operations.
4560 If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
4561 while loops with continue blocks; for instance
4563 for ($i = 0; $i < 10; ++$i) {
4576 Note that in a few cases this translation can't be perfectly carried back
4577 into the source code -- if the loop's initializer declares a my variable,
4578 for instance, it won't have the correct scope outside of the loop.
4580 If I<LEVEL> is at least 5, C<use> declarations will be translated into
4581 C<BEGIN> blocks containing calls to C<require> and C<import>; for
4591 'strict'->import('refs')
4595 If I<LEVEL> is at least 7, C<if> statements will be translated into
4596 equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
4598 print 'hi' if $nice;
4610 $nice and print 'hi';
4611 $nice and do { print 'hi' };
4612 $nice ? do { print 'hi' } : do { print 'bye' };
4614 Long sequences of elsifs will turn into nested ternary operators, which
4615 B::Deparse doesn't know how to indent nicely.
4619 =head1 USING B::Deparse AS A MODULE
4624 $deparse = B::Deparse->new("-p", "-sC");
4625 $body = $deparse->coderef2text(\&func);
4626 eval "sub func $body"; # the inverse operation
4630 B::Deparse can also be used on a sub-by-sub basis from other perl
4635 $deparse = B::Deparse->new(OPTIONS)
4637 Create an object to store the state of a deparsing operation and any
4638 options. The options are the same as those that can be given on the
4639 command line (see L</OPTIONS>); options that are separated by commas
4640 after B<-MO=Deparse> should be given as separate strings.
4642 =head2 ambient_pragmas
4644 $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
4646 The compilation of a subroutine can be affected by a few compiler
4647 directives, B<pragmas>. These are:
4661 Assigning to the special variable $[
4681 Ordinarily, if you use B::Deparse on a subroutine which has
4682 been compiled in the presence of one or more of these pragmas,
4683 the output will include statements to turn on the appropriate
4684 directives. So if you then compile the code returned by coderef2text,
4685 it will behave the same way as the subroutine which you deparsed.
4687 However, you may know that you intend to use the results in a
4688 particular context, where some pragmas are already in scope. In
4689 this case, you use the B<ambient_pragmas> method to describe the
4690 assumptions you wish to make.
4692 Not all of the options currently have any useful effect. See
4693 L</BUGS> for more details.
4695 The parameters it accepts are:
4701 Takes a string, possibly containing several values separated
4702 by whitespace. The special values "all" and "none" mean what you'd
4705 $deparse->ambient_pragmas(strict => 'subs refs');
4709 Takes a number, the value of the array base $[.
4717 If the value is true, then the appropriate pragma is assumed to
4718 be in the ambient scope, otherwise not.
4722 Takes a string, possibly containing a whitespace-separated list of
4723 values. The values "all" and "none" are special. It's also permissible
4724 to pass an array reference here.
4726 $deparser->ambient_pragmas(re => 'eval');
4731 Takes a string, possibly containing a whitespace-separated list of
4732 values. The values "all" and "none" are special, again. It's also
4733 permissible to pass an array reference here.
4735 $deparser->ambient_pragmas(warnings => [qw[void io]]);
4737 If one of the values is the string "FATAL", then all the warnings
4738 in that list will be considered fatal, just as with the B<warnings>
4739 pragma itself. Should you need to specify that some warnings are
4740 fatal, and others are merely enabled, you can pass the B<warnings>
4743 $deparser->ambient_pragmas(
4745 warnings => [FATAL => qw/void io/],
4748 See L<perllexwarn> for more information about lexical warnings.
4754 These two parameters are used to specify the ambient pragmas in
4755 the format used by the special variables $^H and ${^WARNING_BITS}.
4757 They exist principally so that you can write code like:
4759 { my ($hint_bits, $warning_bits);
4760 BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
4761 $deparser->ambient_pragmas (
4762 hint_bits => $hint_bits,
4763 warning_bits => $warning_bits,
4767 which specifies that the ambient pragmas are exactly those which
4768 are in scope at the point of calling.
4772 This parameter is used to specify the ambient pragmas which are
4773 stored in the special hash %^H.
4779 $body = $deparse->coderef2text(\&func)
4780 $body = $deparse->coderef2text(sub ($$) { ... })
4782 Return source code for the body of a subroutine (a block, optionally
4783 preceded by a prototype in parens), given a reference to the
4784 sub. Because a subroutine can have no names, or more than one name,
4785 this method doesn't return a complete subroutine definition -- if you
4786 want to eval the result, you should prepend "sub subname ", or "sub "
4787 for an anonymous function constructor. Unless the sub was defined in
4788 the main:: package, the code will include a package declaration.
4796 The only pragmas to be completely supported are: C<use warnings>,
4797 C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
4798 behaves like a pragma, is also supported.)
4800 Excepting those listed above, we're currently unable to guarantee that
4801 B::Deparse will produce a pragma at the correct point in the program.
4802 (Specifically, pragmas at the beginning of a block often appear right
4803 before the start of the block instead.)
4804 Since the effects of pragmas are often lexically scoped, this can mean
4805 that the pragma holds sway over a different portion of the program
4806 than in the input file.
4810 In fact, the above is a specific instance of a more general problem:
4811 we can't guarantee to produce BEGIN blocks or C<use> declarations in
4812 exactly the right place. So if you use a module which affects compilation
4813 (such as by over-riding keywords, overloading constants or whatever)
4814 then the output code might not work as intended.
4816 This is the most serious outstanding problem, and will require some help
4817 from the Perl core to fix.
4821 If a keyword is over-ridden, and your program explicitly calls
4822 the built-in version by using CORE::keyword, the output of B::Deparse
4823 will not reflect this. If you run the resulting code, it will call
4824 the over-ridden version rather than the built-in one. (Maybe there
4825 should be an option to B<always> print keyword calls as C<CORE::name>.)
4829 Some constants don't print correctly either with or without B<-d>.
4830 For instance, neither B::Deparse nor Data::Dumper know how to print
4831 dual-valued scalars correctly, as in:
4833 use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
4835 use constant H => { "#" => 1 }; H->{"#"};
4839 An input file that uses source filtering probably won't be deparsed into
4840 runnable code, because it will still include the B<use> declaration
4841 for the source filtering module, even though the code that is
4842 produced is already ordinary Perl which shouldn't be filtered again.
4846 Optimised away statements are rendered as '???'. This includes statements that
4847 have a compile-time side-effect, such as the obscure
4851 which is not, consequently, deparsed correctly.
4853 foreach my $i (@_) { 0 }
4855 foreach my $i (@_) { '???' }
4859 Lexical (my) variables declared in scopes external to a subroutine
4860 appear in code2ref output text as package variables. This is a tricky
4861 problem, as perl has no native facility for refering to a lexical variable
4862 defined within a different scope, although L<PadWalker> is a good start.
4866 There are probably many more bugs on non-ASCII platforms (EBCDIC).
4872 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
4873 by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
4874 Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
4875 Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael