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
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
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 sub scan_for_constants {
617 B::walksymtable(\%::, sub {
621 return if !$cv || class($cv) ne 'CV';
623 my $const = $cv->const_sv;
624 return if !$const || class($const) eq 'SPECIAL';
626 $ret{ 0 + $const->object_2svref } = $gv->NAME;
632 # Initialise the contextual information, either from
633 # defaults provided with the ambient_pragmas method,
634 # or from perl's own defaults otherwise.
638 $self->{'arybase'} = $self->{'ambient_arybase'};
639 $self->{'warnings'} = defined ($self->{'ambient_warnings'})
640 ? $self->{'ambient_warnings'} & WARN_MASK
642 $self->{'hints'} = $self->{'ambient_hints'};
643 $self->{'hints'} &= 0xFF if $] < 5.009;
644 $self->{'hinthash'} = $self->{'ambient_hinthash'};
646 # also a convenient place to clear out subs_declared
647 delete $self->{'subs_declared'};
653 my $self = B::Deparse->new(@args);
654 # First deparse command-line args
655 if (defined $^I) { # deparse -i
656 print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
658 if ($^W) { # deparse -w
659 print qq(BEGIN { \$^W = $^W; }\n);
661 if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
662 my $fs = perlstring($/) || 'undef';
663 my $bs = perlstring($O::savebackslash) || 'undef';
664 print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
666 my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
667 my @UNITCHECKs = B::unitcheck_av->isa("B::AV")
668 ? B::unitcheck_av->ARRAY
670 my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
671 my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
672 my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
673 for my $block (@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs) {
674 $self->todo($block, 0);
677 local($SIG{"__DIE__"}) =
679 if ($self->{'curcop'}) {
680 my $cop = $self->{'curcop'};
681 my($line, $file) = ($cop->line, $cop->file);
682 print STDERR "While deparsing $file near line $line,\n";
685 $self->{'curcv'} = main_cv;
686 $self->{'curcvlex'} = undef;
687 print $self->print_protos;
688 @{$self->{'subs_todo'}} =
689 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
690 print $self->indent($self->deparse_root(main_root)), "\n"
691 unless null main_root;
693 while (scalar(@{$self->{'subs_todo'}})) {
694 push @text, $self->next_todo;
696 print $self->indent(join("", @text)), "\n" if @text;
698 # Print __DATA__ section, if necessary
700 my $laststash = defined $self->{'curcop'}
701 ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
702 if (defined *{$laststash."::DATA"}{IO}) {
703 print "package $laststash;\n"
704 unless $laststash eq $self->{'curstash'};
706 print readline(*{$laststash."::DATA"});
714 croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
717 return $self->indent($self->deparse_sub(svref_2object($sub)));
720 sub ambient_pragmas {
722 my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0);
728 if ($name eq 'strict') {
731 if ($val eq 'none') {
732 $hint_bits &= ~strict::bits(qw/refs subs vars/);
738 @names = qw/refs subs vars/;
744 @names = split' ', $val;
746 $hint_bits |= strict::bits(@names);
749 elsif ($name eq '$[') {
753 elsif ($name eq 'integer'
755 || $name eq 'utf8') {
758 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
761 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
765 elsif ($name eq 're') {
767 if ($val eq 'none') {
768 $hint_bits &= ~re::bits(qw/taint eval/);
774 @names = qw/taint eval/;
780 @names = split' ',$val;
782 $hint_bits |= re::bits(@names);
785 elsif ($name eq 'warnings') {
786 if ($val eq 'none') {
787 $warning_bits = $warnings::NONE;
796 @names = split/\s+/, $val;
799 $warning_bits = $warnings::NONE if !defined ($warning_bits);
800 $warning_bits |= warnings::bits(@names);
803 elsif ($name eq 'warning_bits') {
804 $warning_bits = $val;
807 elsif ($name eq 'hint_bits') {
811 elsif ($name eq '%^H') {
816 croak "Unknown pragma type: $name";
820 croak "The ambient_pragmas method expects an even number of args";
823 $self->{'ambient_arybase'} = $arybase;
824 $self->{'ambient_warnings'} = $warning_bits;
825 $self->{'ambient_hints'} = $hint_bits;
826 $self->{'ambient_hinthash'} = $hinthash;
829 # This method is the inner loop, so try to keep it simple
834 Carp::confess("Null op in deparse") if !defined($op)
835 || class($op) eq "NULL";
836 my $meth = "pp_" . $op->name;
837 return $self->$meth($op, $cx);
843 my @lines = split(/\n/, $txt);
848 my $cmd = substr($line, 0, 1);
849 if ($cmd eq "\t" or $cmd eq "\b") {
850 $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
851 if ($self->{'use_tabs'}) {
852 $leader = "\t" x ($level / 8) . " " x ($level % 8);
854 $leader = " " x $level;
856 $line = substr($line, 1);
858 if (substr($line, 0, 1) eq "\f") {
859 $line = substr($line, 1); # no indent
861 $line = $leader . $line;
865 return join("\n", @lines);
872 Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
873 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
874 local $self->{'curcop'} = $self->{'curcop'};
875 if ($cv->FLAGS & SVf_POK) {
876 $proto = "(". $cv->PV . ") ";
878 if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
880 $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
881 $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
882 $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
885 local($self->{'curcv'}) = $cv;
886 local($self->{'curcvlex'});
887 local(@$self{qw'curstash warnings hints hinthash'})
888 = @$self{qw'curstash warnings hints hinthash'};
890 if (not null $cv->ROOT) {
891 my $lineseq = $cv->ROOT->first;
892 if ($lineseq->name eq "lineseq") {
894 for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
897 $body = $self->lineseq(undef, @ops).";";
898 my $scope_en = $self->find_scope_en($lineseq);
899 if (defined $scope_en) {
900 my $subs = join"", $self->seq_subs($scope_en);
901 $body .= ";\n$subs" if length($subs);
905 $body = $self->deparse($cv->ROOT->first, 0);
909 my $sv = $cv->const_sv;
911 # uh-oh. inlinable sub... format it differently
912 return $proto . "{ " . $self->const($sv, 0) . " }\n";
913 } else { # XSUB? (or just a declaration)
917 return $proto ."{\n\t$body\n\b}" ."\n";
924 local($self->{'curcv'}) = $form;
925 local($self->{'curcvlex'});
926 local($self->{'in_format'}) = 1;
927 local(@$self{qw'curstash warnings hints hinthash'})
928 = @$self{qw'curstash warnings hints hinthash'};
929 my $op = $form->ROOT;
931 return "\f." if $op->first->name eq 'stub'
932 || $op->first->name eq 'nextstate';
933 $op = $op->first->first; # skip leavewrite, lineseq
934 while (not null $op) {
935 $op = $op->sibling; # skip nextstate
937 $kid = $op->first->sibling; # skip pushmark
938 push @text, "\f".$self->const_sv($kid)->PV;
939 $kid = $kid->sibling;
940 for (; not null $kid; $kid = $kid->sibling) {
941 push @exprs, $self->deparse($kid, 0);
943 push @text, "\f".join(", ", @exprs)."\n" if @exprs;
946 return join("", @text) . "\f.";
951 return $op->name eq "leave" || $op->name eq "scope"
952 || $op->name eq "lineseq"
953 || ($op->name eq "null" && class($op) eq "UNOP"
954 && (is_scope($op->first) || $op->first->name eq "enter"));
958 my $name = $_[0]->name;
959 return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
962 sub is_miniwhile { # check for one-line loop (`foo() while $y--')
964 return (!null($op) and null($op->sibling)
965 and $op->name eq "null" and class($op) eq "UNOP"
966 and (($op->first->name =~ /^(and|or)$/
967 and $op->first->first->sibling->name eq "lineseq")
968 or ($op->first->name eq "lineseq"
969 and not null $op->first->first->sibling
970 and $op->first->first->sibling->name eq "unstack")
974 # Check if the op and its sibling are the initialization and the rest of a
975 # for (..;..;..) { ... } loop
978 # This OP might be almost anything, though it won't be a
979 # nextstate. (It's the initialization, so in the canonical case it
980 # will be an sassign.) The sibling is a lineseq whose first child
981 # is a nextstate and whose second is a leaveloop.
982 my $lseq = $op->sibling;
983 if (!is_state $op and !null($lseq) and $lseq->name eq "lineseq") {
984 if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
985 && (my $sib = $lseq->first->sibling)) {
986 return (!null($sib) && $sib->name eq "leaveloop");
994 return ($op->name eq "rv2sv" or
995 $op->name eq "padsv" or
996 $op->name eq "gv" or # only in array/hash constructs
997 $op->flags & OPf_KIDS && !null($op->first)
998 && $op->first->name eq "gvsv");
1003 my($text, $cx, $prec) = @_;
1004 if ($prec < $cx # unary ops nest just fine
1005 or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
1006 or $self->{'parens'})
1009 # In a unop, let parent reuse our parens; see maybe_parens_unop
1010 $text = "\cS" . $text if $cx == 16;
1017 # same as above, but get around the `if it looks like a function' rule
1018 sub maybe_parens_unop {
1020 my($name, $kid, $cx) = @_;
1021 if ($cx > 16 or $self->{'parens'}) {
1022 $kid = $self->deparse($kid, 1);
1023 if ($name eq "umask" && $kid =~ /^\d+$/) {
1024 $kid = sprintf("%#o", $kid);
1026 return "$name($kid)";
1028 $kid = $self->deparse($kid, 16);
1029 if ($name eq "umask" && $kid =~ /^\d+$/) {
1030 $kid = sprintf("%#o", $kid);
1032 if (substr($kid, 0, 1) eq "\cS") {
1034 return $name . substr($kid, 1);
1035 } elsif (substr($kid, 0, 1) eq "(") {
1036 # avoid looks-like-a-function trap with extra parens
1037 # (`+' can lead to ambiguities)
1038 return "$name(" . $kid . ")";
1040 return "$name $kid";
1045 sub maybe_parens_func {
1047 my($func, $text, $cx, $prec) = @_;
1048 if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
1049 return "$func($text)";
1051 return "$func $text";
1057 my($op, $cx, $text) = @_;
1058 my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
1059 if ($op->private & (OPpLVAL_INTRO|$our_intro)
1060 and not $self->{'avoid_local'}{$$op}) {
1061 my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
1062 if( $our_local eq 'our' ) {
1063 # XXX This assertion fails code with non-ASCII identifiers,
1064 # like ./ext/Encode/t/jperl.t
1065 die "Unexpected our($text)\n" unless $text =~ /^\W(\w+::)*\w+\z/;
1066 $text =~ s/(\w+::)+//;
1068 if (want_scalar($op)) {
1069 return "$our_local $text";
1071 return $self->maybe_parens_func("$our_local", $text, $cx, 16);
1080 my($op, $cx, $func, @args) = @_;
1081 if ($op->private & OPpTARGET_MY) {
1082 my $var = $self->padname($op->targ);
1083 my $val = $func->($self, $op, 7, @args);
1084 return $self->maybe_parens("$var = $val", $cx, 7);
1086 return $func->($self, $op, $cx, @args);
1093 return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
1098 my($op, $cx, $text) = @_;
1099 if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
1100 my $my = $op->private & OPpPAD_STATE ? "state" : "my";
1101 if (want_scalar($op)) {
1104 return $self->maybe_parens_func($my, $text, $cx, 16);
1111 # The following OPs don't have functions:
1113 # pp_padany -- does not exist after parsing
1116 if ($AUTOLOAD =~ s/^.*::pp_//) {
1117 warn "unexpected OP_".uc $AUTOLOAD;
1120 die "Undefined subroutine $AUTOLOAD called";
1124 sub DESTROY {} # Do not AUTOLOAD
1126 # $root should be the op which represents the root of whatever
1127 # we're sequencing here. If it's undefined, then we don't append
1128 # any subroutine declarations to the deparsed ops, otherwise we
1129 # append appropriate declarations.
1131 my($self, $root, @ops) = @_;
1134 my $out_cop = $self->{'curcop'};
1135 my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
1137 if (defined $root) {
1138 $limit_seq = $out_seq;
1140 $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
1141 $limit_seq = $nseq if !defined($limit_seq)
1142 or defined($nseq) && $nseq < $limit_seq;
1144 $limit_seq = $self->{'limit_seq'}
1145 if defined($self->{'limit_seq'})
1146 && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
1147 local $self->{'limit_seq'} = $limit_seq;
1149 $self->walk_lineseq($root, \@ops,
1150 sub { push @exprs, $_[0]} );
1152 my $body = join(";\n", grep {length} @exprs);
1154 if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
1155 $subs = join "\n", $self->seq_subs($limit_seq);
1157 return join(";\n", grep {length} $body, $subs);
1161 my($real_block, $self, $op, $cx) = @_;
1165 local(@$self{qw'curstash warnings hints hinthash'})
1166 = @$self{qw'curstash warnings hints hinthash'} if $real_block;
1168 $kid = $op->first->sibling; # skip enter
1169 if (is_miniwhile($kid)) {
1170 my $top = $kid->first;
1171 my $name = $top->name;
1172 if ($name eq "and") {
1174 } elsif ($name eq "or") {
1176 } else { # no conditional -> while 1 or until 0
1177 return $self->deparse($top->first, 1) . " while 1";
1179 my $cond = $top->first;
1180 my $body = $cond->sibling->first; # skip lineseq
1181 $cond = $self->deparse($cond, 1);
1182 $body = $self->deparse($body, 1);
1183 return "$body $name $cond";
1188 for (; !null($kid); $kid = $kid->sibling) {
1191 if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
1192 return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
1194 my $lineseq = $self->lineseq($op, @kids);
1195 return (length ($lineseq) ? "$lineseq;" : "");
1199 sub pp_scope { scopeop(0, @_); }
1200 sub pp_lineseq { scopeop(0, @_); }
1201 sub pp_leave { scopeop(1, @_); }
1203 # This is a special case of scopeop and lineseq, for the case of the
1204 # main_root. The difference is that we print the output statements as
1205 # soon as we get them, for the sake of impatient users.
1209 local(@$self{qw'curstash warnings hints hinthash'})
1210 = @$self{qw'curstash warnings hints hinthash'};
1212 return if null $op->first; # Can happen, e.g., for Bytecode without -k
1213 for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
1216 $self->walk_lineseq($op, \@kids,
1217 sub { print $self->indent($_[0].';');
1218 print "\n" unless $_[1] == $#kids;
1223 my ($self, $op, $kids, $callback) = @_;
1225 for (my $i = 0; $i < @kids; $i++) {
1227 if (is_state $kids[$i]) {
1228 $expr = $self->deparse($kids[$i++], 0);
1230 $callback->($expr, $i);
1234 if (is_for_loop($kids[$i])) {
1235 $callback->($expr . $self->for_loop($kids[$i], 0), $i++);
1238 $expr .= $self->deparse($kids[$i], (@kids != 1)/2);
1239 $expr =~ s/;\n?\z//;
1240 $callback->($expr, $i);
1244 # The BEGIN {} is used here because otherwise this code isn't executed
1245 # when you run B::Deparse on itself.
1247 BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1248 "ENV", "ARGV", "ARGVOUT", "_"); }
1253 Carp::confess() unless ref($gv) eq "B::GV";
1254 my $stash = $gv->STASH->NAME;
1255 my $name = $gv->SAFENAME;
1256 if ($stash eq 'main' && $name =~ /^::/) {
1259 elsif (($stash eq 'main' && $globalnames{$name})
1260 or ($stash eq $self->{'curstash'} && !$globalnames{$name}
1261 && ($stash eq 'main' || $name !~ /::/))
1262 or $name =~ /^[^A-Za-z_:]/)
1266 $stash = $stash . "::";
1268 if ($name =~ /^(\^..|{)/) {
1269 $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
1271 return $stash . $name;
1274 # Return the name to use for a stash variable.
1275 # If a lexical with the same name is in scope, it may need to be
1277 sub stash_variable {
1278 my ($self, $prefix, $name) = @_;
1280 return "$prefix$name" if $name =~ /::/;
1282 unless ($prefix eq '$' || $prefix eq '@' || #'
1283 $prefix eq '%' || $prefix eq '$#') {
1284 return "$prefix$name";
1287 my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1288 return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
1289 return "$prefix$name";
1293 my ($self, $name) = @_;
1294 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1296 return 0 if !defined($self->{'curcop'});
1297 my $seq = $self->{'curcop'}->cop_seq;
1298 return 0 if !exists $self->{'curcvlex'}{$name};
1299 for my $a (@{$self->{'curcvlex'}{$name}}) {
1300 my ($st, $en) = @$a;
1301 return 1 if $seq > $st && $seq <= $en;
1306 sub populate_curcvlex {
1308 for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
1309 my $padlist = $cv->PADLIST;
1310 # an undef CV still in lexical chain
1311 next if class($padlist) eq "SPECIAL";
1312 my @padlist = $padlist->ARRAY;
1313 my @ns = $padlist[0]->ARRAY;
1315 for (my $i=0; $i<@ns; ++$i) {
1316 next if class($ns[$i]) eq "SPECIAL";
1317 next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars
1318 if (class($ns[$i]) eq "PV") {
1319 # Probably that pesky lexical @_
1322 my $name = $ns[$i]->PVX;
1323 my ($seq_st, $seq_en) =
1324 ($ns[$i]->FLAGS & SVf_FAKE)
1326 : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
1328 push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
1333 sub find_scope_st { ((find_scope(@_))[0]); }
1334 sub find_scope_en { ((find_scope(@_))[1]); }
1336 # Recurses down the tree, looking for pad variable introductions and COPs
1338 my ($self, $op, $scope_st, $scope_en) = @_;
1339 carp("Undefined op in find_scope") if !defined $op;
1340 return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1343 while(my $op = shift @queue ) {
1344 for (my $o=$op->first; $$o; $o=$o->sibling) {
1345 if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1346 my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW);
1347 my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH;
1348 $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1349 $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1350 return ($scope_st, $scope_en);
1352 elsif (is_state($o)) {
1353 my $c = $o->cop_seq;
1354 $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1355 $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1356 return ($scope_st, $scope_en);
1358 elsif ($o->flags & OPf_KIDS) {
1359 unshift (@queue, $o);
1364 return ($scope_st, $scope_en);
1367 # Returns a list of subs which should be inserted before the COP
1369 my ($self, $op, $out_seq) = @_;
1370 my $seq = $op->cop_seq;
1371 # If we have nephews, then our sequence number indicates
1372 # the cop_seq of the end of some sort of scope.
1373 if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
1374 and my $nseq = $self->find_scope_st($op->sibling) ) {
1377 $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1378 return $self->seq_subs($seq);
1382 my ($self, $seq) = @_;
1384 #push @text, "# ($seq)\n";
1386 return "" if !defined $seq;
1387 while (scalar(@{$self->{'subs_todo'}})
1388 and $seq > $self->{'subs_todo'}[0][0]) {
1389 push @text, $self->next_todo;
1394 # Notice how subs and formats are inserted between statements here;
1395 # also $[ assignments and pragmas.
1399 $self->{'curcop'} = $op;
1401 push @text, $self->cop_subs($op);
1402 push @text, $op->label . ": " if $op->label;
1403 my $stash = $op->stashpv;
1404 if ($stash ne $self->{'curstash'}) {
1405 push @text, "package $stash;\n";
1406 $self->{'curstash'} = $stash;
1409 if ($self->{'arybase'} != $op->arybase) {
1410 push @text, '$[ = '. $op->arybase .";\n";
1411 $self->{'arybase'} = $op->arybase;
1414 my $warnings = $op->warnings;
1416 if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
1417 $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
1419 elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
1420 $warning_bits = $warnings::NONE;
1422 elsif ($warnings->isa("B::SPECIAL")) {
1423 $warning_bits = undef;
1426 $warning_bits = $warnings->PV & WARN_MASK;
1429 if (defined ($warning_bits) and
1430 !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
1431 push @text, declare_warnings($self->{'warnings'}, $warning_bits);
1432 $self->{'warnings'} = $warning_bits;
1435 if ($self->{'hints'} != $op->hints) {
1436 push @text, declare_hints($self->{'hints'}, $op->hints);
1437 $self->{'hints'} = $op->hints;
1440 # hack to check that the hint hash hasn't changed
1442 "@{[sort %{$self->{'hinthash'} || {}}]}"
1443 ne "@{[sort %{$op->hints_hash->HASH || {}}]}") {
1444 push @text, declare_hinthash($self->{'hinthash'}, $op->hints_hash->HASH, $self->{indent_size});
1445 $self->{'hinthash'} = $op->hints_hash->HASH;
1448 # This should go after of any branches that add statements, to
1449 # increase the chances that it refers to the same line it did in
1450 # the original program.
1451 if ($self->{'linenums'}) {
1452 push @text, "\f#line " . $op->line .
1453 ' "' . $op->file, qq'"\n';
1456 return join("", @text);
1459 sub declare_warnings {
1460 my ($from, $to) = @_;
1461 if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
1462 return "use warnings;\n";
1464 elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
1465 return "no warnings;\n";
1467 return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n";
1471 my ($from, $to) = @_;
1472 my $use = $to & ~$from;
1473 my $no = $from & ~$to;
1475 for my $pragma (hint_pragmas($use)) {
1476 $decls .= "use $pragma;\n";
1478 for my $pragma (hint_pragmas($no)) {
1479 $decls .= "no $pragma;\n";
1484 # Internal implementation hints that the core sets automatically, so don't need
1485 # (or want) to be passed back to the user
1486 my %ignored_hints = (
1492 sub declare_hinthash {
1493 my ($from, $to, $indent) = @_;
1495 for my $key (keys %$to) {
1496 next if $ignored_hints{$key};
1497 if (!defined $from->{$key} or $from->{$key} ne $to->{$key}) {
1498 push @decls, qq(\$^H{'$key'} = q($to->{$key}););
1501 for my $key (keys %$from) {
1502 next if $ignored_hints{$key};
1503 if (!exists $to->{$key}) {
1504 push @decls, qq(delete \$^H{'$key'};);
1507 @decls or return '';
1508 return join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n";
1514 push @pragmas, "integer" if $bits & 0x1;
1515 push @pragmas, "strict 'refs'" if $bits & 0x2;
1516 push @pragmas, "bytes" if $bits & 0x8;
1520 sub pp_dbstate { pp_nextstate(@_) }
1521 sub pp_setstate { pp_nextstate(@_) }
1523 sub pp_unstack { return "" } # see also leaveloop
1527 my($op, $cx, $name) = @_;
1533 my($op, $cx, $name) = @_;
1541 sub pp_wantarray { baseop(@_, "wantarray") }
1542 sub pp_fork { baseop(@_, "fork") }
1543 sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
1544 sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
1545 sub pp_time { maybe_targmy(@_, \&baseop, "time") }
1546 sub pp_tms { baseop(@_, "times") }
1547 sub pp_ghostent { baseop(@_, "gethostent") }
1548 sub pp_gnetent { baseop(@_, "getnetent") }
1549 sub pp_gprotoent { baseop(@_, "getprotoent") }
1550 sub pp_gservent { baseop(@_, "getservent") }
1551 sub pp_ehostent { baseop(@_, "endhostent") }
1552 sub pp_enetent { baseop(@_, "endnetent") }
1553 sub pp_eprotoent { baseop(@_, "endprotoent") }
1554 sub pp_eservent { baseop(@_, "endservent") }
1555 sub pp_gpwent { baseop(@_, "getpwent") }
1556 sub pp_spwent { baseop(@_, "setpwent") }
1557 sub pp_epwent { baseop(@_, "endpwent") }
1558 sub pp_ggrent { baseop(@_, "getgrent") }
1559 sub pp_sgrent { baseop(@_, "setgrent") }
1560 sub pp_egrent { baseop(@_, "endgrent") }
1561 sub pp_getlogin { baseop(@_, "getlogin") }
1563 sub POSTFIX () { 1 }
1565 # I couldn't think of a good short name, but this is the category of
1566 # symbolic unary operators with interesting precedence
1570 my($op, $cx, $name, $prec, $flags) = (@_, 0);
1571 my $kid = $op->first;
1572 $kid = $self->deparse($kid, $prec);
1573 return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
1577 sub pp_preinc { pfixop(@_, "++", 23) }
1578 sub pp_predec { pfixop(@_, "--", 23) }
1579 sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1580 sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1581 sub pp_i_preinc { pfixop(@_, "++", 23) }
1582 sub pp_i_predec { pfixop(@_, "--", 23) }
1583 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1584 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1585 sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
1587 sub pp_negate { maybe_targmy(@_, \&real_negate) }
1591 if ($op->first->name =~ /^(i_)?negate$/) {
1593 $self->pfixop($op, $cx, "-", 21.5);
1595 $self->pfixop($op, $cx, "-", 21);
1598 sub pp_i_negate { pp_negate(@_) }
1604 $self->pfixop($op, $cx, "not ", 4);
1606 $self->pfixop($op, $cx, "!", 21);
1612 my($op, $cx, $name) = @_;
1614 if ($op->flags & OPf_KIDS) {
1616 # this deals with 'boolkeys' right now
1617 return $self->deparse($kid,$cx);
1620 my $builtinname = $name;
1621 $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name";
1622 if (defined prototype($builtinname)
1623 && prototype($builtinname) =~ /^;?\*/
1624 && $kid->name eq "rv2gv") {
1628 return $self->maybe_parens_unop($name, $kid, $cx);
1630 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1634 sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
1635 sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
1636 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
1637 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
1638 sub pp_defined { unop(@_, "defined") }
1639 sub pp_undef { unop(@_, "undef") }
1640 sub pp_study { unop(@_, "study") }
1641 sub pp_ref { unop(@_, "ref") }
1642 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
1644 sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
1645 sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
1646 sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
1647 sub pp_srand { unop(@_, "srand") }
1648 sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
1649 sub pp_log { maybe_targmy(@_, \&unop, "log") }
1650 sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
1651 sub pp_int { maybe_targmy(@_, \&unop, "int") }
1652 sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
1653 sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
1654 sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
1656 sub pp_length { maybe_targmy(@_, \&unop, "length") }
1657 sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
1658 sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
1660 sub pp_each { unop(@_, "each") }
1661 sub pp_values { unop(@_, "values") }
1662 sub pp_keys { unop(@_, "keys") }
1664 # no name because its an optimisation op that has no keyword
1667 sub pp_aeach { unop(@_, "each") }
1668 sub pp_avalues { unop(@_, "values") }
1669 sub pp_akeys { unop(@_, "keys") }
1670 sub pp_pop { unop(@_, "pop") }
1671 sub pp_shift { unop(@_, "shift") }
1673 sub pp_caller { unop(@_, "caller") }
1674 sub pp_reset { unop(@_, "reset") }
1675 sub pp_exit { unop(@_, "exit") }
1676 sub pp_prototype { unop(@_, "prototype") }
1678 sub pp_close { unop(@_, "close") }
1679 sub pp_fileno { unop(@_, "fileno") }
1680 sub pp_umask { unop(@_, "umask") }
1681 sub pp_untie { unop(@_, "untie") }
1682 sub pp_tied { unop(@_, "tied") }
1683 sub pp_dbmclose { unop(@_, "dbmclose") }
1684 sub pp_getc { unop(@_, "getc") }
1685 sub pp_eof { unop(@_, "eof") }
1686 sub pp_tell { unop(@_, "tell") }
1687 sub pp_getsockname { unop(@_, "getsockname") }
1688 sub pp_getpeername { unop(@_, "getpeername") }
1690 sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
1691 sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
1692 sub pp_readlink { unop(@_, "readlink") }
1693 sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
1694 sub pp_readdir { unop(@_, "readdir") }
1695 sub pp_telldir { unop(@_, "telldir") }
1696 sub pp_rewinddir { unop(@_, "rewinddir") }
1697 sub pp_closedir { unop(@_, "closedir") }
1698 sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
1699 sub pp_localtime { unop(@_, "localtime") }
1700 sub pp_gmtime { unop(@_, "gmtime") }
1701 sub pp_alarm { unop(@_, "alarm") }
1702 sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
1704 sub pp_dofile { unop(@_, "do") }
1705 sub pp_entereval { unop(@_, "eval") }
1707 sub pp_ghbyname { unop(@_, "gethostbyname") }
1708 sub pp_gnbyname { unop(@_, "getnetbyname") }
1709 sub pp_gpbyname { unop(@_, "getprotobyname") }
1710 sub pp_shostent { unop(@_, "sethostent") }
1711 sub pp_snetent { unop(@_, "setnetent") }
1712 sub pp_sprotoent { unop(@_, "setprotoent") }
1713 sub pp_sservent { unop(@_, "setservent") }
1714 sub pp_gpwnam { unop(@_, "getpwnam") }
1715 sub pp_gpwuid { unop(@_, "getpwuid") }
1716 sub pp_ggrnam { unop(@_, "getgrnam") }
1717 sub pp_ggrgid { unop(@_, "getgrgid") }
1719 sub pp_lock { unop(@_, "lock") }
1721 sub pp_continue { unop(@_, "continue"); }
1723 my ($self, $op) = @_;
1724 return "" if $op->flags & OPf_SPECIAL;
1730 my($op, $cx, $givwhen) = @_;
1732 my $enterop = $op->first;
1734 if ($enterop->flags & OPf_SPECIAL) {
1736 $block = $self->deparse($enterop->first, 0);
1739 my $cond = $enterop->first;
1740 my $cond_str = $self->deparse($cond, 1);
1741 $head = "$givwhen ($cond_str)";
1742 $block = $self->deparse($cond->sibling, 0);
1750 sub pp_leavegiven { givwhen(@_, "given"); }
1751 sub pp_leavewhen { givwhen(@_, "when"); }
1757 if ($op->private & OPpEXISTS_SUB) {
1758 # Checking for the existence of a subroutine
1759 return $self->maybe_parens_func("exists",
1760 $self->pp_rv2cv($op->first, 16), $cx, 16);
1762 if ($op->flags & OPf_SPECIAL) {
1763 # Array element, not hash element
1764 return $self->maybe_parens_func("exists",
1765 $self->pp_aelem($op->first, 16), $cx, 16);
1767 return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
1775 if ($op->private & OPpSLICE) {
1776 if ($op->flags & OPf_SPECIAL) {
1777 # Deleting from an array, not a hash
1778 return $self->maybe_parens_func("delete",
1779 $self->pp_aslice($op->first, 16),
1782 return $self->maybe_parens_func("delete",
1783 $self->pp_hslice($op->first, 16),
1786 if ($op->flags & OPf_SPECIAL) {
1787 # Deleting from an array, not a hash
1788 return $self->maybe_parens_func("delete",
1789 $self->pp_aelem($op->first, 16),
1792 return $self->maybe_parens_func("delete",
1793 $self->pp_helem($op->first, 16),
1801 my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
1802 if (class($op) eq "UNOP" and $op->first->name eq "const"
1803 and $op->first->private & OPpCONST_BARE)
1805 my $name = $self->const_sv($op->first)->PV;
1808 return "$opname $name";
1810 $self->unop($op, $cx, $opname);
1817 my $kid = $op->first;
1818 if (not null $kid->sibling) {
1819 # XXX Was a here-doc
1820 return $self->dquote($op);
1822 $self->unop(@_, "scalar");
1829 return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
1832 sub anon_hash_or_list {
1836 my($pre, $post) = @{{"anonlist" => ["[","]"],
1837 "anonhash" => ["{","}"]}->{$op->name}};
1839 $op = $op->first->sibling; # skip pushmark
1840 for (; !null($op); $op = $op->sibling) {
1841 $expr = $self->deparse($op, 6);
1844 if ($pre eq "{" and $cx < 1) {
1845 # Disambiguate that it's not a block
1848 return $pre . join(", ", @exprs) . $post;
1854 if ($op->flags & OPf_SPECIAL) {
1855 return $self->anon_hash_or_list($op, $cx);
1857 warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
1861 *pp_anonhash = \&pp_anonlist;
1866 my $kid = $op->first;
1867 if ($kid->name eq "null") {
1869 if (!null($kid->sibling) and
1870 $kid->sibling->name eq "anoncode") {
1871 return $self->e_anoncode({ code => $self->padval($kid->sibling->targ) });
1872 } elsif ($kid->name eq "pushmark") {
1873 my $sib_name = $kid->sibling->name;
1874 if ($sib_name =~ /^(pad|rv2)[ah]v$/
1875 and not $kid->sibling->flags & OPf_REF)
1877 # The @a in \(@a) isn't in ref context, but only when the
1879 return "\\(" . $self->pp_list($op->first) . ")";
1880 } elsif ($sib_name eq 'entersub') {
1881 my $text = $self->deparse($kid->sibling, 1);
1882 # Always show parens for \(&func()), but only with -p otherwise
1883 $text = "($text)" if $self->{'parens'}
1884 or $kid->sibling->private & OPpENTERSUB_AMPER;
1889 $self->pfixop($op, $cx, "\\", 20);
1893 my ($self, $info) = @_;
1894 my $text = $self->deparse_sub($info->{code});
1895 return "sub " . $text;
1898 sub pp_srefgen { pp_refgen(@_) }
1903 my $kid = $op->first;
1904 $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
1905 return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
1906 return $self->unop($op, $cx, "readline");
1912 return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
1915 # Unary operators that can occur as pseudo-listops inside double quotes
1918 my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
1920 if ($op->flags & OPf_KIDS) {
1922 # If there's more than one kid, the first is an ex-pushmark.
1923 $kid = $kid->sibling if not null $kid->sibling;
1924 return $self->maybe_parens_unop($name, $kid, $cx);
1926 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1930 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
1931 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
1932 sub pp_uc { dq_unop(@_, "uc") }
1933 sub pp_lc { dq_unop(@_, "lc") }
1934 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
1938 my ($op, $cx, $name) = @_;
1939 if (class($op) eq "PVOP") {
1940 return "$name " . $op->pv;
1941 } elsif (class($op) eq "OP") {
1943 } elsif (class($op) eq "UNOP") {
1944 # Note -- loop exits are actually exempt from the
1945 # looks-like-a-func rule, but a few extra parens won't hurt
1946 return $self->maybe_parens_unop($name, $op->first, $cx);
1950 sub pp_last { loopex(@_, "last") }
1951 sub pp_next { loopex(@_, "next") }
1952 sub pp_redo { loopex(@_, "redo") }
1953 sub pp_goto { loopex(@_, "goto") }
1954 sub pp_dump { loopex(@_, "dump") }
1958 my($op, $cx, $name) = @_;
1959 if (class($op) eq "UNOP") {
1960 # Genuine `-X' filetests are exempt from the LLAFR, but not
1961 # l?stat(); for the sake of clarity, give'em all parens
1962 return $self->maybe_parens_unop($name, $op->first, $cx);
1963 } elsif (class($op) =~ /^(SV|PAD)OP$/) {
1964 return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
1965 } else { # I don't think baseop filetests ever survive ck_ftst, but...
1970 sub pp_lstat { ftst(@_, "lstat") }
1971 sub pp_stat { ftst(@_, "stat") }
1972 sub pp_ftrread { ftst(@_, "-R") }
1973 sub pp_ftrwrite { ftst(@_, "-W") }
1974 sub pp_ftrexec { ftst(@_, "-X") }
1975 sub pp_fteread { ftst(@_, "-r") }
1976 sub pp_ftewrite { ftst(@_, "-w") }
1977 sub pp_fteexec { ftst(@_, "-x") }
1978 sub pp_ftis { ftst(@_, "-e") }
1979 sub pp_fteowned { ftst(@_, "-O") }
1980 sub pp_ftrowned { ftst(@_, "-o") }
1981 sub pp_ftzero { ftst(@_, "-z") }
1982 sub pp_ftsize { ftst(@_, "-s") }
1983 sub pp_ftmtime { ftst(@_, "-M") }
1984 sub pp_ftatime { ftst(@_, "-A") }
1985 sub pp_ftctime { ftst(@_, "-C") }
1986 sub pp_ftsock { ftst(@_, "-S") }
1987 sub pp_ftchr { ftst(@_, "-c") }
1988 sub pp_ftblk { ftst(@_, "-b") }
1989 sub pp_ftfile { ftst(@_, "-f") }
1990 sub pp_ftdir { ftst(@_, "-d") }
1991 sub pp_ftpipe { ftst(@_, "-p") }
1992 sub pp_ftlink { ftst(@_, "-l") }
1993 sub pp_ftsuid { ftst(@_, "-u") }
1994 sub pp_ftsgid { ftst(@_, "-g") }
1995 sub pp_ftsvtx { ftst(@_, "-k") }
1996 sub pp_fttty { ftst(@_, "-t") }
1997 sub pp_fttext { ftst(@_, "-T") }
1998 sub pp_ftbinary { ftst(@_, "-B") }
2000 sub SWAP_CHILDREN () { 1 }
2001 sub ASSIGN () { 2 } # has OP= variant
2002 sub LIST_CONTEXT () { 4 } # Assignment is in list context
2008 my $name = $op->name;
2009 if ($name eq "concat" and $op->first->name eq "concat") {
2010 # avoid spurious `=' -- see comment in pp_concat
2013 if ($name eq "null" and class($op) eq "UNOP"
2014 and $op->first->name =~ /^(and|x?or)$/
2015 and null $op->first->sibling)
2017 # Like all conditional constructs, OP_ANDs and OP_ORs are topped
2018 # with a null that's used as the common end point of the two
2019 # flows of control. For precedence purposes, ignore it.
2020 # (COND_EXPRs have these too, but we don't bother with
2021 # their associativity).
2022 return assoc_class($op->first);
2024 return $name . ($op->flags & OPf_STACKED ? "=" : "");
2027 # Left associative operators, like `+', for which
2028 # $a + $b + $c is equivalent to ($a + $b) + $c
2031 %left = ('multiply' => 19, 'i_multiply' => 19,
2032 'divide' => 19, 'i_divide' => 19,
2033 'modulo' => 19, 'i_modulo' => 19,
2035 'add' => 18, 'i_add' => 18,
2036 'subtract' => 18, 'i_subtract' => 18,
2038 'left_shift' => 17, 'right_shift' => 17,
2040 'bit_or' => 12, 'bit_xor' => 12,
2042 'or' => 2, 'xor' => 2,
2046 sub deparse_binop_left {
2048 my($op, $left, $prec) = @_;
2049 if ($left{assoc_class($op)} && $left{assoc_class($left)}
2050 and $left{assoc_class($op)} == $left{assoc_class($left)})
2052 return $self->deparse($left, $prec - .00001);
2054 return $self->deparse($left, $prec);
2058 # Right associative operators, like `=', for which
2059 # $a = $b = $c is equivalent to $a = ($b = $c)
2062 %right = ('pow' => 22,
2063 'sassign=' => 7, 'aassign=' => 7,
2064 'multiply=' => 7, 'i_multiply=' => 7,
2065 'divide=' => 7, 'i_divide=' => 7,
2066 'modulo=' => 7, 'i_modulo=' => 7,
2068 'add=' => 7, 'i_add=' => 7,
2069 'subtract=' => 7, 'i_subtract=' => 7,
2071 'left_shift=' => 7, 'right_shift=' => 7,
2073 'bit_or=' => 7, 'bit_xor=' => 7,
2079 sub deparse_binop_right {
2081 my($op, $right, $prec) = @_;
2082 if ($right{assoc_class($op)} && $right{assoc_class($right)}
2083 and $right{assoc_class($op)} == $right{assoc_class($right)})
2085 return $self->deparse($right, $prec - .00001);
2087 return $self->deparse($right, $prec);
2093 my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
2094 my $left = $op->first;
2095 my $right = $op->last;
2097 if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
2101 if ($flags & SWAP_CHILDREN) {
2102 ($left, $right) = ($right, $left);
2104 $left = $self->deparse_binop_left($op, $left, $prec);
2105 $left = "($left)" if $flags & LIST_CONTEXT
2106 && $left !~ /^(my|our|local|)[\@\(]/;
2107 $right = $self->deparse_binop_right($op, $right, $prec);
2108 return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
2111 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2112 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2113 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
2114 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2115 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2116 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2117 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2118 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
2119 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2120 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2121 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
2123 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
2124 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
2125 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
2126 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
2127 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
2129 sub pp_eq { binop(@_, "==", 14) }
2130 sub pp_ne { binop(@_, "!=", 14) }
2131 sub pp_lt { binop(@_, "<", 15) }
2132 sub pp_gt { binop(@_, ">", 15) }
2133 sub pp_ge { binop(@_, ">=", 15) }
2134 sub pp_le { binop(@_, "<=", 15) }
2135 sub pp_ncmp { binop(@_, "<=>", 14) }
2136 sub pp_i_eq { binop(@_, "==", 14) }
2137 sub pp_i_ne { binop(@_, "!=", 14) }
2138 sub pp_i_lt { binop(@_, "<", 15) }
2139 sub pp_i_gt { binop(@_, ">", 15) }
2140 sub pp_i_ge { binop(@_, ">=", 15) }
2141 sub pp_i_le { binop(@_, "<=", 15) }
2142 sub pp_i_ncmp { binop(@_, "<=>", 14) }
2144 sub pp_seq { binop(@_, "eq", 14) }
2145 sub pp_sne { binop(@_, "ne", 14) }
2146 sub pp_slt { binop(@_, "lt", 15) }
2147 sub pp_sgt { binop(@_, "gt", 15) }
2148 sub pp_sge { binop(@_, "ge", 15) }
2149 sub pp_sle { binop(@_, "le", 15) }
2150 sub pp_scmp { binop(@_, "cmp", 14) }
2152 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
2153 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
2156 my ($self, $op, $cx) = @_;
2157 if ($op->flags & OPf_SPECIAL) {
2158 return $self->deparse($op->last, $cx);
2161 binop(@_, "~~", 14);
2165 # `.' is special because concats-of-concats are optimized to save copying
2166 # by making all but the first concat stacked. The effect is as if the
2167 # programmer had written `($a . $b) .= $c', except legal.
2168 sub pp_concat { maybe_targmy(@_, \&real_concat) }
2172 my $left = $op->first;
2173 my $right = $op->last;
2176 if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
2180 $left = $self->deparse_binop_left($op, $left, $prec);
2181 $right = $self->deparse_binop_right($op, $right, $prec);
2182 return $self->maybe_parens("$left .$eq $right", $cx, $prec);
2185 # `x' is weird when the left arg is a list
2189 my $left = $op->first;
2190 my $right = $op->last;
2193 if ($op->flags & OPf_STACKED) {
2197 if (null($right)) { # list repeat; count is inside left-side ex-list
2198 my $kid = $left->first->sibling; # skip pushmark
2200 for (; !null($kid->sibling); $kid = $kid->sibling) {
2201 push @exprs, $self->deparse($kid, 6);
2204 $left = "(" . join(", ", @exprs). ")";
2206 $left = $self->deparse_binop_left($op, $left, $prec);
2208 $right = $self->deparse_binop_right($op, $right, $prec);
2209 return $self->maybe_parens("$left x$eq $right", $cx, $prec);
2214 my ($op, $cx, $type) = @_;
2215 my $left = $op->first;
2216 my $right = $left->sibling;
2217 $left = $self->deparse($left, 9);
2218 $right = $self->deparse($right, 9);
2219 return $self->maybe_parens("$left $type $right", $cx, 9);
2225 my $flip = $op->first;
2226 my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
2227 return $self->range($flip->first, $cx, $type);
2230 # one-line while/until is handled in pp_leave
2234 my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
2235 my $left = $op->first;
2236 my $right = $op->first->sibling;
2237 if ($cx < 1 and is_scope($right) and $blockname
2238 and $self->{'expand'} < 7)
2240 $left = $self->deparse($left, 1);
2241 $right = $self->deparse($right, 0);
2242 return "$blockname ($left) {\n\t$right\n\b}\cK";
2243 } elsif ($cx < 1 and $blockname and not $self->{'parens'}
2244 and $self->{'expand'} < 7) { # $b if $a
2245 $right = $self->deparse($right, 1);
2246 $left = $self->deparse($left, 1);
2247 return "$right $blockname $left";
2248 } elsif ($cx > $lowprec and $highop) { # $a && $b
2249 $left = $self->deparse_binop_left($op, $left, $highprec);
2250 $right = $self->deparse_binop_right($op, $right, $highprec);
2251 return $self->maybe_parens("$left $highop $right", $cx, $highprec);
2252 } else { # $a and $b
2253 $left = $self->deparse_binop_left($op, $left, $lowprec);
2254 $right = $self->deparse_binop_right($op, $right, $lowprec);
2255 return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
2259 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
2260 sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
2261 sub pp_dor { logop(@_, "//", 10) }
2263 # xor is syntactically a logop, but it's really a binop (contrary to
2264 # old versions of opcode.pl). Syntax is what matters here.
2265 sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
2269 my ($op, $cx, $opname) = @_;
2270 my $left = $op->first;
2271 my $right = $op->first->sibling->first; # skip sassign
2272 $left = $self->deparse($left, 7);
2273 $right = $self->deparse($right, 7);
2274 return $self->maybe_parens("$left $opname $right", $cx, 7);
2277 sub pp_andassign { logassignop(@_, "&&=") }
2278 sub pp_orassign { logassignop(@_, "||=") }
2279 sub pp_dorassign { logassignop(@_, "//=") }
2283 my($op, $cx, $name) = @_;
2285 my $parens = ($cx >= 5) || $self->{'parens'};
2286 my $kid = $op->first->sibling;
2287 return $name if null $kid;
2289 $name = "socketpair" if $name eq "sockpair";
2290 my $proto = prototype("CORE::$name");
2292 && $proto =~ /^;?\*/
2293 && $kid->name eq "rv2gv") {
2294 $first = $self->deparse($kid->first, 6);
2297 $first = $self->deparse($kid, 6);
2299 if ($name eq "chmod" && $first =~ /^\d+$/) {
2300 $first = sprintf("%#o", $first);
2302 $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
2303 push @exprs, $first;
2304 $kid = $kid->sibling;
2305 if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") {
2306 push @exprs, $self->deparse($kid->first, 6);
2307 $kid = $kid->sibling;
2309 for (; !null($kid); $kid = $kid->sibling) {
2310 push @exprs, $self->deparse($kid, 6);
2312 if ($name eq "reverse" && ($op->private & OPpREVERSE_INPLACE)) {
2313 return "$exprs[0] = $name" . ($parens ? "($exprs[0])" : " $exprs[0]");
2316 return "$name(" . join(", ", @exprs) . ")";
2318 return "$name " . join(", ", @exprs);
2322 sub pp_bless { listop(@_, "bless") }
2323 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
2324 sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
2325 sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
2326 sub pp_index { maybe_targmy(@_, \&listop, "index") }
2327 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
2328 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
2329 sub pp_formline { listop(@_, "formline") } # see also deparse_format
2330 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
2331 sub pp_unpack { listop(@_, "unpack") }
2332 sub pp_pack { listop(@_, "pack") }
2333 sub pp_join { maybe_targmy(@_, \&listop, "join") }
2334 sub pp_splice { listop(@_, "splice") }
2335 sub pp_push { maybe_targmy(@_, \&listop, "push") }
2336 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
2337 sub pp_reverse { listop(@_, "reverse") }
2338 sub pp_warn { listop(@_, "warn") }
2339 sub pp_die { listop(@_, "die") }
2340 # Actually, return is exempt from the LLAFR (see examples in this very
2341 # module!), but for consistency's sake, ignore that fact
2342 sub pp_return { listop(@_, "return") }
2343 sub pp_open { listop(@_, "open") }
2344 sub pp_pipe_op { listop(@_, "pipe") }
2345 sub pp_tie { listop(@_, "tie") }
2346 sub pp_binmode { listop(@_, "binmode") }
2347 sub pp_dbmopen { listop(@_, "dbmopen") }
2348 sub pp_sselect { listop(@_, "select") }
2349 sub pp_select { listop(@_, "select") }
2350 sub pp_read { listop(@_, "read") }
2351 sub pp_sysopen { listop(@_, "sysopen") }
2352 sub pp_sysseek { listop(@_, "sysseek") }
2353 sub pp_sysread { listop(@_, "sysread") }
2354 sub pp_syswrite { listop(@_, "syswrite") }
2355 sub pp_send { listop(@_, "send") }
2356 sub pp_recv { listop(@_, "recv") }
2357 sub pp_seek { listop(@_, "seek") }
2358 sub pp_fcntl { listop(@_, "fcntl") }
2359 sub pp_ioctl { listop(@_, "ioctl") }
2360 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
2361 sub pp_socket { listop(@_, "socket") }
2362 sub pp_sockpair { listop(@_, "sockpair") }
2363 sub pp_bind { listop(@_, "bind") }
2364 sub pp_connect { listop(@_, "connect") }
2365 sub pp_listen { listop(@_, "listen") }
2366 sub pp_accept { listop(@_, "accept") }
2367 sub pp_shutdown { listop(@_, "shutdown") }
2368 sub pp_gsockopt { listop(@_, "getsockopt") }
2369 sub pp_ssockopt { listop(@_, "setsockopt") }
2370 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
2371 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
2372 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
2373 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
2374 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
2375 sub pp_link { maybe_targmy(@_, \&listop, "link") }
2376 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
2377 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
2378 sub pp_open_dir { listop(@_, "opendir") }
2379 sub pp_seekdir { listop(@_, "seekdir") }
2380 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
2381 sub pp_system { maybe_targmy(@_, \&listop, "system") }
2382 sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
2383 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
2384 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
2385 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
2386 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
2387 sub pp_shmget { listop(@_, "shmget") }
2388 sub pp_shmctl { listop(@_, "shmctl") }
2389 sub pp_shmread { listop(@_, "shmread") }
2390 sub pp_shmwrite { listop(@_, "shmwrite") }
2391 sub pp_msgget { listop(@_, "msgget") }
2392 sub pp_msgctl { listop(@_, "msgctl") }
2393 sub pp_msgsnd { listop(@_, "msgsnd") }
2394 sub pp_msgrcv { listop(@_, "msgrcv") }
2395 sub pp_semget { listop(@_, "semget") }
2396 sub pp_semctl { listop(@_, "semctl") }
2397 sub pp_semop { listop(@_, "semop") }
2398 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
2399 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
2400 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
2401 sub pp_gsbyname { listop(@_, "getservbyname") }
2402 sub pp_gsbyport { listop(@_, "getservbyport") }
2403 sub pp_syscall { listop(@_, "syscall") }
2408 my $text = $self->dq($op->first->sibling); # skip pushmark
2409 if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
2410 or $text =~ /[<>]/) {
2411 return 'glob(' . single_delim('qq', '"', $text) . ')';
2413 return '<' . $text . '>';
2417 # Truncate is special because OPf_SPECIAL makes a bareword first arg
2418 # be a filehandle. This could probably be better fixed in the core
2419 # by moving the GV lookup into ck_truc.
2425 my $parens = ($cx >= 5) || $self->{'parens'};
2426 my $kid = $op->first->sibling;
2428 if ($op->flags & OPf_SPECIAL) {
2429 # $kid is an OP_CONST
2430 $fh = $self->const_sv($kid)->PV;
2432 $fh = $self->deparse($kid, 6);
2433 $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
2435 my $len = $self->deparse($kid->sibling, 6);
2437 return "truncate($fh, $len)";
2439 return "truncate $fh, $len";
2445 my($op, $cx, $name) = @_;
2447 my $kid = $op->first->sibling;
2449 if ($op->flags & OPf_STACKED) {
2451 $indir = $indir->first; # skip rv2gv
2452 if (is_scope($indir)) {
2453 $indir = "{" . $self->deparse($indir, 0) . "}";
2454 $indir = "{;}" if $indir eq "{}";
2455 } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
2456 $indir = $self->const_sv($indir)->PV;
2458 $indir = $self->deparse($indir, 24);
2460 $indir = $indir . " ";
2461 $kid = $kid->sibling;
2463 if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
2464 $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
2467 elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
2468 $indir = '{$b cmp $a} ';
2470 for (; !null($kid); $kid = $kid->sibling) {
2471 $expr = $self->deparse($kid, 6);
2475 if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
2476 $name2 = 'reverse sort';
2478 if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
2479 return "$exprs[0] = $name2 $indir $exprs[0]";
2482 my $args = $indir . join(", ", @exprs);
2483 if ($indir ne "" and $name eq "sort") {
2484 # We don't want to say "sort(f 1, 2, 3)", since perl -w will
2485 # give bareword warnings in that case. Therefore if context
2486 # requires, we'll put parens around the outside "(sort f 1, 2,
2487 # 3)". Unfortunately, we'll currently think the parens are
2488 # necessary more often that they really are, because we don't
2489 # distinguish which side of an assignment we're on.
2491 return "($name2 $args)";
2493 return "$name2 $args";
2496 return $self->maybe_parens_func($name2, $args, $cx, 5);
2501 sub pp_prtf { indirop(@_, "printf") }
2502 sub pp_print { indirop(@_, "print") }
2503 sub pp_say { indirop(@_, "say") }
2504 sub pp_sort { indirop(@_, "sort") }
2508 my($op, $cx, $name) = @_;
2510 my $kid = $op->first; # this is the (map|grep)start
2511 $kid = $kid->first->sibling; # skip a pushmark
2512 my $code = $kid->first; # skip a null
2513 if (is_scope $code) {
2514 $code = "{" . $self->deparse($code, 0) . "} ";
2516 $code = $self->deparse($code, 24) . ", ";
2518 $kid = $kid->sibling;
2519 for (; !null($kid); $kid = $kid->sibling) {
2520 $expr = $self->deparse($kid, 6);
2521 push @exprs, $expr if defined $expr;
2523 return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
2526 sub pp_mapwhile { mapop(@_, "map") }
2527 sub pp_grepwhile { mapop(@_, "grep") }
2528 sub pp_mapstart { baseop(@_, "map") }
2529 sub pp_grepstart { baseop(@_, "grep") }
2535 my $kid = $op->first->sibling; # skip pushmark
2537 my $local = "either"; # could be local(...), my(...), state(...) or our(...)
2538 for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
2539 # This assumes that no other private flags equal 128, and that
2540 # OPs that store things other than flags in their op_private,
2541 # like OP_AELEMFAST, won't be immediate children of a list.
2543 # OP_ENTERSUB can break this logic, so check for it.
2544 # I suspect that open and exit can too.
2546 if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
2547 or $lop->name eq "undef")
2548 or $lop->name eq "entersub"
2549 or $lop->name eq "exit"
2550 or $lop->name eq "open")
2552 $local = ""; # or not
2555 if ($lop->name =~ /^pad[ash]v$/) {
2556 if ($lop->private & OPpPAD_STATE) { # state()
2557 ($local = "", last) if $local =~ /^(?:local|our|my)$/;
2560 ($local = "", last) if $local =~ /^(?:local|our|state)$/;
2563 } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
2564 && $lop->private & OPpOUR_INTRO
2565 or $lop->name eq "null" && $lop->first->name eq "gvsv"
2566 && $lop->first->private & OPpOUR_INTRO) { # our()
2567 ($local = "", last) if $local =~ /^(?:my|local|state)$/;
2569 } elsif ($lop->name ne "undef"
2570 # specifically avoid the "reverse sort" optimisation,
2571 # where "reverse" is nullified
2572 && !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE)))
2575 ($local = "", last) if $local =~ /^(?:my|our|state)$/;
2579 $local = "" if $local eq "either"; # no point if it's all undefs
2580 return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
2581 for (; !null($kid); $kid = $kid->sibling) {
2583 if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
2588 $self->{'avoid_local'}{$$lop}++;
2589 $expr = $self->deparse($kid, 6);
2590 delete $self->{'avoid_local'}{$$lop};
2592 $expr = $self->deparse($kid, 6);
2597 return "$local(" . join(", ", @exprs) . ")";
2599 return $self->maybe_parens( join(", ", @exprs), $cx, 6);
2603 sub is_ifelse_cont {
2605 return ($op->name eq "null" and class($op) eq "UNOP"
2606 and $op->first->name =~ /^(and|cond_expr)$/
2607 and is_scope($op->first->first->sibling));
2613 my $cond = $op->first;
2614 my $true = $cond->sibling;
2615 my $false = $true->sibling;
2616 my $cuddle = $self->{'cuddle'};
2617 unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
2618 (is_scope($false) || is_ifelse_cont($false))
2619 and $self->{'expand'} < 7) {
2620 $cond = $self->deparse($cond, 8);
2621 $true = $self->deparse($true, 6);
2622 $false = $self->deparse($false, 8);
2623 return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
2626 $cond = $self->deparse($cond, 1);
2627 $true = $self->deparse($true, 0);
2628 my $head = "if ($cond) {\n\t$true\n\b}";
2630 while (!null($false) and is_ifelse_cont($false)) {
2631 my $newop = $false->first;
2632 my $newcond = $newop->first;
2633 my $newtrue = $newcond->sibling;
2634 $false = $newtrue->sibling; # last in chain is OP_AND => no else
2635 if ($newcond->name eq "lineseq")
2637 # lineseq to ensure correct line numbers in elsif()
2638 # Bug #37302 fixed by change #33710.
2639 $newcond = $newcond->first->sibling;
2641 $newcond = $self->deparse($newcond, 1);
2642 $newtrue = $self->deparse($newtrue, 0);
2643 push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
2645 if (!null($false)) {
2646 $false = $cuddle . "else {\n\t" .
2647 $self->deparse($false, 0) . "\n\b}\cK";
2651 return $head . join($cuddle, "", @elsifs) . $false;
2655 my ($self, $op, $cx) = @_;
2656 my $cond = $op->first;
2657 my $true = $cond->sibling;
2659 return $self->deparse($true, $cx);
2664 my($op, $cx, $init) = @_;
2665 my $enter = $op->first;
2666 my $kid = $enter->sibling;
2667 local(@$self{qw'curstash warnings hints hinthash'})
2668 = @$self{qw'curstash warnings hints hinthash'};
2673 if ($kid->name eq "lineseq") { # bare or infinite loop
2674 if ($kid->last->name eq "unstack") { # infinite
2675 $head = "while (1) "; # Can't use for(;;) if there's a continue
2681 } elsif ($enter->name eq "enteriter") { # foreach
2682 my $ary = $enter->first->sibling; # first was pushmark
2683 my $var = $ary->sibling;
2684 if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
2685 # "reverse" was optimised away
2686 $ary = listop($self, $ary->first->sibling, 1, 'reverse');
2687 } elsif ($enter->flags & OPf_STACKED
2688 and not null $ary->first->sibling->sibling)
2690 $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
2691 $self->deparse($ary->first->sibling->sibling, 9);
2693 $ary = $self->deparse($ary, 1);
2696 if ($enter->flags & OPf_SPECIAL) { # thread special var
2697 $var = $self->pp_threadsv($enter, 1);
2698 } else { # regular my() variable
2699 $var = $self->pp_padsv($enter, 1);
2701 } elsif ($var->name eq "rv2gv") {
2702 $var = $self->pp_rv2sv($var, 1);
2703 if ($enter->private & OPpOUR_INTRO) {
2704 # our declarations don't have package names
2705 $var =~ s/^(.).*::/$1/;
2708 } elsif ($var->name eq "gv") {
2709 $var = "\$" . $self->deparse($var, 1);
2711 $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
2712 if (!is_state $body->first and $body->first->name ne "stub") {
2713 confess unless $var eq '$_';
2714 $body = $body->first;
2715 return $self->deparse($body, 2) . " foreach ($ary)";
2717 $head = "foreach $var ($ary) ";
2718 } elsif ($kid->name eq "null") { # while/until
2720 my $name = {"and" => "while", "or" => "until"}->{$kid->name};
2721 $cond = $self->deparse($kid->first, 1);
2722 $head = "$name ($cond) ";
2723 $body = $kid->first->sibling;
2724 } elsif ($kid->name eq "stub") { # bare and empty
2725 return "{;}"; # {} could be a hashref
2727 # If there isn't a continue block, then the next pointer for the loop
2728 # will point to the unstack, which is kid's last child, except
2729 # in a bare loop, when it will point to the leaveloop. When neither of
2730 # these conditions hold, then the second-to-last child is the continue
2731 # block (or the last in a bare loop).
2732 my $cont_start = $enter->nextop;
2734 if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
2736 $cont = $body->last;
2738 $cont = $body->first;
2739 while (!null($cont->sibling->sibling)) {
2740 $cont = $cont->sibling;
2743 my $state = $body->first;
2744 my $cuddle = $self->{'cuddle'};
2746 for (; $$state != $$cont; $state = $state->sibling) {
2747 push @states, $state;
2749 $body = $self->lineseq(undef, @states);
2750 if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
2751 $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
2754 $cont = $cuddle . "continue {\n\t" .
2755 $self->deparse($cont, 0) . "\n\b}\cK";
2758 return "" if !defined $body;
2760 $head = "for ($init; $cond;) ";
2763 $body = $self->deparse($body, 0);
2765 $body =~ s/;?$/;\n/;
2767 return $head . "{\n\t" . $body . "\b}" . $cont;
2770 sub pp_leaveloop { shift->loop_common(@_, "") }
2775 my $init = $self->deparse($op, 1);
2776 return $self->loop_common($op->sibling->first->sibling, $cx, $init);
2781 return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
2784 BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
2785 BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
2786 BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
2787 BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
2792 if (class($op) eq "OP") {
2794 return $self->{'ex_const'} if $op->targ == OP_CONST;
2795 } elsif ($op->first->name eq "pushmark") {
2796 return $self->pp_list($op, $cx);
2797 } elsif ($op->first->name eq "enter") {
2798 return $self->pp_leave($op, $cx);
2799 } elsif ($op->first->name eq "leave") {
2800 return $self->pp_leave($op->first, $cx);
2801 } elsif ($op->first->name eq "scope") {
2802 return $self->pp_scope($op->first, $cx);
2803 } elsif ($op->targ == OP_STRINGIFY) {
2804 return $self->dquote($op, $cx);
2805 } elsif (!null($op->first->sibling) and
2806 $op->first->sibling->name eq "readline" and
2807 $op->first->sibling->flags & OPf_STACKED) {
2808 return $self->maybe_parens($self->deparse($op->first, 7) . " = "
2809 . $self->deparse($op->first->sibling, 7),
2811 } elsif (!null($op->first->sibling) and
2812 $op->first->sibling->name eq "trans" and
2813 $op->first->sibling->flags & OPf_STACKED) {
2814 return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
2815 . $self->deparse($op->first->sibling, 20),
2817 } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
2818 return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2819 } elsif (!null($op->first->sibling) and
2820 $op->first->sibling->name eq "null" and
2821 class($op->first->sibling) eq "UNOP" and
2822 $op->first->sibling->first->flags & OPf_STACKED and
2823 $op->first->sibling->first->name eq "rcatline") {
2824 return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2825 . $self->deparse($op->first->sibling, 18),
2828 return $self->deparse($op->first, $cx);
2835 return $self->padname_sv($targ)->PVX;
2841 return substr($self->padname($op->targ), 1); # skip $/@/%
2847 return $self->maybe_my($op, $cx, $self->padname($op->targ));
2850 sub pp_padav { pp_padsv(@_) }
2851 sub pp_padhv { pp_padsv(@_) }
2856 @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
2857 "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
2858 "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
2865 return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
2871 if (class($op) eq "PADOP") {
2872 return $self->padval($op->padix);
2873 } else { # class($op) eq "SVOP"
2881 my $gv = $self->gv_or_padgv($op);
2882 return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2883 $self->gv_name($gv)));
2889 my $gv = $self->gv_or_padgv($op);
2890 return $self->gv_name($gv);
2897 if ($op->flags & OPf_SPECIAL) { # optimised PADAV
2898 $name = $self->padname($op->targ);
2902 my $gv = $self->gv_or_padgv($op);
2903 $name = $self->gv_name($gv);
2904 $name = $self->{'curstash'}."::$name"
2905 if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2906 $name = '$' . $name;
2909 return $name . "[" . ($op->private + $self->{'arybase'}) . "]";
2914 my($op, $cx, $type) = @_;
2916 if (class($op) eq 'NULL' || !$op->can("first")) {
2917 carp("Unexpected op in pp_rv2x");
2920 my $kid = $op->first;
2921 if ($kid->name eq "gv") {
2922 return $self->stash_variable($type, $self->deparse($kid, 0));
2923 } elsif (is_scalar $kid) {
2924 my $str = $self->deparse($kid, 0);
2925 if ($str =~ /^\$([^\w\d])\z/) {
2926 # "$$+" isn't a legal way to write the scalar dereference
2927 # of $+, since the lexer can't tell you aren't trying to
2928 # do something like "$$ + 1" to get one more than your
2929 # PID. Either "${$+}" or "$${+}" are workable
2930 # disambiguations, but if the programmer did the former,
2931 # they'd be in the "else" clause below rather than here.
2932 # It's not clear if this should somehow be unified with
2933 # the code in dq and re_dq that also adds lexer
2934 # disambiguation braces.
2935 $str = '$' . "{$1}"; #'
2937 return $type . $str;
2939 return $type . "{" . $self->deparse($kid, 0) . "}";
2943 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2944 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2945 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2951 if ($op->first->name eq "padav") {
2952 return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2954 return $self->maybe_local($op, $cx,
2955 $self->rv2x($op->first, $cx, '$#'));
2959 # skip down to the old, ex-rv2cv
2961 my ($self, $op, $cx) = @_;
2962 if (!null($op->first) && $op->first->name eq 'null' &&
2963 $op->first->targ eq OP_LIST)
2965 return $self->rv2x($op->first->first->sibling, $cx, "&")
2968 return $self->rv2x($op, $cx, "")
2974 my($cx, @list) = @_;
2975 my @a = map $self->const($_, 6), @list;
2980 } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
2981 # collapse (-1,0,1,2) into (-1..2)
2982 my ($s, $e) = @a[0,-1];
2984 return $self->maybe_parens("$s..$e", $cx, 9)
2985 unless grep $i++ != $_, @a;
2987 return $self->maybe_parens(join(", ", @a), $cx, 6);
2993 my $kid = $op->first;
2994 if ($kid->name eq "const") { # constant list
2995 my $av = $self->const_sv($kid);
2996 return $self->list_const($cx, $av->ARRAY);
2998 return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
3002 sub is_subscriptable {
3004 if ($op->name =~ /^[ahg]elem/) {
3006 } elsif ($op->name eq "entersub") {
3007 my $kid = $op->first;
3008 return 0 unless null $kid->sibling;
3010 $kid = $kid->sibling until null $kid->sibling;
3011 return 0 if is_scope($kid);
3013 return 0 if $kid->name eq "gv";
3014 return 0 if is_scalar($kid);
3015 return is_subscriptable($kid);
3021 sub elem_or_slice_array_name
3024 my ($array, $left, $padname, $allow_arrow) = @_;
3026 if ($array->name eq $padname) {
3027 return $self->padany($array);
3028 } elsif (is_scope($array)) { # ${expr}[0]
3029 return "{" . $self->deparse($array, 0) . "}";
3030 } elsif ($array->name eq "gv") {
3031 $array = $self->gv_name($self->gv_or_padgv($array));
3032 if ($array !~ /::/) {
3033 my $prefix = ($left eq '[' ? '@' : '%');
3034 $array = $self->{curstash}.'::'.$array
3035 if $self->lex_in_scope($prefix . $array);
3038 } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
3039 return $self->deparse($array, 24);
3045 sub elem_or_slice_single_index
3050 $idx = $self->deparse($idx, 1);
3052 # Outer parens in an array index will confuse perl
3053 # if we're interpolating in a regular expression, i.e.
3054 # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
3056 # If $self->{parens}, then an initial '(' will
3057 # definitely be paired with a final ')'. If
3058 # !$self->{parens}, the misleading parens won't
3059 # have been added in the first place.
3061 # [You might think that we could get "(...)...(...)"
3062 # where the initial and final parens do not match
3063 # each other. But we can't, because the above would
3064 # only happen if there's an infix binop between the
3065 # two pairs of parens, and *that* means that the whole
3066 # expression would be parenthesized as well.]
3068 $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
3070 # Hash-element braces will autoquote a bareword inside themselves.
3071 # We need to make sure that C<$hash{warn()}> doesn't come out as
3072 # C<$hash{warn}>, which has a quite different meaning. Currently
3073 # B::Deparse will always quote strings, even if the string was a
3074 # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
3075 # for constant strings.) So we can cheat slightly here - if we see
3076 # a bareword, we know that it is supposed to be a function call.
3078 $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
3085 my ($op, $cx, $left, $right, $padname) = @_;
3086 my($array, $idx) = ($op->first, $op->first->sibling);
3088 $idx = $self->elem_or_slice_single_index($idx);
3090 unless ($array->name eq $padname) { # Maybe this has been fixed
3091 $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
3093 if (my $array_name=$self->elem_or_slice_array_name
3094 ($array, $left, $padname, 1)) {
3095 return "\$" . $array_name . $left . $idx . $right;
3097 # $x[20][3]{hi} or expr->[20]
3098 my $arrow = is_subscriptable($array) ? "" : "->";
3099 return $self->deparse($array, 24) . $arrow . $left . $idx . $right;
3104 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
3105 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
3110 my($glob, $part) = ($op->first, $op->last);
3111 $glob = $glob->first; # skip rv2gv
3112 $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
3113 my $scope = is_scope($glob);
3114 $glob = $self->deparse($glob, 0);
3115 $part = $self->deparse($part, 1);
3116 return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
3121 my ($op, $cx, $left, $right, $regname, $padname) = @_;
3123 my(@elems, $kid, $array, $list);
3124 if (class($op) eq "LISTOP") {
3126 } else { # ex-hslice inside delete()
3127 for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
3131 $array = $array->first
3132 if $array->name eq $regname or $array->name eq "null";
3133 $array = $self->elem_or_slice_array_name($array,$left,$padname,0);
3134 $kid = $op->first->sibling; # skip pushmark
3135 if ($kid->name eq "list") {
3136 $kid = $kid->first->sibling; # skip list, pushmark
3137 for (; !null $kid; $kid = $kid->sibling) {
3138 push @elems, $self->deparse($kid, 6);
3140 $list = join(", ", @elems);
3142 $list = $self->elem_or_slice_single_index($kid);
3144 return "\@" . $array . $left . $list . $right;
3147 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
3148 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
3153 my $idx = $op->first;
3154 my $list = $op->last;
3156 $list = $self->deparse($list, 1);
3157 $idx = $self->deparse($idx, 1);
3158 return "($list)" . "[$idx]";
3163 return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
3168 return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
3174 my $kid = $op->first->sibling; # skip pushmark
3175 my($meth, $obj, @exprs);
3176 if ($kid->name eq "list" and want_list $kid) {
3177 # When an indirect object isn't a bareword but the args are in
3178 # parens, the parens aren't part of the method syntax (the LLAFR
3179 # doesn't apply), but they make a list with OPf_PARENS set that
3180 # doesn't get flattened by the append_elem that adds the method,
3181 # making a (object, arg1, arg2, ...) list where the object
3182 # usually is. This can be distinguished from
3183 # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
3184 # object) because in the later the list is in scalar context
3185 # as the left side of -> always is, while in the former
3186 # the list is in list context as method arguments always are.
3187 # (Good thing there aren't method prototypes!)
3188 $meth = $kid->sibling;
3189 $kid = $kid->first->sibling; # skip pushmark
3191 $kid = $kid->sibling;
3192 for (; not null $kid; $kid = $kid->sibling) {
3197 $kid = $kid->sibling;
3198 for (; !null ($kid->sibling) && $kid->name ne "method_named";
3199 $kid = $kid->sibling) {
3205 if ($meth->name eq "method_named") {
3206 $meth = $self->const_sv($meth)->PV;
3208 $meth = $meth->first;
3209 if ($meth->name eq "const") {
3210 # As of 5.005_58, this case is probably obsoleted by the
3211 # method_named case above
3212 $meth = $self->const_sv($meth)->PV; # needs to be bare
3216 return { method => $meth, variable_method => ref($meth),
3217 object => $obj, args => \@exprs };
3220 # compat function only
3223 my $info = $self->_method(@_);
3224 return $self->e_method( $self->_method(@_) );
3228 my ($self, $info) = @_;
3229 my $obj = $self->deparse($info->{object}, 24);
3231 my $meth = $info->{method};
3232 $meth = $self->deparse($meth, 1) if $info->{variable_method};
3233 my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} );
3234 my $kid = $obj . "->" . $meth;
3236 return $kid . "(" . $args . ")"; # parens mandatory
3242 # returns "&" if the prototype doesn't match the args,
3243 # or ("", $args_after_prototype_demunging) if it does.
3246 return "&" if $self->{'noproto'};
3247 my($proto, @args) = @_;
3251 # An unbackslashed @ or % gobbles up the rest of the args
3252 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
3254 $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;)//;
3257 return "&" if @args;
3258 } elsif ($chr eq ";") {
3260 } elsif ($chr eq "@" or $chr eq "%") {
3261 push @reals, map($self->deparse($_, 6), @args);
3266 if ($chr eq "\$" || $chr eq "_") {
3267 if (want_scalar $arg) {
3268 push @reals, $self->deparse($arg, 6);
3272 } elsif ($chr eq "&") {
3273 if ($arg->name =~ /^(s?refgen|undef)$/) {
3274 push @reals, $self->deparse($arg, 6);
3278 } elsif ($chr eq "*") {
3279 if ($arg->name =~ /^s?refgen$/
3280 and $arg->first->first->name eq "rv2gv")
3282 $real = $arg->first->first; # skip refgen, null
3283 if ($real->first->name eq "gv") {
3284 push @reals, $self->deparse($real, 6);
3286 push @reals, $self->deparse($real->first, 6);
3291 } elsif (substr($chr, 0, 1) eq "\\") {
3293 if ($arg->name =~ /^s?refgen$/ and
3294 !null($real = $arg->first) and
3295 ($chr =~ /\$/ && is_scalar($real->first)
3297 && class($real->first->sibling) ne 'NULL'
3298 && $real->first->sibling->name
3301 && class($real->first->sibling) ne 'NULL'
3302 && $real->first->sibling->name
3304 #or ($chr =~ /&/ # This doesn't work
3305 # && $real->first->name eq "rv2cv")
3307 && $real->first->name eq "rv2gv")))
3309 push @reals, $self->deparse($real, 6);
3316 return "&" if $proto and !$doneok; # too few args and no `;'
3317 return "&" if @args; # too many args
3318 return ("", join ", ", @reals);
3324 return $self->e_method($self->_method($op, $cx))
3325 unless null $op->first->sibling;
3329 if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
3331 } elsif ($op->private & OPpENTERSUB_AMPER) {
3335 $kid = $kid->first->sibling; # skip ex-list, pushmark
3336 for (; not null $kid->sibling; $kid = $kid->sibling) {
3341 if (is_scope($kid)) {
3343 $kid = "{" . $self->deparse($kid, 0) . "}";
3344 } elsif ($kid->first->name eq "gv") {
3345 my $gv = $self->gv_or_padgv($kid->first);
3346 if (class($gv->CV) ne "SPECIAL") {
3347 $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
3349 $simple = 1; # only calls of named functions can be prototyped
3350 $kid = $self->deparse($kid, 24);
3352 if ($kid eq 'main::') {
3354 } elsif ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) {
3355 $kid = single_delim("q", "'", $kid) . '->';
3358 } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
3360 $kid = $self->deparse($kid, 24);
3363 my $arrow = is_subscriptable($kid->first) ? "" : "->";
3364 $kid = $self->deparse($kid, 24) . $arrow;
3367 # Doesn't matter how many prototypes there are, if
3368 # they haven't happened yet!
3372 no warnings 'uninitialized';
3373 $declared = exists $self->{'subs_declared'}{$kid}
3375 defined &{ ${$self->{'curstash'}."::"}{$kid} }
3377 $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
3378 && defined prototype $self->{'curstash'}."::".$kid
3380 if (!$declared && defined($proto)) {
3381 # Avoid "too early to check prototype" warning
3382 ($amper, $proto) = ('&');
3387 if ($declared and defined $proto and not $amper) {
3388 ($amper, $args) = $self->check_proto($proto, @exprs);
3389 if ($amper eq "&") {
3390 $args = join(", ", map($self->deparse($_, 6), @exprs));
3393 $args = join(", ", map($self->deparse($_, 6), @exprs));
3395 if ($prefix or $amper) {
3396 if ($op->flags & OPf_STACKED) {
3397 return $prefix . $amper . $kid . "(" . $args . ")";
3399 return $prefix . $amper. $kid;
3402 # glob() invocations can be translated into calls of
3403 # CORE::GLOBAL::glob with a second parameter, a number.
3405 if ($kid eq "CORE::GLOBAL::glob") {
3407 $args =~ s/\s*,[^,]+$//;
3410 # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
3411 # so it must have been translated from a keyword call. Translate
3413 $kid =~ s/^CORE::GLOBAL:://;
3415 my $dproto = defined($proto) ? $proto : "undefined";
3417 return "$kid(" . $args . ")";
3418 } elsif ($dproto eq "") {
3420 } elsif ($dproto eq "\$" and is_scalar($exprs[0])) {
3421 # is_scalar is an excessively conservative test here:
3422 # really, we should be comparing to the precedence of the
3423 # top operator of $exprs[0] (ala unop()), but that would
3424 # take some major code restructuring to do right.
3425 return $self->maybe_parens_func($kid, $args, $cx, 16);
3426 } elsif ($dproto ne '$' and defined($proto) || $simple) { #'
3427 return $self->maybe_parens_func($kid, $args, $cx, 5);
3429 return "$kid(" . $args . ")";
3434 sub pp_enterwrite { unop(@_, "write") }
3436 # escape things that cause interpolation in double quotes,
3437 # but not character escapes
3440 $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
3448 # Matches any string which is balanced with respect to {braces}
3459 # the same, but treat $|, $), $( and $ at the end of the string differently
3473 (\(\?\??\{$bal\}\)) # $4
3479 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3484 # This is for regular expressions with the /x modifier
3485 # We have to leave comments unmangled.
3486 sub re_uninterp_extended {
3499 ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
3500 | \#[^\n]* # (skip over comments)
3507 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3513 my %unctrl = # portable to to EBCDIC
3515 "\c@" => '\c@', # unused
3542 "\c[" => '\c[', # unused
3543 "\c\\" => '\c\\', # unused
3544 "\c]" => '\c]', # unused
3545 "\c_" => '\c_', # unused
3548 # character escapes, but not delimiters that might need to be escaped
3549 sub escape_str { # ASCII, UTF8
3551 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3553 # $str =~ s/\cH/\\b/g; # \b means something different in a regex
3559 $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
3560 $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
3564 # For regexes with the /x modifier.
3565 # Leave whitespace unmangled.
3566 sub escape_extended_re {
3568 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3569 $str =~ s/([[:^print:]])/
3570 ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
3571 $str =~ s/\n/\n\f/g;
3575 # Don't do this for regexen
3578 $str =~ s/\\/\\\\/g;
3582 # Remove backslashes which precede literal control characters,
3583 # to avoid creating ambiguity when we escape the latter.
3587 # the insane complexity here is due to the behaviour of "\c\"
3588 $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
3592 sub balanced_delim {
3594 my @str = split //, $str;
3595 my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
3596 for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3597 ($open, $close) = @$ar;
3598 $fail = 0; $cnt = 0; $last_bs = 0;
3601 $fail = 1 if $last_bs;
3603 } elsif ($c eq $close) {
3604 $fail = 1 if $last_bs;
3612 $last_bs = $c eq '\\';
3614 $fail = 1 if $cnt != 0;
3615 return ($open, "$open$str$close") if not $fail;
3621 my($q, $default, $str) = @_;
3622 return "$default$str$default" if $default and index($str, $default) == -1;
3624 (my $succeed, $str) = balanced_delim($str);
3625 return "$q$str" if $succeed;
3627 for my $delim ('/', '"', '#') {
3628 return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3631 $str =~ s/$default/\\$default/g;
3632 return "$default$str$default";
3640 BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
3642 # Split a floating point number into an integer mantissa and a binary
3643 # exponent. Assumes you've already made sure the number isn't zero or
3644 # some weird infinity or NaN.
3648 if ($f == int($f)) {
3649 while ($f % 2 == 0) {
3654 while ($f != int($f)) {
3659 my $mantissa = sprintf("%.0f", $f);
3660 return ($mantissa, $exponent);
3666 if ($self->{'use_dumper'}) {
3667 return $self->const_dumper($sv, $cx);
3669 if (class($sv) eq "SPECIAL") {
3670 # sv_undef, sv_yes, sv_no
3671 return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1];
3673 if (class($sv) eq "NULL") {
3677 unless ($self->{'inlined_constants'}) {
3678 $self->{'inlined_constants'} = $self->scan_for_constants;
3680 my $const = $self->{'inlined_constants'}->{ 0 + $sv->object_2svref };
3681 return $const if $const;
3683 # convert a version object into the "v1.2.3" string in its V magic
3684 if ($sv->FLAGS & SVs_RMG) {
3685 for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3686 return $mg->PTR if $mg->TYPE eq 'V';
3690 if ($sv->FLAGS & SVf_IOK) {
3691 my $str = $sv->int_value;
3692 $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
3694 } elsif ($sv->FLAGS & SVf_NOK) {
3697 if (pack("F", $nv) eq pack("F", 0)) {
3702 return $self->maybe_parens("-.0", $cx, 21);
3704 } elsif (1/$nv == 0) {
3707 return $self->maybe_parens("9**9**9", $cx, 22);
3710 return $self->maybe_parens("-9**9**9", $cx, 21);
3712 } elsif ($nv != $nv) {
3714 if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
3716 return "sin(9**9**9)";
3717 } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
3719 return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
3722 my $hex = unpack("h*", pack("F", $nv));
3723 return qq'unpack("F", pack("h*", "$hex"))';
3726 # first, try the default stringification
3729 # failing that, try using more precision
3730 $str = sprintf("%.${max_prec}g", $nv);
3731 # if (pack("F", $str) ne pack("F", $nv)) {
3733 # not representable in decimal with whatever sprintf()
3734 # and atof() Perl is using here.
3735 my($mant, $exp) = split_float($nv);
3736 return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
3739 $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
3741 } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3743 if (class($ref) eq "AV") {
3744 return "[" . $self->list_const(2, $ref->ARRAY) . "]";
3745 } elsif (class($ref) eq "HV") {
3746 my %hash = $ref->ARRAY;
3748 for my $k (sort keys %hash) {
3749 push @elts, "$k => " . $self->const($hash{$k}, 6);
3751 return "{" . join(", ", @elts) . "}";
3752 } elsif (class($ref) eq "CV") {
3753 return "sub " . $self->deparse_sub($ref);
3755 if ($ref->FLAGS & SVs_SMG) {
3756 for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3757 if ($mg->TYPE eq 'r') {
3758 my $re = re_uninterp(escape_str(re_unback($mg->precomp)));
3759 return single_delim("qr", "", $re);
3764 return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20);
3765 } elsif ($sv->FLAGS & SVf_POK) {
3767 if ($str =~ /[[:^print:]]/) {
3768 return single_delim("qq", '"', uninterp escape_str unback $str);
3770 return single_delim("q", "'", unback $str);
3780 my $ref = $sv->object_2svref();
3781 my $dumper = Data::Dumper->new([$$ref], ['$v']);
3782 $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
3783 my $str = $dumper->Dump();
3784 if ($str =~ /^\$v/) {
3785 return '${my ' . $str . ' \$v}';
3795 # the constant could be in the pad (under useithreads)
3796 $sv = $self->padval($op->targ) unless $$sv;
3803 if ($op->private & OPpCONST_ARYBASE) {
3806 # if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
3807 # return $self->const_sv($op)->PV;
3809 my $sv = $self->const_sv($op);
3810 return $self->const($sv, $cx);
3816 my $type = $op->name;
3817 if ($type eq "const") {
3818 return '$[' if $op->private & OPpCONST_ARYBASE;
3819 return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3820 } elsif ($type eq "concat") {
3821 my $first = $self->dq($op->first);
3822 my $last = $self->dq($op->last);
3824 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
3825 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3826 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
3827 || ($last =~ /^[:'{\[\w_]/ && #'
3828 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3830 return $first . $last;
3831 } elsif ($type eq "uc") {
3832 return '\U' . $self->dq($op->first->sibling) . '\E';
3833 } elsif ($type eq "lc") {
3834 return '\L' . $self->dq($op->first->sibling) . '\E';
3835 } elsif ($type eq "ucfirst") {
3836 return '\u' . $self->dq($op->first->sibling);
3837 } elsif ($type eq "lcfirst") {
3838 return '\l' . $self->dq($op->first->sibling);
3839 } elsif ($type eq "quotemeta") {
3840 return '\Q' . $self->dq($op->first->sibling) . '\E';
3841 } elsif ($type eq "join") {
3842 return $self->deparse($op->last, 26); # was join($", @ary)
3844 return $self->deparse($op, 26);
3851 # skip pushmark if it exists (readpipe() vs ``)
3852 my $child = $op->first->sibling->isa('B::NULL')
3853 ? $op->first : $op->first->sibling;
3854 return single_delim("qx", '`', $self->dq($child));
3860 my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3861 return $self->deparse($kid, $cx) if $self->{'unquote'};
3862 $self->maybe_targmy($kid, $cx,
3863 sub {single_delim("qq", '"', $self->dq($_[1]))});
3866 # OP_STRINGIFY is a listop, but it only ever has one arg
3867 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3869 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3870 # note that tr(from)/to/ is OK, but not tr/from/(to)
3872 my($from, $to) = @_;
3873 my($succeed, $delim);
3874 if ($from !~ m[/] and $to !~ m[/]) {
3875 return "/$from/$to/";
3876 } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3877 if (($succeed, $to) = balanced_delim($to) and $succeed) {
3880 for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3881 return "$from$delim$to$delim" if index($to, $delim) == -1;
3884 return "$from/$to/";
3887 for $delim ('/', '"', '#') { # note no '
3888 return "$delim$from$delim$to$delim"
3889 if index($to . $from, $delim) == -1;
3891 $from =~ s[/][\\/]g;
3893 return "/$from/$to/";
3897 # Only used by tr///, so backslashes hyphens
3900 if ($n == ord '\\') {
3902 } elsif ($n == ord "-") {
3904 } elsif ($n >= ord(' ') and $n <= ord('~')) {
3906 } elsif ($n == ord "\a") {
3908 } elsif ($n == ord "\b") {
3910 } elsif ($n == ord "\t") {
3912 } elsif ($n == ord "\n") {
3914 } elsif ($n == ord "\e") {
3916 } elsif ($n == ord "\f") {
3918 } elsif ($n == ord "\r") {
3920 } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3921 return '\\c' . chr(ord("@") + $n);
3923 # return '\x' . sprintf("%02x", $n);
3924 return '\\' . sprintf("%03o", $n);
3930 my($str, $c, $tr) = ("");
3931 for ($c = 0; $c < @chars; $c++) {
3934 if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3935 $chars[$c + 2] == $tr + 2)
3937 for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3940 $str .= pchr($chars[$c]);
3946 sub tr_decode_byte {
3947 my($table, $flags) = @_;
3948 my(@table) = unpack("s*", $table);
3949 splice @table, 0x100, 1; # Number of subsequent elements
3950 my($c, $tr, @from, @to, @delfrom, $delhyphen);
3951 if ($table[ord "-"] != -1 and
3952 $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3954 $tr = $table[ord "-"];
3955 $table[ord "-"] = -1;
3959 } else { # -2 ==> delete
3963 for ($c = 0; $c < @table; $c++) {
3966 push @from, $c; push @to, $tr;
3967 } elsif ($tr == -2) {
3971 @from = (@from, @delfrom);
3972 if ($flags & OPpTRANS_COMPLEMENT) {
3975 @from{@from} = (1) x @from;
3976 for ($c = 0; $c < 256; $c++) {
3977 push @newfrom, $c unless $from{$c};
3981 unless ($flags & OPpTRANS_DELETE || !@to) {
3982 pop @to while $#to and $to[$#to] == $to[$#to -1];
3985 $from = collapse(@from);
3986 $to = collapse(@to);
3987 $from .= "-" if $delhyphen;
3988 return ($from, $to);
3993 if ($x == ord "-") {
3995 } elsif ($x == ord "\\") {
4002 # XXX This doesn't yet handle all cases correctly either
4004 sub tr_decode_utf8 {
4005 my($swash_hv, $flags) = @_;
4006 my %swash = $swash_hv->ARRAY;
4008 $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
4009 my $none = $swash{"NONE"}->IV;
4010 my $extra = $none + 1;
4011 my(@from, @delfrom, @to);
4013 foreach $line (split /\n/, $swash{'LIST'}->PV) {
4014 my($min, $max, $result) = split(/\t/, $line);
4021 $result = hex $result;
4022 if ($result == $extra) {
4023 push @delfrom, [$min, $max];
4025 push @from, [$min, $max];
4026 push @to, [$result, $result + $max - $min];
4029 for my $i (0 .. $#from) {
4030 if ($from[$i][0] == ord '-') {
4031 unshift @from, splice(@from, $i, 1);
4032 unshift @to, splice(@to, $i, 1);
4034 } elsif ($from[$i][1] == ord '-') {
4037 unshift @from, ord '-';
4038 unshift @to, ord '-';
4042 for my $i (0 .. $#delfrom) {
4043 if ($delfrom[$i][0] == ord '-') {
4044 push @delfrom, splice(@delfrom, $i, 1);
4046 } elsif ($delfrom[$i][1] == ord '-') {
4048 push @delfrom, ord '-';
4052 if (defined $final and $to[$#to][1] != $final) {
4053 push @to, [$final, $final];
4055 push @from, @delfrom;
4056 if ($flags & OPpTRANS_COMPLEMENT) {
4059 for my $i (0 .. $#from) {
4060 push @newfrom, [$next, $from[$i][0] - 1];
4061 $next = $from[$i][1] + 1;
4064 for my $range (@newfrom) {
4065 if ($range->[0] <= $range->[1]) {
4070 my($from, $to, $diff);
4071 for my $chunk (@from) {
4072 $diff = $chunk->[1] - $chunk->[0];
4074 $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
4075 } elsif ($diff == 1) {
4076 $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
4078 $from .= tr_chr($chunk->[0]);
4081 for my $chunk (@to) {
4082 $diff = $chunk->[1] - $chunk->[0];
4084 $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
4085 } elsif ($diff == 1) {
4086 $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
4088 $to .= tr_chr($chunk->[0]);
4091 #$final = sprintf("%04x", $final) if defined $final;
4092 #$none = sprintf("%04x", $none) if defined $none;
4093 #$extra = sprintf("%04x", $extra) if defined $extra;
4094 #print STDERR "final: $final\n none: $none\nextra: $extra\n";
4095 #print STDERR $swash{'LIST'}->PV;
4096 return (escape_str($from), escape_str($to));
4103 if (class($op) eq "PVOP") {
4104 ($from, $to) = tr_decode_byte($op->pv, $op->private);
4105 } else { # class($op) eq "SVOP"
4106 ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
4109 $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
4110 $flags .= "d" if $op->private & OPpTRANS_DELETE;
4111 $to = "" if $from eq $to and $flags eq "";
4112 $flags .= "s" if $op->private & OPpTRANS_SQUASH;
4113 return "tr" . double_delim($from, $to) . $flags;
4116 sub re_dq_disambiguate {
4117 my ($first, $last) = @_;
4118 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
4119 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
4120 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
4121 || ($last =~ /^[{\[\w_]/ &&
4122 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
4123 return $first . $last;
4126 # Like dq(), but different
4129 my ($op, $extended) = @_;
4131 my $type = $op->name;
4132 if ($type eq "const") {
4133 return '$[' if $op->private & OPpCONST_ARYBASE;
4134 my $unbacked = re_unback($self->const_sv($op)->as_string);
4135 return re_uninterp_extended(escape_extended_re($unbacked))
4137 return re_uninterp(escape_str($unbacked));
4138 } elsif ($type eq "concat") {
4139 my $first = $self->re_dq($op->first, $extended);
4140 my $last = $self->re_dq($op->last, $extended);
4141 return re_dq_disambiguate($first, $last);
4142 } elsif ($type eq "uc") {
4143 return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
4144 } elsif ($type eq "lc") {
4145 return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
4146 } elsif ($type eq "ucfirst") {
4147 return '\u' . $self->re_dq($op->first->sibling, $extended);
4148 } elsif ($type eq "lcfirst") {
4149 return '\l' . $self->re_dq($op->first->sibling, $extended);
4150 } elsif ($type eq "quotemeta") {
4151 return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
4152 } elsif ($type eq "join") {
4153 return $self->deparse($op->last, 26); # was join($", @ary)
4155 return $self->deparse($op, 26);
4160 my ($self, $op) = @_;
4161 return 0 if null $op;
4162 my $type = $op->name;
4164 if ($type eq 'const') {
4167 elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
4168 return $self->pure_string($op->first->sibling);
4170 elsif ($type eq 'join') {
4171 my $join_op = $op->first->sibling; # Skip pushmark
4172 return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
4174 my $gvop = $join_op->first;
4175 return 0 unless $gvop->name eq 'gvsv';
4176 return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
4178 return 0 unless ${$join_op->sibling} eq ${$op->last};
4179 return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/;
4181 elsif ($type eq 'concat') {
4182 return $self->pure_string($op->first)
4183 && $self->pure_string($op->last);
4185 elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
4188 elsif ($type eq "null" and $op->can('first') and not null $op->first and
4189 $op->first->name eq "null" and $op->first->can('first')
4190 and not null $op->first->first and
4191 $op->first->first->name eq "aelemfast") {
4203 my($op, $cx, $extended) = @_;
4204 my $kid = $op->first;
4205 $kid = $kid->first if $kid->name eq "regcmaybe";
4206 $kid = $kid->first if $kid->name eq "regcreset";
4207 if ($kid->name eq "null" and !null($kid->first)
4208 and $kid->first->name eq 'pushmark')
4211 $kid = $kid->first->sibling;
4212 while (!null($kid)) {
4214 my $last = $self->re_dq($kid, $extended);
4215 $str = re_dq_disambiguate($first, $last);
4216 $kid = $kid->sibling;
4221 return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
4222 return ($self->deparse($kid, $cx), 0);
4226 my ($self, $op, $cx) = @_;
4227 return (($self->regcomp($op, $cx, 0))[0]);
4230 # osmic acid -- see osmium tetroxide
4233 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
4234 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
4235 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
4239 my($op, $cx, $name, $delim) = @_;
4240 my $kid = $op->first;
4241 my ($binop, $var, $re) = ("", "", "");
4242 if ($op->flags & OPf_STACKED) {
4244 $var = $self->deparse($kid, 20);
4245 $kid = $kid->sibling;
4248 my $extended = ($op->pmflags & PMf_EXTENDED);
4250 my $unbacked = re_unback($op->precomp);
4252 $re = re_uninterp_extended(escape_extended_re($unbacked));
4254 $re = re_uninterp(escape_str(re_unback($op->precomp)));
4256 } elsif ($kid->name ne 'regcomp') {
4257 carp("found ".$kid->name." where regcomp expected");
4259 ($re, $quote) = $self->regcomp($kid, 21, $extended);
4262 $flags .= "c" if $op->pmflags & PMf_CONTINUE;
4263 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4264 $flags .= "i" if $op->pmflags & PMf_FOLD;
4265 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4266 $flags .= "o" if $op->pmflags & PMf_KEEP;
4267 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4268 $flags .= "x" if $op->pmflags & PMf_EXTENDED;
4269 $flags = $matchwords{$flags} if $matchwords{$flags};
4270 if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
4274 $re = single_delim($name, $delim, $re);
4276 $re = $re . $flags if $quote;
4278 return $self->maybe_parens("$var =~ $re", $cx, 20);
4284 sub pp_match { matchop(@_, "m", "/") }
4285 sub pp_pushre { matchop(@_, "m", "/") }
4286 sub pp_qr { matchop(@_, "qr", "") }
4291 my($kid, @exprs, $ary, $expr);
4294 # For our kid (an OP_PUSHRE), pmreplroot is never actually the
4295 # root of a replacement; it's either empty, or abused to point to
4296 # the GV for an array we split into (an optimization to save
4297 # assignment overhead). Depending on whether we're using ithreads,
4298 # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
4299 # figures out for us which it is.
4300 my $replroot = $kid->pmreplroot;
4302 if (ref($replroot) eq "B::GV") {
4304 } elsif (!ref($replroot) and $replroot > 0) {
4305 $gv = $self->padval($replroot);
4307 $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
4309 for (; !null($kid); $kid = $kid->sibling) {
4310 push @exprs, $self->deparse($kid, 6);
4313 # handle special case of split(), and split(' ') that compiles to /\s+/
4314 # Under 5.10, the reflags may be undef if the split regexp isn't a constant
4316 if ( $kid->flags & OPf_SPECIAL
4317 and ( $] < 5.009 ? $kid->pmflags & PMf_SKIPWHITE()
4318 : ($kid->reflags || 0) & RXf_SKIPWHITE() ) ) {
4322 $expr = "split(" . join(", ", @exprs) . ")";
4324 return $self->maybe_parens("$ary = $expr", $cx, 7);
4330 # oxime -- any of various compounds obtained chiefly by the action of
4331 # hydroxylamine on aldehydes and ketones and characterized by the
4332 # bivalent grouping C=NOH [Webster's Tenth]
4335 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
4336 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
4337 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
4338 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
4343 my $kid = $op->first;
4344 my($binop, $var, $re, $repl) = ("", "", "", "");
4345 if ($op->flags & OPf_STACKED) {
4347 $var = $self->deparse($kid, 20);
4348 $kid = $kid->sibling;
4351 if (null($op->pmreplroot)) {
4352 $repl = $self->dq($kid);
4353 $kid = $kid->sibling;
4355 $repl = $op->pmreplroot->first; # skip substcont
4356 while ($repl->name eq "entereval") {
4357 $repl = $repl->first;
4360 if ($op->pmflags & PMf_EVAL) {
4361 $repl = $self->deparse($repl->first, 0);
4363 $repl = $self->dq($repl);
4366 my $extended = ($op->pmflags & PMf_EXTENDED);
4368 my $unbacked = re_unback($op->precomp);
4370 $re = re_uninterp_extended(escape_extended_re($unbacked));
4373 $re = re_uninterp(escape_str($unbacked));
4376 ($re) = $self->regcomp($kid, 1, $extended);
4378 $flags .= "e" if $op->pmflags & PMf_EVAL;
4379 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4380 $flags .= "i" if $op->pmflags & PMf_FOLD;
4381 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4382 $flags .= "o" if $op->pmflags & PMf_KEEP;
4383 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4384 $flags .= "x" if $extended;
4385 $flags = $substwords{$flags} if $substwords{$flags};
4387 return $self->maybe_parens("$var =~ s"
4388 . double_delim($re, $repl) . $flags,
4391 return "s". double_delim($re, $repl) . $flags;
4400 B::Deparse - Perl compiler backend to produce perl code
4404 B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
4405 [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
4409 B::Deparse is a backend module for the Perl compiler that generates
4410 perl source code, based on the internal compiled structure that perl
4411 itself creates after parsing a program. The output of B::Deparse won't
4412 be exactly the same as the original source, since perl doesn't keep
4413 track of comments or whitespace, and there isn't a one-to-one
4414 correspondence between perl's syntactical constructions and their
4415 compiled form, but it will often be close. When you use the B<-p>
4416 option, the output also includes parentheses even when they are not
4417 required by precedence, which can make it easy to see if perl is
4418 parsing your expressions the way you intended.
4420 While B::Deparse goes to some lengths to try to figure out what your
4421 original program was doing, some parts of the language can still trip
4422 it up; it still fails even on some parts of Perl's own test suite. If
4423 you encounter a failure other than the most common ones described in
4424 the BUGS section below, you can help contribute to B::Deparse's
4425 ongoing development by submitting a bug report with a small
4430 As with all compiler backend options, these must follow directly after
4431 the '-MO=Deparse', separated by a comma but not any white space.
4437 Output data values (when they appear as constants) using Data::Dumper.
4438 Without this option, B::Deparse will use some simple routines of its
4439 own for the same purpose. Currently, Data::Dumper is better for some
4440 kinds of data (such as complex structures with sharing and
4441 self-reference) while the built-in routines are better for others
4442 (such as odd floating-point values).
4446 Normally, B::Deparse deparses the main code of a program, and all the subs
4447 defined in the same file. To include subs defined in other files, pass the
4448 B<-f> option with the filename. You can pass the B<-f> option several times, to
4449 include more than one secondary file. (Most of the time you don't want to
4450 use it at all.) You can also use this option to include subs which are
4451 defined in the scope of a B<#line> directive with two parameters.
4455 Add '#line' declarations to the output based on the line and file
4456 locations of the original code.
4460 Print extra parentheses. Without this option, B::Deparse includes
4461 parentheses in its output only when they are needed, based on the
4462 structure of your program. With B<-p>, it uses parentheses (almost)
4463 whenever they would be legal. This can be useful if you are used to
4464 LISP, or if you want to see how perl parses your input. If you say
4466 if ($var & 0x7f == 65) {print "Gimme an A!"}
4467 print ($which ? $a : $b), "\n";
4468 $name = $ENV{USER} or "Bob";
4470 C<B::Deparse,-p> will print
4473 print('Gimme an A!')
4475 (print(($which ? $a : $b)), '???');
4476 (($name = $ENV{'USER'}) or '???')
4478 which probably isn't what you intended (the C<'???'> is a sign that
4479 perl optimized away a constant value).
4483 Disable prototype checking. With this option, all function calls are
4484 deparsed as if no prototype was defined for them. In other words,
4486 perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
4495 making clear how the parameters are actually passed to C<foo>.
4499 Expand double-quoted strings into the corresponding combinations of
4500 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
4503 print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
4507 print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
4508 . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
4510 Note that the expanded form represents the way perl handles such
4511 constructions internally -- this option actually turns off the reverse
4512 translation that B::Deparse usually does. On the other hand, note that
4513 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
4514 of $y into a string before doing the assignment.
4516 =item B<-s>I<LETTERS>
4518 Tweak the style of B::Deparse's output. The letters should follow
4519 directly after the 's', with no space or punctuation. The following
4520 options are available:
4526 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
4543 The default is not to cuddle.
4547 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
4551 Use tabs for each 8 columns of indent. The default is to use only spaces.
4552 For instance, if the style options are B<-si4T>, a line that's indented
4553 3 times will be preceded by one tab and four spaces; if the options were
4554 B<-si8T>, the same line would be preceded by three tabs.
4556 =item B<v>I<STRING>B<.>
4558 Print I<STRING> for the value of a constant that can't be determined
4559 because it was optimized away (mnemonic: this happens when a constant
4560 is used in B<v>oid context). The end of the string is marked by a period.
4561 The string should be a valid perl expression, generally a constant.
4562 Note that unless it's a number, it probably needs to be quoted, and on
4563 a command line quotes need to be protected from the shell. Some
4564 conventional values include 0, 1, 42, '', 'foo', and
4565 'Useless use of constant omitted' (which may need to be
4566 B<-sv"'Useless use of constant omitted'.">
4567 or something similar depending on your shell). The default is '???'.
4568 If you're using B::Deparse on a module or other file that's require'd,
4569 you shouldn't use a value that evaluates to false, since the customary
4570 true constant at the end of a module will be in void context when the
4571 file is compiled as a main program.
4577 Expand conventional syntax constructions into equivalent ones that expose
4578 their internal operation. I<LEVEL> should be a digit, with higher values
4579 meaning more expansion. As with B<-q>, this actually involves turning off
4580 special cases in B::Deparse's normal operations.
4582 If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
4583 while loops with continue blocks; for instance
4585 for ($i = 0; $i < 10; ++$i) {
4598 Note that in a few cases this translation can't be perfectly carried back
4599 into the source code -- if the loop's initializer declares a my variable,
4600 for instance, it won't have the correct scope outside of the loop.
4602 If I<LEVEL> is at least 5, C<use> declarations will be translated into
4603 C<BEGIN> blocks containing calls to C<require> and C<import>; for
4613 'strict'->import('refs')
4617 If I<LEVEL> is at least 7, C<if> statements will be translated into
4618 equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
4620 print 'hi' if $nice;
4632 $nice and print 'hi';
4633 $nice and do { print 'hi' };
4634 $nice ? do { print 'hi' } : do { print 'bye' };
4636 Long sequences of elsifs will turn into nested ternary operators, which
4637 B::Deparse doesn't know how to indent nicely.
4641 =head1 USING B::Deparse AS A MODULE
4646 $deparse = B::Deparse->new("-p", "-sC");
4647 $body = $deparse->coderef2text(\&func);
4648 eval "sub func $body"; # the inverse operation
4652 B::Deparse can also be used on a sub-by-sub basis from other perl
4657 $deparse = B::Deparse->new(OPTIONS)
4659 Create an object to store the state of a deparsing operation and any
4660 options. The options are the same as those that can be given on the
4661 command line (see L</OPTIONS>); options that are separated by commas
4662 after B<-MO=Deparse> should be given as separate strings.
4664 =head2 ambient_pragmas
4666 $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
4668 The compilation of a subroutine can be affected by a few compiler
4669 directives, B<pragmas>. These are:
4683 Assigning to the special variable $[
4703 Ordinarily, if you use B::Deparse on a subroutine which has
4704 been compiled in the presence of one or more of these pragmas,
4705 the output will include statements to turn on the appropriate
4706 directives. So if you then compile the code returned by coderef2text,
4707 it will behave the same way as the subroutine which you deparsed.
4709 However, you may know that you intend to use the results in a
4710 particular context, where some pragmas are already in scope. In
4711 this case, you use the B<ambient_pragmas> method to describe the
4712 assumptions you wish to make.
4714 Not all of the options currently have any useful effect. See
4715 L</BUGS> for more details.
4717 The parameters it accepts are:
4723 Takes a string, possibly containing several values separated
4724 by whitespace. The special values "all" and "none" mean what you'd
4727 $deparse->ambient_pragmas(strict => 'subs refs');
4731 Takes a number, the value of the array base $[.
4739 If the value is true, then the appropriate pragma is assumed to
4740 be in the ambient scope, otherwise not.
4744 Takes a string, possibly containing a whitespace-separated list of
4745 values. The values "all" and "none" are special. It's also permissible
4746 to pass an array reference here.
4748 $deparser->ambient_pragmas(re => 'eval');
4753 Takes a string, possibly containing a whitespace-separated list of
4754 values. The values "all" and "none" are special, again. It's also
4755 permissible to pass an array reference here.
4757 $deparser->ambient_pragmas(warnings => [qw[void io]]);
4759 If one of the values is the string "FATAL", then all the warnings
4760 in that list will be considered fatal, just as with the B<warnings>
4761 pragma itself. Should you need to specify that some warnings are
4762 fatal, and others are merely enabled, you can pass the B<warnings>
4765 $deparser->ambient_pragmas(
4767 warnings => [FATAL => qw/void io/],
4770 See L<perllexwarn> for more information about lexical warnings.
4776 These two parameters are used to specify the ambient pragmas in
4777 the format used by the special variables $^H and ${^WARNING_BITS}.
4779 They exist principally so that you can write code like:
4781 { my ($hint_bits, $warning_bits);
4782 BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
4783 $deparser->ambient_pragmas (
4784 hint_bits => $hint_bits,
4785 warning_bits => $warning_bits,
4789 which specifies that the ambient pragmas are exactly those which
4790 are in scope at the point of calling.
4794 This parameter is used to specify the ambient pragmas which are
4795 stored in the special hash %^H.
4801 $body = $deparse->coderef2text(\&func)
4802 $body = $deparse->coderef2text(sub ($$) { ... })
4804 Return source code for the body of a subroutine (a block, optionally
4805 preceded by a prototype in parens), given a reference to the
4806 sub. Because a subroutine can have no names, or more than one name,
4807 this method doesn't return a complete subroutine definition -- if you
4808 want to eval the result, you should prepend "sub subname ", or "sub "
4809 for an anonymous function constructor. Unless the sub was defined in
4810 the main:: package, the code will include a package declaration.
4818 The only pragmas to be completely supported are: C<use warnings>,
4819 C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
4820 behaves like a pragma, is also supported.)
4822 Excepting those listed above, we're currently unable to guarantee that
4823 B::Deparse will produce a pragma at the correct point in the program.
4824 (Specifically, pragmas at the beginning of a block often appear right
4825 before the start of the block instead.)
4826 Since the effects of pragmas are often lexically scoped, this can mean
4827 that the pragma holds sway over a different portion of the program
4828 than in the input file.
4832 In fact, the above is a specific instance of a more general problem:
4833 we can't guarantee to produce BEGIN blocks or C<use> declarations in
4834 exactly the right place. So if you use a module which affects compilation
4835 (such as by over-riding keywords, overloading constants or whatever)
4836 then the output code might not work as intended.
4838 This is the most serious outstanding problem, and will require some help
4839 from the Perl core to fix.
4843 If a keyword is over-ridden, and your program explicitly calls
4844 the built-in version by using CORE::keyword, the output of B::Deparse
4845 will not reflect this. If you run the resulting code, it will call
4846 the over-ridden version rather than the built-in one. (Maybe there
4847 should be an option to B<always> print keyword calls as C<CORE::name>.)
4851 Some constants don't print correctly either with or without B<-d>.
4852 For instance, neither B::Deparse nor Data::Dumper know how to print
4853 dual-valued scalars correctly, as in:
4855 use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
4857 use constant H => { "#" => 1 }; H->{"#"};
4861 An input file that uses source filtering probably won't be deparsed into
4862 runnable code, because it will still include the B<use> declaration
4863 for the source filtering module, even though the code that is
4864 produced is already ordinary Perl which shouldn't be filtered again.
4868 Optimised away statements are rendered as '???'. This includes statements that
4869 have a compile-time side-effect, such as the obscure
4873 which is not, consequently, deparsed correctly.
4875 foreach my $i (@_) { 0 }
4877 foreach my $i (@_) { '???' }
4881 Lexical (my) variables declared in scopes external to a subroutine
4882 appear in code2ref output text as package variables. This is a tricky
4883 problem, as perl has no native facility for refering to a lexical variable
4884 defined within a different scope, although L<PadWalker> is a good start.
4888 There are probably many more bugs on non-ASCII platforms (EBCDIC).
4894 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
4895 by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
4896 Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
4897 Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael