2 # Copyright (c) 1998, 1999, 2000 Stephen McCamant. All rights reserved.
3 # This module is free software; you can redistribute and/or modify
4 # it under the same terms as Perl itself.
6 # This is based on the module of the same name by Malcolm Beattie,
7 # but essentially none of his code remains.
11 use B qw(class main_root main_start main_cv svref_2object opnumber cstring
12 OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
13 OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD
14 OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
15 OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
16 OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
18 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR
19 CVf_METHOD CVf_LOCKED CVf_LVALUE
20 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_SKIPWHITE
21 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
26 # Changes between 0.50 and 0.51:
27 # - fixed nulled leave with live enter in sort { }
28 # - fixed reference constants (\"str")
29 # - handle empty programs gracefully
30 # - handle infinte loops (for (;;) {}, while (1) {})
31 # - differentiate between `for my $x ...' and `my $x; for $x ...'
32 # - various minor cleanups
33 # - moved globals into an object
34 # - added `-u', like B::C
35 # - package declarations using cop_stash
36 # - subs, formats and code sorted by cop_seq
37 # Changes between 0.51 and 0.52:
38 # - added pp_threadsv (special variables under USE_5005THREADS)
39 # - added documentation
40 # Changes between 0.52 and 0.53:
41 # - many changes adding precedence contexts and associativity
42 # - added `-p' and `-s' output style options
43 # - various other minor fixes
44 # Changes between 0.53 and 0.54:
45 # - added support for new `for (1..100)' optimization,
47 # Changes between 0.54 and 0.55:
48 # - added support for new qr// construct
49 # - added support for new pp_regcreset OP
50 # Changes between 0.55 and 0.56:
51 # - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
52 # - fixed $# on non-lexicals broken in last big rewrite
53 # - added temporary fix for change in opcode of OP_STRINGIFY
54 # - fixed problem in 0.54's for() patch in `for (@ary)'
55 # - fixed precedence in conditional of ?:
56 # - tweaked list paren elimination in `my($x) = @_'
57 # - made continue-block detection trickier wrt. null ops
58 # - fixed various prototype problems in pp_entersub
59 # - added support for sub prototypes that never get GVs
60 # - added unquoting for special filehandle first arg in truncate
61 # - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
62 # - added semicolons at the ends of blocks
63 # - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
64 # Changes between 0.56 and 0.561:
65 # - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
66 # - used new B.pm symbolic constants (done by Nick Ing-Simmons)
67 # Changes between 0.561 and 0.57:
68 # - stylistic changes to symbolic constant stuff
69 # - handled scope in s///e replacement code
70 # - added unquote option for expanding "" into concats, etc.
71 # - split method and proto parts of pp_entersub into separate functions
72 # - various minor cleanups
74 # - added parens in \&foo (patch by Albert Dvornik)
75 # Changes between 0.57 and 0.58:
76 # - fixed `0' statements that weren't being printed
77 # - added methods for use from other programs
78 # (based on patches from James Duncan and Hugo van der Sanden)
79 # - added -si and -sT to control indenting (also based on a patch from Hugo)
80 # - added -sv to print something else instead of '???'
81 # - preliminary version of utf8 tr/// handling
83 # - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
84 # - added support for Hugo's new OP_SETSTATE (like nextstate)
85 # Changes between 0.58 and 0.59
86 # - added support for Chip's OP_METHOD_NAMED
87 # - added support for Ilya's OPpTARGET_MY optimization
88 # - elided arrows before `()' subscripts when possible
89 # Changes between 0.59 and 0.60
90 # - support for method attribues was added
91 # - some warnings fixed
92 # - separate recognition of constant subs
93 # - rewrote continue block handling, now recoginizing for loops
94 # - added more control of expanding control structures
95 # Changes between 0.60 and 0.61 (mostly by Robin Houston)
97 # - support for pragmas and 'use'
98 # - support for the little-used $[ variable
99 # - support for __DATA__ sections
101 # - BEGIN, CHECK, INIT and END blocks
102 # - scoping of subroutine declarations fixed
103 # - compile-time output from the input program can be suppressed, so that the
104 # output is just the deparsed code. (a change to O.pm in fact)
105 # - our() declarations
106 # - *all* the known bugs are now listed in the BUGS section
107 # - comprehensive test mechanism (TEST -deparse)
110 # (See also BUGS section at the end of this file)
112 # - finish tr/// changes
113 # - add option for even more parens (generalize \&foo change)
114 # - left/right context
115 # - treat top-level block specially for incremental output
116 # - copy comments (look at real text with $^P?)
117 # - avoid semis in one-statement blocks
118 # - associativity of &&=, ||=, ?:
119 # - ',' => '=>' (auto-unquote?)
120 # - break long lines ("\r" as discretionary break?)
121 # - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
122 # - more style options: brace style, hex vs. octal, quotes, ...
123 # - print big ints as hex/octal instead of decimal (heuristic?)
124 # - handle `my $x if 0'?
125 # - coordinate with Data::Dumper (both directions? see previous)
126 # - version using op_next instead of op_first/sibling?
127 # - avoid string copies (pass arrays, one big join?)
130 # Tests that will always fail:
131 # (see t/TEST for the short list)
133 # Object fields (were globals):
136 # (local($a), local($b)) and local($a, $b) have the same internal
137 # representation but the short form looks better. We notice we can
138 # use a large-scale local when checking the list, but need to prevent
139 # individual locals too. This hash holds the addresses of OPs that
140 # have already had their local-ness accounted for. The same thing
144 # CV for current sub (or main program) being deparsed
147 # Cached hash of lexical variables for curcv: keys are names,
148 # each value is an array of pairs, indicating the cop_seq of scopes
149 # in which a var of that name is valid.
152 # COP for statement being deparsed
155 # name of the current package for deparsed code
158 # array of [cop_seq, CV, is_format?] for subs and formats we still
162 # as above, but [name, prototype] for subs that never got a GV
164 # subs_done, forms_done:
165 # keys are addresses of GVs for subs and formats we've already
166 # deparsed (or at least put into subs_todo)
169 # keys are names of subs for which we've printed declarations.
170 # That means we can omit parentheses from the arguments.
173 # Keeps track of fully qualified names of all deparsed subs.
178 # cuddle: ` ' or `\n', depending on -sC
183 # A little explanation of how precedence contexts and associativity
186 # deparse() calls each per-op subroutine with an argument $cx (short
187 # for context, but not the same as the cx* in the perl core), which is
188 # a number describing the op's parents in terms of precedence, whether
189 # they're inside an expression or at statement level, etc. (see
190 # chart below). When ops with children call deparse on them, they pass
191 # along their precedence. Fractional values are used to implement
192 # associativity (`($x + $y) + $z' => `$x + $y + $y') and related
193 # parentheses hacks. The major disadvantage of this scheme is that
194 # it doesn't know about right sides and left sides, so say if you
195 # assign a listop to a variable, it can't tell it's allowed to leave
196 # the parens off the listop.
199 # 26 [TODO] inside interpolation context ("")
200 # 25 left terms and list operators (leftward)
204 # 21 right ! ~ \ and unary + and -
209 # 16 nonassoc named unary operators
210 # 15 nonassoc < > <= >= lt gt le ge
211 # 14 nonassoc == != <=> eq ne cmp
218 # 7 right = += -= *= etc.
220 # 5 nonassoc list operators (rightward)
224 # 1 statement modifiers
227 # Also, lineseq may pass a fourth parameter to the pp_ routines:
228 # if present, the fourth parameter is passed on by deparse.
230 # If present and true, it means that the op exists directly as
231 # part of a lineseq. Currently it's only used by scopeop to
232 # decide whether its results need to be enclosed in a do {} block.
234 # Nonprinting characters with special meaning:
235 # \cS - steal parens (see maybe_parens_unop)
236 # \n - newline and indent
237 # \t - increase indent
238 # \b - decrease indent (`outdent')
239 # \f - flush left (no indent)
240 # \cK - kill following semicolon, if any
244 return class($op) eq "NULL";
249 my($cv, $is_form) = @_;
250 return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE});
252 if (!null($cv->START) and is_state($cv->START)) {
253 $seq = $cv->START->cop_seq;
257 push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form];
258 unless ($is_form || class($cv->STASH) eq 'SPECIAL') {
259 $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1;
265 my $ent = shift @{$self->{'subs_todo'}};
268 my $name = $self->gv_name($gv);
270 return "format $name =\n"
271 . $self->deparse_format($ent->[1]). "\n";
273 $self->{'subs_declared'}{$name} = 1;
274 if ($name eq "BEGIN") {
275 my $use_dec = $self->begin_is_use($cv);
276 if (defined ($use_dec)) {
277 return () if 0 == length($use_dec);
282 if ($self->{'linenums'}) {
283 my $line = $gv->LINE;
284 my $file = $gv->FILE;
285 $l = "\n\f#line $line \"$file\"\n";
287 return "${l}sub $name " . $self->deparse_sub($cv);
291 # Return a "use" declaration for this BEGIN block, if appropriate
293 my ($self, $cv) = @_;
294 my $root = $cv->ROOT;
295 local @$self{qw'curcv curcvlex'} = ($cv);
297 #B::walkoptree($cv->ROOT, "debug");
298 my $lineseq = $root->first;
299 return if $lineseq->name ne "lineseq";
301 my $req_op = $lineseq->first->sibling;
302 return if $req_op->name ne "require";
305 if ($req_op->first->private & OPpCONST_BARE) {
306 # Actually it should always be a bareword
307 $module = $self->const_sv($req_op->first)->PV;
308 $module =~ s[/][::]g;
312 $module = const($self->const_sv($req_op->first));
316 my $version_op = $req_op->sibling;
317 return if class($version_op) eq "NULL";
318 if ($version_op->name eq "lineseq") {
319 # We have a version parameter; skip nextstate & pushmark
320 my $constop = $version_op->first->next->next;
322 return unless $self->const_sv($constop)->PV eq $module;
323 $constop = $constop->sibling;
324 $version = $self->const_sv($constop)->int_value;
325 $constop = $constop->sibling;
326 return if $constop->name ne "method_named";
327 return if $self->const_sv($constop)->PV ne "VERSION";
330 $lineseq = $version_op->sibling;
331 return if $lineseq->name ne "lineseq";
332 my $entersub = $lineseq->first->sibling;
333 if ($entersub->name eq "stub") {
334 return "use $module $version ();\n" if defined $version;
335 return "use $module ();\n";
337 return if $entersub->name ne "entersub";
339 # See if there are import arguments
342 my $svop = $entersub->first->sibling; # Skip over pushmark
343 return unless $self->const_sv($svop)->PV eq $module;
345 # Pull out the arguments
346 for ($svop=$svop->sibling; $svop->name ne "method_named";
347 $svop = $svop->sibling) {
348 $args .= ", " if length($args);
349 $args .= $self->deparse($svop, 6);
353 my $method_named = $svop;
354 return if $method_named->name ne "method_named";
355 my $method_name = $self->const_sv($method_named)->PV;
357 if ($method_name eq "unimport") {
361 # Certain pragmas are dealt with using hint bits,
362 # so we ignore them here
363 if ($module eq 'strict' || $module eq 'integer'
364 || $module eq 'bytes' || $module eq 'warnings') {
368 if (defined $version && length $args) {
369 return "$use $module $version ($args);\n";
370 } elsif (defined $version) {
371 return "$use $module $version;\n";
372 } elsif (length $args) {
373 return "$use $module ($args);\n";
375 return "$use $module;\n";
380 my ($self, $pack) = @_;
382 if (!defined $pack) {
387 $pack =~ s/(::)?$/::/;
391 my %stash = svref_2object($stash)->ARRAY;
392 while (my ($key, $val) = each %stash) {
393 next if $key eq 'main::'; # avoid infinite recursion
394 my $class = class($val);
395 if ($class eq "PV") {
396 # Just a prototype. As an ugly but fairly effective way
397 # to find out if it belongs here is to see if the AUTOLOAD
398 # (if any) for the stash was defined in one of our files.
399 my $A = $stash{"AUTOLOAD"};
400 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
401 && class($A->CV) eq "CV") {
403 next unless $AF eq $0 || exists $self->{'files'}{$AF};
405 push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV];
406 } elsif ($class eq "IV") {
407 # Just a name. As above.
408 my $A = $stash{"AUTOLOAD"};
409 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
410 && class($A->CV) eq "CV") {
412 next unless $AF eq $0 || exists $self->{'files'}{$AF};
414 push @{$self->{'protos_todo'}}, [$pack . $key, undef];
415 } elsif ($class eq "GV") {
416 if (class(my $cv = $val->CV) ne "SPECIAL") {
417 next if $self->{'subs_done'}{$$val}++;
418 next if $$val != ${$cv->GV}; # Ignore imposters
421 if (class(my $cv = $val->FORM) ne "SPECIAL") {
422 next if $self->{'forms_done'}{$$val}++;
423 next if $$val != ${$cv->GV}; # Ignore imposters
426 if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
427 $self->stash_subs($pack . $key);
437 foreach $ar (@{$self->{'protos_todo'}}) {
438 my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : "");
439 push @ret, "sub " . $ar->[0] . "$proto;\n";
441 delete $self->{'protos_todo'};
449 while (length($opt = substr($opts, 0, 1))) {
451 $self->{'cuddle'} = " ";
452 $opts = substr($opts, 1);
453 } elsif ($opt eq "i") {
454 $opts =~ s/^i(\d+)//;
455 $self->{'indent_size'} = $1;
456 } elsif ($opt eq "T") {
457 $self->{'use_tabs'} = 1;
458 $opts = substr($opts, 1);
459 } elsif ($opt eq "v") {
460 $opts =~ s/^v([^.]*)(.|$)//;
461 $self->{'ex_const'} = $1;
468 my $self = bless {}, $class;
469 $self->{'subs_todo'} = [];
470 $self->{'files'} = {};
471 $self->{'curstash'} = "main";
472 $self->{'curcop'} = undef;
473 $self->{'cuddle'} = "\n";
474 $self->{'indent_size'} = 4;
475 $self->{'use_tabs'} = 0;
476 $self->{'expand'} = 0;
477 $self->{'unquote'} = 0;
478 $self->{'linenums'} = 0;
479 $self->{'parens'} = 0;
480 $self->{'ex_const'} = "'???'";
482 $self->{'ambient_arybase'} = 0;
483 $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
484 $self->{'ambient_hints'} = 0;
487 while (my $arg = shift @_) {
488 if ($arg =~ /^-f(.*)/) {
489 $self->{'files'}{$1} = 1;
490 } elsif ($arg eq "-p") {
491 $self->{'parens'} = 1;
492 } elsif ($arg eq "-l") {
493 $self->{'linenums'} = 1;
494 } elsif ($arg eq "-q") {
495 $self->{'unquote'} = 1;
496 } elsif (substr($arg, 0, 2) eq "-s") {
497 $self->style_opts(substr $arg, 2);
498 } elsif ($arg =~ /^-x(\d)$/) {
499 $self->{'expand'} = $1;
506 # Mask out the bits that L<warnings::register> uses
509 $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
516 # Initialise the contextual information, either from
517 # defaults provided with the ambient_pragmas method,
518 # or from perl's own defaults otherwise.
522 $self->{'arybase'} = $self->{'ambient_arybase'};
523 $self->{'warnings'} = defined ($self->{'ambient_warnings'})
524 ? $self->{'ambient_warnings'} & WARN_MASK
526 $self->{'hints'} = $self->{'ambient_hints'} & 0xFF;
528 # also a convenient place to clear out subs_declared
529 delete $self->{'subs_declared'};
535 my $self = B::Deparse->new(@args);
536 # First deparse command-line args
537 if (defined $^I) { # deparse -i
538 print q(BEGIN { $^I = ).cstring($^I).qq(; }\n);
540 if ($^W) { # deparse -w
541 print qq(BEGIN { \$^W = $^W; }\n);
543 if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
544 my $fs = cstring($/) || 'undef';
545 my $bs = cstring($O::savebackslash) || 'undef';
546 print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
548 my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
549 my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
550 my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
551 for my $block (@BEGINs, @INITs, @ENDs) {
552 $self->todo($block, 0);
555 $self->{'curcv'} = main_cv;
556 $self->{'curcvlex'} = undef;
557 print $self->print_protos;
558 @{$self->{'subs_todo'}} =
559 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
560 print $self->indent($self->deparse(main_root, 0)), "\n"
561 unless null main_root;
563 while (scalar(@{$self->{'subs_todo'}})) {
564 push @text, $self->next_todo;
566 print $self->indent(join("", @text)), "\n" if @text;
568 # Print __DATA__ section, if necessary
570 my $laststash = defined $self->{'curcop'}
571 ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
572 if (defined *{$laststash."::DATA"}{IO}) {
574 print readline(*{$laststash."::DATA"});
582 croak "Usage: ->coderef2text(CODEREF)" unless ref($sub) eq "CODE";
585 return $self->indent($self->deparse_sub(svref_2object($sub)));
588 sub ambient_pragmas {
590 my ($arybase, $hint_bits, $warning_bits) = (0, 0);
596 if ($name eq 'strict') {
599 if ($val eq 'none') {
600 $hint_bits &= ~strict::bits(qw/refs subs vars/);
606 @names = qw/refs subs vars/;
612 @names = split' ', $val;
614 $hint_bits |= strict::bits(@names);
617 elsif ($name eq '$[') {
621 elsif ($name eq 'integer'
623 || $name eq 'utf8') {
626 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
629 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
633 elsif ($name eq 're') {
635 if ($val eq 'none') {
636 $hint_bits &= ~re::bits(qw/taint eval/);
642 @names = qw/taint eval/;
648 @names = split' ',$val;
650 $hint_bits |= re::bits(@names);
653 elsif ($name eq 'warnings') {
654 if ($val eq 'none') {
655 $warning_bits = $warnings::NONE;
664 @names = split/\s+/, $val;
667 $warning_bits = $warnings::NONE if !defined ($warning_bits);
668 $warning_bits |= warnings::bits(@names);
671 elsif ($name eq 'warning_bits') {
672 $warning_bits = $val;
675 elsif ($name eq 'hint_bits') {
680 croak "Unknown pragma type: $name";
684 croak "The ambient_pragmas method expects an even number of args";
687 $self->{'ambient_arybase'} = $arybase;
688 $self->{'ambient_warnings'} = $warning_bits;
689 $self->{'ambient_hints'} = $hint_bits;
694 my($op, $cx, $flags) = @_;
696 Carp::confess("Null op in deparse") if !defined($op)
697 || class($op) eq "NULL";
698 my $meth = "pp_" . $op->name;
700 return $self->$meth($op, $cx, $flags);
702 return $self->$meth($op, $cx);
708 my @lines = split(/\n/, $txt);
713 my $cmd = substr($line, 0, 1);
714 if ($cmd eq "\t" or $cmd eq "\b") {
715 $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
716 if ($self->{'use_tabs'}) {
717 $leader = "\t" x ($level / 8) . " " x ($level % 8);
719 $leader = " " x $level;
721 $line = substr($line, 1);
723 if (substr($line, 0, 1) eq "\f") {
724 $line = substr($line, 1); # no indent
726 $line = $leader . $line;
730 return join("\n", @lines);
737 Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
738 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
739 local $self->{'curcop'} = $self->{'curcop'};
740 if ($cv->FLAGS & SVf_POK) {
741 $proto = "(". $cv->PV . ") ";
743 if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
745 $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
746 $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
747 $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
750 local($self->{'curcv'}) = $cv;
751 local($self->{'curcvlex'});
752 local(@$self{qw'curstash warnings hints'})
753 = @$self{qw'curstash warnings hints'};
755 if (not null $cv->ROOT) {
756 my $lineseq = $cv->ROOT->first;
757 if ($lineseq->name eq "lineseq") {
759 for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
762 $body = $self->lineseq(undef, @ops).";";
763 my $scope_en = $self->find_scope_en($lineseq);
764 if (defined $scope_en) {
765 my $subs = join"", $self->seq_subs($scope_en);
766 $body .= ";\n$subs" if length($subs);
770 $body = $self->deparse($cv->ROOT->first, 0);
774 my $sv = $cv->const_sv;
776 # uh-oh. inlinable sub... format it differently
777 return $proto . "{ " . const($sv) . " }\n";
778 } else { # XSUB? (or just a declaration)
782 return $proto ."{\n\t$body\n\b}" ."\n";
789 local($self->{'curcv'}) = $form;
790 local($self->{'curcvlex'});
791 local($self->{'in_format'}) = 1;
792 local(@$self{qw'curstash warnings hints'})
793 = @$self{qw'curstash warnings hints'};
794 my $op = $form->ROOT;
796 return "\f." if $op->first->name eq 'stub';
797 $op = $op->first->first; # skip leavewrite, lineseq
798 while (not null $op) {
799 $op = $op->sibling; # skip nextstate
801 $kid = $op->first->sibling; # skip pushmark
802 push @text, "\f".$self->const_sv($kid)->PV;
803 $kid = $kid->sibling;
804 for (; not null $kid; $kid = $kid->sibling) {
805 push @exprs, $self->deparse($kid, 0);
807 push @text, "\f".join(", ", @exprs)."\n" if @exprs;
810 return join("", @text) . "\f.";
815 return $op->name eq "leave" || $op->name eq "scope"
816 || $op->name eq "lineseq"
817 || ($op->name eq "null" && class($op) eq "UNOP"
818 && (is_scope($op->first) || $op->first->name eq "enter"));
822 my $name = $_[0]->name;
823 return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
826 sub is_miniwhile { # check for one-line loop (`foo() while $y--')
828 return (!null($op) and null($op->sibling)
829 and $op->name eq "null" and class($op) eq "UNOP"
830 and (($op->first->name =~ /^(and|or)$/
831 and $op->first->first->sibling->name eq "lineseq")
832 or ($op->first->name eq "lineseq"
833 and not null $op->first->first->sibling
834 and $op->first->first->sibling->name eq "unstack")
840 return ($op->name eq "rv2sv" or
841 $op->name eq "padsv" or
842 $op->name eq "gv" or # only in array/hash constructs
843 $op->flags & OPf_KIDS && !null($op->first)
844 && $op->first->name eq "gvsv");
849 my($text, $cx, $prec) = @_;
850 if ($prec < $cx # unary ops nest just fine
851 or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
852 or $self->{'parens'})
855 # In a unop, let parent reuse our parens; see maybe_parens_unop
856 $text = "\cS" . $text if $cx == 16;
863 # same as above, but get around the `if it looks like a function' rule
864 sub maybe_parens_unop {
866 my($name, $kid, $cx) = @_;
867 if ($cx > 16 or $self->{'parens'}) {
868 $kid = $self->deparse($kid, 1);
869 if ($name eq "umask" && $kid =~ /^\d+$/) {
870 $kid = sprintf("%#o", $kid);
872 return "$name($kid)";
874 $kid = $self->deparse($kid, 16);
875 if ($name eq "umask" && $kid =~ /^\d+$/) {
876 $kid = sprintf("%#o", $kid);
878 if (substr($kid, 0, 1) eq "\cS") {
880 return $name . substr($kid, 1);
881 } elsif (substr($kid, 0, 1) eq "(") {
882 # avoid looks-like-a-function trap with extra parens
883 # (`+' can lead to ambiguities)
884 return "$name(" . $kid . ")";
891 sub maybe_parens_func {
893 my($func, $text, $cx, $prec) = @_;
894 if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
895 return "$func($text)";
897 return "$func $text";
903 my($op, $cx, $text) = @_;
904 my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
905 if ($op->private & (OPpLVAL_INTRO|$our_intro)
906 and not $self->{'avoid_local'}{$$op}) {
907 my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
908 if (want_scalar($op)) {
909 return "$our_local $text";
911 return $self->maybe_parens_func("$our_local", $text, $cx, 16);
920 my($op, $cx, $func, @args) = @_;
921 if ($op->private & OPpTARGET_MY) {
922 my $var = $self->padname($op->targ);
923 my $val = $func->($self, $op, 7, @args);
924 return $self->maybe_parens("$var = $val", $cx, 7);
926 return $func->($self, $op, $cx, @args);
933 return (($self->{'curcv'}->PADLIST->ARRAY)[0]->ARRAY)[$targ];
938 my($op, $cx, $text) = @_;
939 if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
940 if (want_scalar($op)) {
943 return $self->maybe_parens_func("my", $text, $cx, 16);
950 # The following OPs don't have functions:
952 # pp_padany -- does not exist after parsing
954 sub pp_enter { # see also leave
955 carp "unexpected OP_ENTER";
959 sub pp_pushmark { # see also list
960 carp "unexpected OP_PUSHMARK";
964 sub pp_leavesub { # see also deparse_sub
965 carp "unexpected OP_LEAVESUB";
969 sub pp_leavewrite { # see also deparse_format
970 carp "unexpected OP_LEAVEWRITE";
974 sub pp_method { # see also entersub
975 carp "unexpected OP_METHOD";
979 sub pp_regcmaybe { # see also regcomp
980 carp "unexpected OP_REGCMAYBE";
984 sub pp_regcreset { # see also regcomp
985 carp "unexpected OP_REGCRESET";
989 sub pp_substcont { # see also subst
990 carp "unexpected OP_SUBSTCONT";
994 sub pp_grepstart { # see also grepwhile
995 carp "unexpected OP_GREPSTART";
999 sub pp_mapstart { # see also mapwhile
1000 carp "unexpected OP_MAPSTART";
1004 sub pp_method_named {
1005 carp "unexpected OP_METHOD_NAMED";
1009 sub pp_flip { # see also flop
1010 carp "unexpected OP_FLIP";
1014 sub pp_iter { # see also leaveloop
1015 carp "unexpected OP_ITER";
1019 sub pp_enteriter { # see also leaveloop
1020 carp "unexpected OP_ENTERITER";
1024 sub pp_enterloop { # see also leaveloop
1025 carp "unexpected OP_ENTERLOOP";
1029 sub pp_leaveeval { # see also entereval
1030 carp "unexpected OP_LEAVEEVAL";
1034 sub pp_entertry { # see also leavetry
1035 carp "unexpected OP_ENTERTRY";
1039 # $root should be the op which represents the root of whatever
1040 # we're sequencing here. If it's undefined, then we don't append
1041 # any subroutine declarations to the deparsed ops, otherwise we
1042 # append appropriate declarations.
1044 my($self, $root, @ops) = @_;
1047 my $out_cop = $self->{'curcop'};
1048 my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
1050 if (defined $root) {
1051 $limit_seq = $out_seq;
1052 my $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
1053 $limit_seq = $nseq if !defined($limit_seq)
1054 or defined($nseq) && $nseq < $limit_seq;
1056 $limit_seq = $self->{'limit_seq'}
1057 if defined($self->{'limit_seq'})
1058 && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
1059 local $self->{'limit_seq'} = $limit_seq;
1060 for (my $i = 0; $i < @ops; $i++) {
1062 if (is_state $ops[$i]) {
1063 $expr = $self->deparse($ops[$i], 0);
1070 if (!is_state $ops[$i] and (my $ls = $ops[$i+1]) and
1071 !null($ops[$i+1]) and $ops[$i+1]->name eq "lineseq")
1073 if ($ls->first && !null($ls->first) && is_state($ls->first)
1074 && (my $sib = $ls->first->sibling)) {
1075 if (!null($sib) && $sib->name eq "leaveloop") {
1076 push @exprs, $expr . $self->for_loop($ops[$i], 0);
1082 $expr .= $self->deparse($ops[$i], 0, (@ops != 1));
1083 $expr =~ s/;\n?\z//;
1086 my $body = join(";\n", grep {length} @exprs);
1088 if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
1089 $subs = join "\n", $self->seq_subs($limit_seq);
1091 return join(";\n", grep {length} $body, $subs);
1095 my($real_block, $self, $op, $cx, $flags) = @_;
1099 local(@$self{qw'curstash warnings hints'})
1100 = @$self{qw'curstash warnings hints'} if $real_block;
1102 $kid = $op->first->sibling; # skip enter
1103 if (is_miniwhile($kid)) {
1104 my $top = $kid->first;
1105 my $name = $top->name;
1106 if ($name eq "and") {
1108 } elsif ($name eq "or") {
1110 } else { # no conditional -> while 1 or until 0
1111 return $self->deparse($top->first, 1) . " while 1";
1113 my $cond = $top->first;
1114 my $body = $cond->sibling->first; # skip lineseq
1115 $cond = $self->deparse($cond, 1);
1116 $body = $self->deparse($body, 1);
1117 return "$body $name $cond";
1122 for (; !null($kid); $kid = $kid->sibling) {
1125 if ($flags || $cx > 0) { # inside an expression, (a do {} while for lineseq)
1126 return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
1128 my $lineseq = $self->lineseq($op, @kids);
1129 return (length ($lineseq) ? "$lineseq;" : "");
1133 sub pp_scope { scopeop(0, @_); }
1134 sub pp_lineseq { scopeop(0, @_); }
1135 sub pp_leave { scopeop(1, @_); }
1137 # The BEGIN {} is used here because otherwise this code isn't executed
1138 # when you run B::Deparse on itself.
1140 BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1141 "ENV", "ARGV", "ARGVOUT", "_"); }
1146 Carp::confess() if $gv->isa("B::CV");
1147 my $stash = $gv->STASH->NAME;
1148 my $name = $gv->SAFENAME;
1149 if ($stash eq $self->{'curstash'} or $globalnames{$name}
1150 or $name =~ /^[^A-Za-z_]/)
1154 $stash = $stash . "::";
1156 if ($name =~ /^(\^..|{)/) {
1157 $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
1159 return $stash . $name;
1162 # Return the name to use for a stash variable.
1163 # If a lexical with the same name is in scope, it may need to be
1165 sub stash_variable {
1166 my ($self, $prefix, $name) = @_;
1168 return "$prefix$name" if $name =~ /::/;
1170 unless ($prefix eq '$' || $prefix eq '@' ||
1171 $prefix eq '%' || $prefix eq '$#') {
1172 return "$prefix$name";
1175 my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1176 return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
1177 return "$prefix$name";
1181 my ($self, $name) = @_;
1182 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1184 return 0 if !defined($self->{'curcop'});
1185 my $seq = $self->{'curcop'}->cop_seq;
1186 return 0 if !exists $self->{'curcvlex'}{$name};
1187 for my $a (@{$self->{'curcvlex'}{$name}}) {
1188 my ($st, $en) = @$a;
1189 return 1 if $seq > $st && $seq <= $en;
1194 sub populate_curcvlex {
1196 for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
1197 my @padlist = $cv->PADLIST->ARRAY;
1198 my @ns = $padlist[0]->ARRAY;
1200 for (my $i=0; $i<@ns; ++$i) {
1201 next if class($ns[$i]) eq "SPECIAL";
1202 next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars
1203 if (class($ns[$i]) eq "PV") {
1204 # Probably that pesky lexical @_
1207 my $name = $ns[$i]->PVX;
1208 my $seq_st = $ns[$i]->NVX;
1209 my $seq_en = int($ns[$i]->IVX);
1211 push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
1216 sub find_scope_st { ((find_scope(@_))[0]); }
1217 sub find_scope_en { ((find_scope(@_))[1]); }
1219 # Recurses down the tree, looking for pad variable introductions and COPs
1221 my ($self, $op, $scope_st, $scope_en) = @_;
1222 carp("Undefined op in find_scope") if !defined $op;
1223 return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1225 for (my $o=$op->first; $$o; $o=$o->sibling) {
1226 if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1227 my $s = int($self->padname_sv($o->targ)->NVX);
1228 my $e = $self->padname_sv($o->targ)->IVX;
1229 $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1230 $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1232 elsif (is_state($o)) {
1233 my $c = $o->cop_seq;
1234 $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1235 $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1237 elsif ($o->flags & OPf_KIDS) {
1238 ($scope_st, $scope_en) =
1239 $self->find_scope($o, $scope_st, $scope_en)
1243 return ($scope_st, $scope_en);
1246 # Returns a list of subs which should be inserted before the COP
1248 my ($self, $op, $out_seq) = @_;
1249 my $seq = $op->cop_seq;
1250 # If we have nephews, then our sequence number indicates
1251 # the cop_seq of the end of some sort of scope.
1252 if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
1253 and my $nseq = $self->find_scope_st($op->sibling) ) {
1256 $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1257 return $self->seq_subs($seq);
1261 my ($self, $seq) = @_;
1263 #push @text, "# ($seq)\n";
1265 return "" if !defined $seq;
1266 while (scalar(@{$self->{'subs_todo'}})
1267 and $seq > $self->{'subs_todo'}[0][0]) {
1268 push @text, $self->next_todo;
1273 # Notice how subs and formats are inserted between statements here;
1274 # also $[ assignments and pragmas.
1278 $self->{'curcop'} = $op;
1280 push @text, $self->cop_subs($op);
1281 push @text, $op->label . ": " if $op->label;
1282 my $stash = $op->stashpv;
1283 if ($stash ne $self->{'curstash'}) {
1284 push @text, "package $stash;\n";
1285 $self->{'curstash'} = $stash;
1287 if ($self->{'linenums'}) {
1288 push @text, "\f#line " . $op->line .
1289 ' "' . $op->file, qq'"\n';
1292 if ($self->{'arybase'} != $op->arybase) {
1293 push @text, '$[ = '. $op->arybase .";\n";
1294 $self->{'arybase'} = $op->arybase;
1297 my $warnings = $op->warnings;
1299 if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
1300 $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
1302 elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
1303 $warning_bits = $warnings::NONE;
1305 elsif ($warnings->isa("B::SPECIAL")) {
1306 $warning_bits = undef;
1309 $warning_bits = $warnings->PV & WARN_MASK;
1312 if (defined ($warning_bits) and
1313 !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
1314 push @text, declare_warnings($self->{'warnings'}, $warning_bits);
1315 $self->{'warnings'} = $warning_bits;
1318 if ($self->{'hints'} != $op->private) {
1319 push @text, declare_hints($self->{'hints'}, $op->private);
1320 $self->{'hints'} = $op->private;
1323 return join("", @text);
1326 sub declare_warnings {
1327 my ($from, $to) = @_;
1328 if (($to & WARN_MASK) eq warnings::bits("all")) {
1329 return "use warnings;\n";
1331 elsif (($to & WARN_MASK) eq "\0"x length($to)) {
1332 return "no warnings;\n";
1334 return "BEGIN {\${^WARNING_BITS} = ".cstring($to)."}\n";
1338 my ($from, $to) = @_;
1339 my $use = $to & ~$from;
1340 my $no = $from & ~$to;
1342 for my $pragma (hint_pragmas($use)) {
1343 $decls .= "use $pragma;\n";
1345 for my $pragma (hint_pragmas($no)) {
1346 $decls .= "no $pragma;\n";
1354 push @pragmas, "integer" if $bits & 0x1;
1355 push @pragmas, "strict 'refs'" if $bits & 0x2;
1356 push @pragmas, "bytes" if $bits & 0x8;
1360 sub pp_dbstate { pp_nextstate(@_) }
1361 sub pp_setstate { pp_nextstate(@_) }
1363 sub pp_unstack { return "" } # see also leaveloop
1367 my($op, $cx, $name) = @_;
1373 my($op, $cx, $name) = @_;
1381 sub pp_wantarray { baseop(@_, "wantarray") }
1382 sub pp_fork { baseop(@_, "fork") }
1383 sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
1384 sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
1385 sub pp_time { maybe_targmy(@_, \&baseop, "time") }
1386 sub pp_tms { baseop(@_, "times") }
1387 sub pp_ghostent { baseop(@_, "gethostent") }
1388 sub pp_gnetent { baseop(@_, "getnetent") }
1389 sub pp_gprotoent { baseop(@_, "getprotoent") }
1390 sub pp_gservent { baseop(@_, "getservent") }
1391 sub pp_ehostent { baseop(@_, "endhostent") }
1392 sub pp_enetent { baseop(@_, "endnetent") }
1393 sub pp_eprotoent { baseop(@_, "endprotoent") }
1394 sub pp_eservent { baseop(@_, "endservent") }
1395 sub pp_gpwent { baseop(@_, "getpwent") }
1396 sub pp_spwent { baseop(@_, "setpwent") }
1397 sub pp_epwent { baseop(@_, "endpwent") }
1398 sub pp_ggrent { baseop(@_, "getgrent") }
1399 sub pp_sgrent { baseop(@_, "setgrent") }
1400 sub pp_egrent { baseop(@_, "endgrent") }
1401 sub pp_getlogin { baseop(@_, "getlogin") }
1403 sub POSTFIX () { 1 }
1405 # I couldn't think of a good short name, but this is the category of
1406 # symbolic unary operators with interesting precedence
1410 my($op, $cx, $name, $prec, $flags) = (@_, 0);
1411 my $kid = $op->first;
1412 $kid = $self->deparse($kid, $prec);
1413 return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
1417 sub pp_preinc { pfixop(@_, "++", 23) }
1418 sub pp_predec { pfixop(@_, "--", 23) }
1419 sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1420 sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1421 sub pp_i_preinc { pfixop(@_, "++", 23) }
1422 sub pp_i_predec { pfixop(@_, "--", 23) }
1423 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1424 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1425 sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
1427 sub pp_negate { maybe_targmy(@_, \&real_negate) }
1431 if ($op->first->name =~ /^(i_)?negate$/) {
1433 $self->pfixop($op, $cx, "-", 21.5);
1435 $self->pfixop($op, $cx, "-", 21);
1438 sub pp_i_negate { pp_negate(@_) }
1444 $self->pfixop($op, $cx, "not ", 4);
1446 $self->pfixop($op, $cx, "!", 21);
1452 my($op, $cx, $name) = @_;
1454 if ($op->flags & OPf_KIDS) {
1456 if (defined prototype("CORE::$name")
1457 && prototype("CORE::$name") =~ /^;?\*/
1458 && $kid->name eq "rv2gv") {
1462 return $self->maybe_parens_unop($name, $kid, $cx);
1464 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1468 sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
1469 sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
1470 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
1471 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
1472 sub pp_defined { unop(@_, "defined") }
1473 sub pp_undef { unop(@_, "undef") }
1474 sub pp_study { unop(@_, "study") }
1475 sub pp_ref { unop(@_, "ref") }
1476 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
1478 sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
1479 sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
1480 sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
1481 sub pp_srand { unop(@_, "srand") }
1482 sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
1483 sub pp_log { maybe_targmy(@_, \&unop, "log") }
1484 sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
1485 sub pp_int { maybe_targmy(@_, \&unop, "int") }
1486 sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
1487 sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
1488 sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
1490 sub pp_length { maybe_targmy(@_, \&unop, "length") }
1491 sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
1492 sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
1494 sub pp_each { unop(@_, "each") }
1495 sub pp_values { unop(@_, "values") }
1496 sub pp_keys { unop(@_, "keys") }
1497 sub pp_pop { unop(@_, "pop") }
1498 sub pp_shift { unop(@_, "shift") }
1500 sub pp_caller { unop(@_, "caller") }
1501 sub pp_reset { unop(@_, "reset") }
1502 sub pp_exit { unop(@_, "exit") }
1503 sub pp_prototype { unop(@_, "prototype") }
1505 sub pp_close { unop(@_, "close") }
1506 sub pp_fileno { unop(@_, "fileno") }
1507 sub pp_umask { unop(@_, "umask") }
1508 sub pp_untie { unop(@_, "untie") }
1509 sub pp_tied { unop(@_, "tied") }
1510 sub pp_dbmclose { unop(@_, "dbmclose") }
1511 sub pp_getc { unop(@_, "getc") }
1512 sub pp_eof { unop(@_, "eof") }
1513 sub pp_tell { unop(@_, "tell") }
1514 sub pp_getsockname { unop(@_, "getsockname") }
1515 sub pp_getpeername { unop(@_, "getpeername") }
1517 sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
1518 sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
1519 sub pp_readlink { unop(@_, "readlink") }
1520 sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
1521 sub pp_readdir { unop(@_, "readdir") }
1522 sub pp_telldir { unop(@_, "telldir") }
1523 sub pp_rewinddir { unop(@_, "rewinddir") }
1524 sub pp_closedir { unop(@_, "closedir") }
1525 sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
1526 sub pp_localtime { unop(@_, "localtime") }
1527 sub pp_gmtime { unop(@_, "gmtime") }
1528 sub pp_alarm { unop(@_, "alarm") }
1529 sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
1531 sub pp_dofile { unop(@_, "do") }
1532 sub pp_entereval { unop(@_, "eval") }
1534 sub pp_ghbyname { unop(@_, "gethostbyname") }
1535 sub pp_gnbyname { unop(@_, "getnetbyname") }
1536 sub pp_gpbyname { unop(@_, "getprotobyname") }
1537 sub pp_shostent { unop(@_, "sethostent") }
1538 sub pp_snetent { unop(@_, "setnetent") }
1539 sub pp_sprotoent { unop(@_, "setprotoent") }
1540 sub pp_sservent { unop(@_, "setservent") }
1541 sub pp_gpwnam { unop(@_, "getpwnam") }
1542 sub pp_gpwuid { unop(@_, "getpwuid") }
1543 sub pp_ggrnam { unop(@_, "getgrnam") }
1544 sub pp_ggrgid { unop(@_, "getgrgid") }
1546 sub pp_lock { unop(@_, "lock") }
1552 if ($op->private & OPpEXISTS_SUB) {
1553 # Checking for the existence of a subroutine
1554 return $self->maybe_parens_func("exists",
1555 $self->pp_rv2cv($op->first, 16), $cx, 16);
1557 if ($op->flags & OPf_SPECIAL) {
1558 # Array element, not hash element
1559 return $self->maybe_parens_func("exists",
1560 $self->pp_aelem($op->first, 16), $cx, 16);
1562 return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
1570 if ($op->private & OPpSLICE) {
1571 if ($op->flags & OPf_SPECIAL) {
1572 # Deleting from an array, not a hash
1573 return $self->maybe_parens_func("delete",
1574 $self->pp_aslice($op->first, 16),
1577 return $self->maybe_parens_func("delete",
1578 $self->pp_hslice($op->first, 16),
1581 if ($op->flags & OPf_SPECIAL) {
1582 # Deleting from an array, not a hash
1583 return $self->maybe_parens_func("delete",
1584 $self->pp_aelem($op->first, 16),
1587 return $self->maybe_parens_func("delete",
1588 $self->pp_helem($op->first, 16),
1596 if (class($op) eq "UNOP" and $op->first->name eq "const"
1597 and $op->first->private & OPpCONST_BARE)
1599 my $name = $self->const_sv($op->first)->PV;
1602 return "require $name";
1604 $self->unop($op, $cx, "require");
1611 my $kid = $op->first;
1612 if (not null $kid->sibling) {
1613 # XXX Was a here-doc
1614 return $self->dquote($op);
1616 $self->unop(@_, "scalar");
1623 return (($self->{'curcv'}->PADLIST->ARRAY)[1]->ARRAY)[$targ];
1629 my $kid = $op->first;
1630 if ($kid->name eq "null") {
1632 if ($kid->name eq "anonlist" || $kid->name eq "anonhash") {
1633 my($pre, $post) = @{{"anonlist" => ["[","]"],
1634 "anonhash" => ["{","}"]}->{$kid->name}};
1636 $kid = $kid->first->sibling; # skip pushmark
1637 for (; !null($kid); $kid = $kid->sibling) {
1638 $expr = $self->deparse($kid, 6);
1641 return $pre . join(", ", @exprs) . $post;
1642 } elsif (!null($kid->sibling) and
1643 $kid->sibling->name eq "anoncode") {
1645 $self->deparse_sub($self->padval($kid->sibling->targ));
1646 } elsif ($kid->name eq "pushmark") {
1647 my $sib_name = $kid->sibling->name;
1648 if ($sib_name =~ /^(pad|rv2)[ah]v$/
1649 and not $kid->sibling->flags & OPf_REF)
1651 # The @a in \(@a) isn't in ref context, but only when the
1653 return "\\(" . $self->deparse($kid->sibling, 1) . ")";
1654 } elsif ($sib_name eq 'entersub') {
1655 my $text = $self->deparse($kid->sibling, 1);
1656 # Always show parens for \(&func()), but only with -p otherwise
1657 $text = "($text)" if $self->{'parens'}
1658 or $kid->sibling->private & OPpENTERSUB_AMPER;
1663 $self->pfixop($op, $cx, "\\", 20);
1666 sub pp_srefgen { pp_refgen(@_) }
1671 my $kid = $op->first;
1672 $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
1673 return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
1674 return $self->unop($op, $cx, "readline");
1680 return "<" . $self->gv_name($op->gv) . ">";
1683 # Unary operators that can occur as pseudo-listops inside double quotes
1686 my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
1688 if ($op->flags & OPf_KIDS) {
1690 # If there's more than one kid, the first is an ex-pushmark.
1691 $kid = $kid->sibling if not null $kid->sibling;
1692 return $self->maybe_parens_unop($name, $kid, $cx);
1694 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
1698 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
1699 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
1700 sub pp_uc { dq_unop(@_, "uc") }
1701 sub pp_lc { dq_unop(@_, "lc") }
1702 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
1706 my ($op, $cx, $name) = @_;
1707 if (class($op) eq "PVOP") {
1708 return "$name " . $op->pv;
1709 } elsif (class($op) eq "OP") {
1711 } elsif (class($op) eq "UNOP") {
1712 # Note -- loop exits are actually exempt from the
1713 # looks-like-a-func rule, but a few extra parens won't hurt
1714 return $self->maybe_parens_unop($name, $op->first, $cx);
1718 sub pp_last { loopex(@_, "last") }
1719 sub pp_next { loopex(@_, "next") }
1720 sub pp_redo { loopex(@_, "redo") }
1721 sub pp_goto { loopex(@_, "goto") }
1722 sub pp_dump { loopex(@_, "dump") }
1726 my($op, $cx, $name) = @_;
1727 if (class($op) eq "UNOP") {
1728 # Genuine `-X' filetests are exempt from the LLAFR, but not
1729 # l?stat(); for the sake of clarity, give'em all parens
1730 return $self->maybe_parens_unop($name, $op->first, $cx);
1731 } elsif (class($op) eq "SVOP") {
1732 return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
1733 } else { # I don't think baseop filetests ever survive ck_ftst, but...
1738 sub pp_lstat { ftst(@_, "lstat") }
1739 sub pp_stat { ftst(@_, "stat") }
1740 sub pp_ftrread { ftst(@_, "-R") }
1741 sub pp_ftrwrite { ftst(@_, "-W") }
1742 sub pp_ftrexec { ftst(@_, "-X") }
1743 sub pp_fteread { ftst(@_, "-r") }
1744 sub pp_ftewrite { ftst(@_, "-w") }
1745 sub pp_fteexec { ftst(@_, "-x") }
1746 sub pp_ftis { ftst(@_, "-e") }
1747 sub pp_fteowned { ftst(@_, "-O") }
1748 sub pp_ftrowned { ftst(@_, "-o") }
1749 sub pp_ftzero { ftst(@_, "-z") }
1750 sub pp_ftsize { ftst(@_, "-s") }
1751 sub pp_ftmtime { ftst(@_, "-M") }
1752 sub pp_ftatime { ftst(@_, "-A") }
1753 sub pp_ftctime { ftst(@_, "-C") }
1754 sub pp_ftsock { ftst(@_, "-S") }
1755 sub pp_ftchr { ftst(@_, "-c") }
1756 sub pp_ftblk { ftst(@_, "-b") }
1757 sub pp_ftfile { ftst(@_, "-f") }
1758 sub pp_ftdir { ftst(@_, "-d") }
1759 sub pp_ftpipe { ftst(@_, "-p") }
1760 sub pp_ftlink { ftst(@_, "-l") }
1761 sub pp_ftsuid { ftst(@_, "-u") }
1762 sub pp_ftsgid { ftst(@_, "-g") }
1763 sub pp_ftsvtx { ftst(@_, "-k") }
1764 sub pp_fttty { ftst(@_, "-t") }
1765 sub pp_fttext { ftst(@_, "-T") }
1766 sub pp_ftbinary { ftst(@_, "-B") }
1768 sub SWAP_CHILDREN () { 1 }
1769 sub ASSIGN () { 2 } # has OP= variant
1770 sub LIST_CONTEXT () { 4 } # Assignment is in list context
1776 my $name = $op->name;
1777 if ($name eq "concat" and $op->first->name eq "concat") {
1778 # avoid spurious `=' -- see comment in pp_concat
1781 if ($name eq "null" and class($op) eq "UNOP"
1782 and $op->first->name =~ /^(and|x?or)$/
1783 and null $op->first->sibling)
1785 # Like all conditional constructs, OP_ANDs and OP_ORs are topped
1786 # with a null that's used as the common end point of the two
1787 # flows of control. For precedence purposes, ignore it.
1788 # (COND_EXPRs have these too, but we don't bother with
1789 # their associativity).
1790 return assoc_class($op->first);
1792 return $name . ($op->flags & OPf_STACKED ? "=" : "");
1795 # Left associative operators, like `+', for which
1796 # $a + $b + $c is equivalent to ($a + $b) + $c
1799 %left = ('multiply' => 19, 'i_multiply' => 19,
1800 'divide' => 19, 'i_divide' => 19,
1801 'modulo' => 19, 'i_modulo' => 19,
1803 'add' => 18, 'i_add' => 18,
1804 'subtract' => 18, 'i_subtract' => 18,
1806 'left_shift' => 17, 'right_shift' => 17,
1808 'bit_or' => 12, 'bit_xor' => 12,
1810 'or' => 2, 'xor' => 2,
1814 sub deparse_binop_left {
1816 my($op, $left, $prec) = @_;
1817 if ($left{assoc_class($op)} && $left{assoc_class($left)}
1818 and $left{assoc_class($op)} == $left{assoc_class($left)})
1820 return $self->deparse($left, $prec - .00001);
1822 return $self->deparse($left, $prec);
1826 # Right associative operators, like `=', for which
1827 # $a = $b = $c is equivalent to $a = ($b = $c)
1830 %right = ('pow' => 22,
1831 'sassign=' => 7, 'aassign=' => 7,
1832 'multiply=' => 7, 'i_multiply=' => 7,
1833 'divide=' => 7, 'i_divide=' => 7,
1834 'modulo=' => 7, 'i_modulo=' => 7,
1836 'add=' => 7, 'i_add=' => 7,
1837 'subtract=' => 7, 'i_subtract=' => 7,
1839 'left_shift=' => 7, 'right_shift=' => 7,
1841 'bit_or=' => 7, 'bit_xor=' => 7,
1847 sub deparse_binop_right {
1849 my($op, $right, $prec) = @_;
1850 if ($right{assoc_class($op)} && $right{assoc_class($right)}
1851 and $right{assoc_class($op)} == $right{assoc_class($right)})
1853 return $self->deparse($right, $prec - .00001);
1855 return $self->deparse($right, $prec);
1861 my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
1862 my $left = $op->first;
1863 my $right = $op->last;
1865 if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
1869 if ($flags & SWAP_CHILDREN) {
1870 ($left, $right) = ($right, $left);
1872 $left = $self->deparse_binop_left($op, $left, $prec);
1873 $left = "($left)" if $flags & LIST_CONTEXT
1874 && $left !~ /^(my|our|local|)[\@\(]/;
1875 $right = $self->deparse_binop_right($op, $right, $prec);
1876 return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
1879 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
1880 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
1881 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
1882 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
1883 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
1884 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
1885 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
1886 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
1887 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
1888 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
1889 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
1891 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
1892 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
1893 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
1894 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
1895 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
1897 sub pp_eq { binop(@_, "==", 14) }
1898 sub pp_ne { binop(@_, "!=", 14) }
1899 sub pp_lt { binop(@_, "<", 15) }
1900 sub pp_gt { binop(@_, ">", 15) }
1901 sub pp_ge { binop(@_, ">=", 15) }
1902 sub pp_le { binop(@_, "<=", 15) }
1903 sub pp_ncmp { binop(@_, "<=>", 14) }
1904 sub pp_i_eq { binop(@_, "==", 14) }
1905 sub pp_i_ne { binop(@_, "!=", 14) }
1906 sub pp_i_lt { binop(@_, "<", 15) }
1907 sub pp_i_gt { binop(@_, ">", 15) }
1908 sub pp_i_ge { binop(@_, ">=", 15) }
1909 sub pp_i_le { binop(@_, "<=", 15) }
1910 sub pp_i_ncmp { binop(@_, "<=>", 14) }
1912 sub pp_seq { binop(@_, "eq", 14) }
1913 sub pp_sne { binop(@_, "ne", 14) }
1914 sub pp_slt { binop(@_, "lt", 15) }
1915 sub pp_sgt { binop(@_, "gt", 15) }
1916 sub pp_sge { binop(@_, "ge", 15) }
1917 sub pp_sle { binop(@_, "le", 15) }
1918 sub pp_scmp { binop(@_, "cmp", 14) }
1920 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
1921 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
1923 # `.' is special because concats-of-concats are optimized to save copying
1924 # by making all but the first concat stacked. The effect is as if the
1925 # programmer had written `($a . $b) .= $c', except legal.
1926 sub pp_concat { maybe_targmy(@_, \&real_concat) }
1930 my $left = $op->first;
1931 my $right = $op->last;
1934 if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
1938 $left = $self->deparse_binop_left($op, $left, $prec);
1939 $right = $self->deparse_binop_right($op, $right, $prec);
1940 return $self->maybe_parens("$left .$eq $right", $cx, $prec);
1943 # `x' is weird when the left arg is a list
1947 my $left = $op->first;
1948 my $right = $op->last;
1951 if ($op->flags & OPf_STACKED) {
1955 if (null($right)) { # list repeat; count is inside left-side ex-list
1956 my $kid = $left->first->sibling; # skip pushmark
1958 for (; !null($kid->sibling); $kid = $kid->sibling) {
1959 push @exprs, $self->deparse($kid, 6);
1962 $left = "(" . join(", ", @exprs). ")";
1964 $left = $self->deparse_binop_left($op, $left, $prec);
1966 $right = $self->deparse_binop_right($op, $right, $prec);
1967 return $self->maybe_parens("$left x$eq $right", $cx, $prec);
1972 my ($op, $cx, $type) = @_;
1973 my $left = $op->first;
1974 my $right = $left->sibling;
1975 $left = $self->deparse($left, 9);
1976 $right = $self->deparse($right, 9);
1977 return $self->maybe_parens("$left $type $right", $cx, 9);
1983 my $flip = $op->first;
1984 my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
1985 return $self->range($flip->first, $cx, $type);
1988 # one-line while/until is handled in pp_leave
1992 my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
1993 my $left = $op->first;
1994 my $right = $op->first->sibling;
1995 if ($cx == 0 and is_scope($right) and $blockname
1996 and $self->{'expand'} < 7)
1998 $left = $self->deparse($left, 1);
1999 $right = $self->deparse($right, 0);
2000 return "$blockname ($left) {\n\t$right\n\b}\cK";
2001 } elsif ($cx == 0 and $blockname and not $self->{'parens'}
2002 and $self->{'expand'} < 7) { # $b if $a
2003 $right = $self->deparse($right, 1);
2004 $left = $self->deparse($left, 1);
2005 return "$right $blockname $left";
2006 } elsif ($cx > $lowprec and $highop) { # $a && $b
2007 $left = $self->deparse_binop_left($op, $left, $highprec);
2008 $right = $self->deparse_binop_right($op, $right, $highprec);
2009 return $self->maybe_parens("$left $highop $right", $cx, $highprec);
2010 } else { # $a and $b
2011 $left = $self->deparse_binop_left($op, $left, $lowprec);
2012 $right = $self->deparse_binop_right($op, $right, $lowprec);
2013 return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
2017 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
2018 sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
2020 # xor is syntactically a logop, but it's really a binop (contrary to
2021 # old versions of opcode.pl). Syntax is what matters here.
2022 sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
2026 my ($op, $cx, $opname) = @_;
2027 my $left = $op->first;
2028 my $right = $op->first->sibling->first; # skip sassign
2029 $left = $self->deparse($left, 7);
2030 $right = $self->deparse($right, 7);
2031 return $self->maybe_parens("$left $opname $right", $cx, 7);
2034 sub pp_andassign { logassignop(@_, "&&=") }
2035 sub pp_orassign { logassignop(@_, "||=") }
2039 my($op, $cx, $name) = @_;
2041 my $parens = ($cx >= 5) || $self->{'parens'};
2042 my $kid = $op->first->sibling;
2043 return $name if null $kid;
2045 if (defined prototype("CORE::$name")
2046 && prototype("CORE::$name") =~ /^;?\*/
2047 && $kid->name eq "rv2gv") {
2048 $first = $self->deparse($kid->first, 6);
2051 $first = $self->deparse($kid, 6);
2053 if ($name eq "chmod" && $first =~ /^\d+$/) {
2054 $first = sprintf("%#o", $first);
2056 $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
2057 push @exprs, $first;
2058 $kid = $kid->sibling;
2059 for (; !null($kid); $kid = $kid->sibling) {
2060 push @exprs, $self->deparse($kid, 6);
2063 return "$name(" . join(", ", @exprs) . ")";
2065 return "$name " . join(", ", @exprs);
2069 sub pp_bless { listop(@_, "bless") }
2070 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
2071 sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
2072 sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
2073 sub pp_index { maybe_targmy(@_, \&listop, "index") }
2074 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
2075 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
2076 sub pp_formline { listop(@_, "formline") } # see also deparse_format
2077 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
2078 sub pp_unpack { listop(@_, "unpack") }
2079 sub pp_pack { listop(@_, "pack") }
2080 sub pp_join { maybe_targmy(@_, \&listop, "join") }
2081 sub pp_splice { listop(@_, "splice") }
2082 sub pp_push { maybe_targmy(@_, \&listop, "push") }
2083 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
2084 sub pp_reverse { listop(@_, "reverse") }
2085 sub pp_warn { listop(@_, "warn") }
2086 sub pp_die { listop(@_, "die") }
2087 # Actually, return is exempt from the LLAFR (see examples in this very
2088 # module!), but for consistency's sake, ignore that fact
2089 sub pp_return { listop(@_, "return") }
2090 sub pp_open { listop(@_, "open") }
2091 sub pp_pipe_op { listop(@_, "pipe") }
2092 sub pp_tie { listop(@_, "tie") }
2093 sub pp_binmode { listop(@_, "binmode") }
2094 sub pp_dbmopen { listop(@_, "dbmopen") }
2095 sub pp_sselect { listop(@_, "select") }
2096 sub pp_select { listop(@_, "select") }
2097 sub pp_read { listop(@_, "read") }
2098 sub pp_sysopen { listop(@_, "sysopen") }
2099 sub pp_sysseek { listop(@_, "sysseek") }
2100 sub pp_sysread { listop(@_, "sysread") }
2101 sub pp_syswrite { listop(@_, "syswrite") }
2102 sub pp_send { listop(@_, "send") }
2103 sub pp_recv { listop(@_, "recv") }
2104 sub pp_seek { listop(@_, "seek") }
2105 sub pp_fcntl { listop(@_, "fcntl") }
2106 sub pp_ioctl { listop(@_, "ioctl") }
2107 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
2108 sub pp_socket { listop(@_, "socket") }
2109 sub pp_sockpair { listop(@_, "sockpair") }
2110 sub pp_bind { listop(@_, "bind") }
2111 sub pp_connect { listop(@_, "connect") }
2112 sub pp_listen { listop(@_, "listen") }
2113 sub pp_accept { listop(@_, "accept") }
2114 sub pp_shutdown { listop(@_, "shutdown") }
2115 sub pp_gsockopt { listop(@_, "getsockopt") }
2116 sub pp_ssockopt { listop(@_, "setsockopt") }
2117 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
2118 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
2119 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
2120 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
2121 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
2122 sub pp_link { maybe_targmy(@_, \&listop, "link") }
2123 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
2124 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
2125 sub pp_open_dir { listop(@_, "opendir") }
2126 sub pp_seekdir { listop(@_, "seekdir") }
2127 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
2128 sub pp_system { maybe_targmy(@_, \&listop, "system") }
2129 sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
2130 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
2131 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
2132 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
2133 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
2134 sub pp_shmget { listop(@_, "shmget") }
2135 sub pp_shmctl { listop(@_, "shmctl") }
2136 sub pp_shmread { listop(@_, "shmread") }
2137 sub pp_shmwrite { listop(@_, "shmwrite") }
2138 sub pp_msgget { listop(@_, "msgget") }
2139 sub pp_msgctl { listop(@_, "msgctl") }
2140 sub pp_msgsnd { listop(@_, "msgsnd") }
2141 sub pp_msgrcv { listop(@_, "msgrcv") }
2142 sub pp_semget { listop(@_, "semget") }
2143 sub pp_semctl { listop(@_, "semctl") }
2144 sub pp_semop { listop(@_, "semop") }
2145 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
2146 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
2147 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
2148 sub pp_gsbyname { listop(@_, "getservbyname") }
2149 sub pp_gsbyport { listop(@_, "getservbyport") }
2150 sub pp_syscall { listop(@_, "syscall") }
2155 my $text = $self->dq($op->first->sibling); # skip pushmark
2156 if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
2157 or $text =~ /[<>]/) {
2158 return 'glob(' . single_delim('qq', '"', $text) . ')';
2160 return '<' . $text . '>';
2164 # Truncate is special because OPf_SPECIAL makes a bareword first arg
2165 # be a filehandle. This could probably be better fixed in the core
2166 # by moving the GV lookup into ck_truc.
2172 my $parens = ($cx >= 5) || $self->{'parens'};
2173 my $kid = $op->first->sibling;
2175 if ($op->flags & OPf_SPECIAL) {
2176 # $kid is an OP_CONST
2177 $fh = $self->const_sv($kid)->PV;
2179 $fh = $self->deparse($kid, 6);
2180 $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
2182 my $len = $self->deparse($kid->sibling, 6);
2184 return "truncate($fh, $len)";
2186 return "truncate $fh, $len";
2192 my($op, $cx, $name) = @_;
2194 my $kid = $op->first->sibling;
2196 if ($op->flags & OPf_STACKED) {
2198 $indir = $indir->first; # skip rv2gv
2199 if (is_scope($indir)) {
2200 $indir = "{" . $self->deparse($indir, 0) . "}";
2201 } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
2202 $indir = $self->const_sv($indir)->PV;
2204 $indir = $self->deparse($indir, 24);
2206 $indir = $indir . " ";
2207 $kid = $kid->sibling;
2209 if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
2210 $indir = ($op->private & OPpSORT_REVERSE) ? '{$b <=> $a} '
2213 elsif ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
2214 $indir = '{$b cmp $a} ';
2216 for (; !null($kid); $kid = $kid->sibling) {
2217 $expr = $self->deparse($kid, 6);
2220 return $self->maybe_parens_func($name, $indir . join(", ", @exprs),
2224 sub pp_prtf { indirop(@_, "printf") }
2225 sub pp_print { indirop(@_, "print") }
2226 sub pp_sort { indirop(@_, "sort") }
2230 my($op, $cx, $name) = @_;
2232 my $kid = $op->first; # this is the (map|grep)start
2233 $kid = $kid->first->sibling; # skip a pushmark
2234 my $code = $kid->first; # skip a null
2235 if (is_scope $code) {
2236 $code = "{" . $self->deparse($code, 0) . "} ";
2238 $code = $self->deparse($code, 24) . ", ";
2240 $kid = $kid->sibling;
2241 for (; !null($kid); $kid = $kid->sibling) {
2242 $expr = $self->deparse($kid, 6);
2243 push @exprs, $expr if $expr;
2245 return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
2248 sub pp_mapwhile { mapop(@_, "map") }
2249 sub pp_grepwhile { mapop(@_, "grep") }
2255 my $kid = $op->first->sibling; # skip pushmark
2257 my $local = "either"; # could be local(...), my(...) or our(...)
2258 for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
2259 # This assumes that no other private flags equal 128, and that
2260 # OPs that store things other than flags in their op_private,
2261 # like OP_AELEMFAST, won't be immediate children of a list.
2263 # OP_ENTERSUB can break this logic, so check for it.
2264 # I suspect that open and exit can too.
2266 if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
2267 or $lop->name eq "undef")
2268 or $lop->name eq "entersub"
2269 or $lop->name eq "exit"
2270 or $lop->name eq "open")
2272 $local = ""; # or not
2275 if ($lop->name =~ /^pad[ash]v$/) { # my()
2276 ($local = "", last) if $local eq "local" || $local eq "our";
2278 } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
2279 && $lop->private & OPpOUR_INTRO
2280 or $lop->name eq "null" && $lop->first->name eq "gvsv"
2281 && $lop->first->private & OPpOUR_INTRO) { # our()
2282 ($local = "", last) if $local eq "my" || $local eq "local";
2284 } elsif ($lop->name ne "undef") { # local()
2285 ($local = "", last) if $local eq "my" || $local eq "our";
2289 $local = "" if $local eq "either"; # no point if it's all undefs
2290 return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
2291 for (; !null($kid); $kid = $kid->sibling) {
2293 if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
2298 $self->{'avoid_local'}{$$lop}++;
2299 $expr = $self->deparse($kid, 6);
2300 delete $self->{'avoid_local'}{$$lop};
2302 $expr = $self->deparse($kid, 6);
2307 return "$local(" . join(", ", @exprs) . ")";
2309 return $self->maybe_parens( join(", ", @exprs), $cx, 6);
2313 sub is_ifelse_cont {
2315 return ($op->name eq "null" and class($op) eq "UNOP"
2316 and $op->first->name =~ /^(and|cond_expr)$/
2317 and is_scope($op->first->first->sibling));
2323 my $cond = $op->first;
2324 my $true = $cond->sibling;
2325 my $false = $true->sibling;
2326 my $cuddle = $self->{'cuddle'};
2327 unless ($cx == 0 and (is_scope($true) and $true->name ne "null") and
2328 (is_scope($false) || is_ifelse_cont($false))
2329 and $self->{'expand'} < 7) {
2330 $cond = $self->deparse($cond, 8);
2331 $true = $self->deparse($true, 8);
2332 $false = $self->deparse($false, 8);
2333 return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
2336 $cond = $self->deparse($cond, 1);
2337 $true = $self->deparse($true, 0);
2338 my $head = "if ($cond) {\n\t$true\n\b}";
2340 while (!null($false) and is_ifelse_cont($false)) {
2341 my $newop = $false->first;
2342 my $newcond = $newop->first;
2343 my $newtrue = $newcond->sibling;
2344 $false = $newtrue->sibling; # last in chain is OP_AND => no else
2345 $newcond = $self->deparse($newcond, 1);
2346 $newtrue = $self->deparse($newtrue, 0);
2347 push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
2349 if (!null($false)) {
2350 $false = $cuddle . "else {\n\t" .
2351 $self->deparse($false, 0) . "\n\b}\cK";
2355 return $head . join($cuddle, "", @elsifs) . $false;
2360 my($op, $cx, $init) = @_;
2361 my $enter = $op->first;
2362 my $kid = $enter->sibling;
2363 local(@$self{qw'curstash warnings hints'})
2364 = @$self{qw'curstash warnings hints'};
2369 if ($kid->name eq "lineseq") { # bare or infinite loop
2370 if (is_state $kid->last) { # infinite
2371 $head = "while (1) "; # Can't use for(;;) if there's a continue
2377 } elsif ($enter->name eq "enteriter") { # foreach
2378 my $ary = $enter->first->sibling; # first was pushmark
2379 my $var = $ary->sibling;
2380 if ($enter->flags & OPf_STACKED
2381 and not null $ary->first->sibling->sibling)
2383 $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
2384 $self->deparse($ary->first->sibling->sibling, 9);
2386 $ary = $self->deparse($ary, 1);
2389 if ($enter->flags & OPf_SPECIAL) { # thread special var
2390 $var = $self->pp_threadsv($enter, 1);
2391 } else { # regular my() variable
2392 $var = $self->pp_padsv($enter, 1);
2393 if ($self->padname_sv($enter->targ)->IVX ==
2394 $kid->first->first->sibling->last->cop_seq)
2396 # If the scope of this variable closes at the last
2397 # statement of the loop, it must have been
2399 $var = "my " . $var;
2402 } elsif ($var->name eq "rv2gv") {
2403 $var = $self->pp_rv2sv($var, 1);
2404 } elsif ($var->name eq "gv") {
2405 $var = "\$" . $self->deparse($var, 1);
2407 $head = "foreach $var ($ary) ";
2408 $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
2409 } elsif ($kid->name eq "null") { # while/until
2411 my $name = {"and" => "while", "or" => "until"}->{$kid->name};
2412 $cond = $self->deparse($kid->first, 1);
2413 $head = "$name ($cond) ";
2414 $body = $kid->first->sibling;
2415 } elsif ($kid->name eq "stub") { # bare and empty
2416 return "{;}"; # {} could be a hashref
2418 # If there isn't a continue block, then the next pointer for the loop
2419 # will point to the unstack, which is kid's penultimate child, except
2420 # in a bare loop, when it will point to the leaveloop. When neither of
2421 # these conditions hold, then the third-to-last child in the continue
2422 # block (or the last in a bare loop).
2423 my $cont_start = $enter->nextop;
2425 if ($$cont_start != $$op && ${$cont_start->sibling} != ${$body->last}) {
2427 $cont = $body->last;
2429 $cont = $body->first;
2430 while (!null($cont->sibling->sibling->sibling)) {
2431 $cont = $cont->sibling;
2434 my $state = $body->first;
2435 my $cuddle = $self->{'cuddle'};
2437 for (; $$state != $$cont; $state = $state->sibling) {
2438 push @states, $state;
2440 $body = $self->lineseq(undef, @states);
2441 if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
2442 $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
2445 $cont = $cuddle . "continue {\n\t" .
2446 $self->deparse($cont, 0) . "\n\b}\cK";
2449 return "" if !defined $body;
2451 $head = "for ($init; $cond;) ";
2454 $body = $self->deparse($body, 0);
2456 $body =~ s/;?$/;\n/;
2458 return $head . "{\n\t" . $body . "\b}" . $cont;
2461 sub pp_leaveloop { loop_common(@_, "") }
2466 my $init = $self->deparse($op, 1);
2467 return $self->loop_common($op->sibling->first->sibling, $cx, $init);
2472 return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
2475 BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
2476 BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
2477 BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
2478 BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
2483 if (class($op) eq "OP") {
2485 return $self->{'ex_const'} if $op->targ == OP_CONST;
2486 } elsif ($op->first->name eq "pushmark") {
2487 return $self->pp_list($op, $cx);
2488 } elsif ($op->first->name eq "enter") {
2489 return $self->pp_leave($op, $cx);
2490 } elsif ($op->targ == OP_STRINGIFY) {
2491 return $self->dquote($op, $cx);
2492 } elsif (!null($op->first->sibling) and
2493 $op->first->sibling->name eq "readline" and
2494 $op->first->sibling->flags & OPf_STACKED) {
2495 return $self->maybe_parens($self->deparse($op->first, 7) . " = "
2496 . $self->deparse($op->first->sibling, 7),
2498 } elsif (!null($op->first->sibling) and
2499 $op->first->sibling->name eq "trans" and
2500 $op->first->sibling->flags & OPf_STACKED) {
2501 return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
2502 . $self->deparse($op->first->sibling, 20),
2504 } elsif ($op->flags & OPf_SPECIAL && $cx == 0 && !$op->targ) {
2505 return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2506 } elsif (!null($op->first->sibling) and
2507 $op->first->sibling->name eq "null" and
2508 class($op->first->sibling) eq "UNOP" and
2509 $op->first->sibling->first->flags & OPf_STACKED and
2510 $op->first->sibling->first->name eq "rcatline") {
2511 return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2512 . $self->deparse($op->first->sibling, 18),
2515 return $self->deparse($op->first, $cx);
2522 return $self->padname_sv($targ)->PVX;
2528 return substr($self->padname($op->targ), 1); # skip $/@/%
2534 return $self->maybe_my($op, $cx, $self->padname($op->targ));
2537 sub pp_padav { pp_padsv(@_) }
2538 sub pp_padhv { pp_padsv(@_) }
2543 @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
2544 "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
2545 "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
2552 return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
2558 if (class($op) eq "PADOP") {
2559 return $self->padval($op->padix);
2560 } else { # class($op) eq "SVOP"
2568 my $gv = $self->gv_or_padgv($op);
2569 return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2570 $self->gv_name($gv)));
2576 my $gv = $self->gv_or_padgv($op);
2577 return $self->gv_name($gv);
2583 my $gv = $self->gv_or_padgv($op);
2584 my $name = $self->gv_name($gv);
2585 $name = $self->{'curstash'}."::$name"
2586 if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2588 return "\$" . $name . "[" .
2589 ($op->private + $self->{'arybase'}) . "]";
2594 my($op, $cx, $type) = @_;
2596 if (class($op) eq 'NULL' || !$op->can("first")) {
2597 carp("Unexpected op in pp_rv2x");
2600 my $kid = $op->first;
2601 my $str = $self->deparse($kid, 0);
2602 return $self->stash_variable($type, $str) if is_scalar($kid);
2603 return $type ."{$str}";
2606 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2607 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2608 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2614 if ($op->first->name eq "padav") {
2615 return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2617 return $self->maybe_local($op, $cx,
2618 $self->rv2x($op->first, $cx, '$#'));
2622 # skip down to the old, ex-rv2cv
2624 my ($self, $op, $cx) = @_;
2625 if (!null($op->first) && $op->first->name eq 'null' &&
2626 $op->first->targ eq OP_LIST)
2628 return $self->rv2x($op->first->first->sibling, $cx, "&")
2631 return $self->rv2x($op, $cx, "")
2638 my $kid = $op->first;
2639 if ($kid->name eq "const") { # constant list
2640 my $av = $self->const_sv($kid);
2641 return "(" . join(", ", map(const($_), $av->ARRAY)) . ")";
2643 return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
2647 sub is_subscriptable {
2649 if ($op->name =~ /^[ahg]elem/) {
2651 } elsif ($op->name eq "entersub") {
2652 my $kid = $op->first;
2653 return 0 unless null $kid->sibling;
2655 $kid = $kid->sibling until null $kid->sibling;
2656 return 0 if is_scope($kid);
2658 return 0 if $kid->name eq "gv";
2659 return 0 if is_scalar($kid);
2660 return is_subscriptable($kid);
2668 my ($op, $cx, $left, $right, $padname) = @_;
2669 my($array, $idx) = ($op->first, $op->first->sibling);
2670 unless ($array->name eq $padname) { # Maybe this has been fixed
2671 $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
2673 if ($array->name eq $padname) {
2674 $array = $self->padany($array);
2675 } elsif (is_scope($array)) { # ${expr}[0]
2676 $array = "{" . $self->deparse($array, 0) . "}";
2677 } elsif ($array->name eq "gv") {
2678 $array = $self->gv_name($self->gv_or_padgv($array));
2679 if ($array !~ /::/) {
2680 my $prefix = ($left eq '[' ? '@' : '%');
2681 $array = $self->{curstash}.'::'.$array
2682 if $self->lex_in_scope($prefix . $array);
2684 } elsif (is_scalar $array) { # $x[0], $$x[0], ...
2685 $array = $self->deparse($array, 24);
2687 # $x[20][3]{hi} or expr->[20]
2688 my $arrow = is_subscriptable($array) ? "" : "->";
2689 return $self->deparse($array, 24) . $arrow .
2690 $left . $self->deparse($idx, 1) . $right;
2692 $idx = $self->deparse($idx, 1);
2694 # Outer parens in an array index will confuse perl
2695 # if we're interpolating in a regular expression, i.e.
2696 # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
2698 # If $self->{parens}, then an initial '(' will
2699 # definitely be paired with a final ')'. If
2700 # !$self->{parens}, the misleading parens won't
2701 # have been added in the first place.
2703 # [You might think that we could get "(...)...(...)"
2704 # where the initial and final parens do not match
2705 # each other. But we can't, because the above would
2706 # only happen if there's an infix binop between the
2707 # two pairs of parens, and *that* means that the whole
2708 # expression would be parenthesized as well.]
2710 $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
2712 # Hash-element braces will autoquote a bareword inside themselves.
2713 # We need to make sure that C<$hash{warn()}> doesn't come out as
2714 # C<$hash{warn}>, which has a quite different meaning. Currently
2715 # B::Deparse will always quote strings, even if the string was a
2716 # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
2717 # for constant strings.) So we can cheat slightly here - if we see
2718 # a bareword, we know that it is supposed to be a function call.
2720 $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
2722 return "\$" . $array . $left . $idx . $right;
2725 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
2726 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
2731 my($glob, $part) = ($op->first, $op->last);
2732 $glob = $glob->first; # skip rv2gv
2733 $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
2734 my $scope = is_scope($glob);
2735 $glob = $self->deparse($glob, 0);
2736 $part = $self->deparse($part, 1);
2737 return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
2742 my ($op, $cx, $left, $right, $regname, $padname) = @_;
2744 my(@elems, $kid, $array, $list);
2745 if (class($op) eq "LISTOP") {
2747 } else { # ex-hslice inside delete()
2748 for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
2752 $array = $array->first
2753 if $array->name eq $regname or $array->name eq "null";
2754 if (is_scope($array)) {
2755 $array = "{" . $self->deparse($array, 0) . "}";
2756 } elsif ($array->name eq $padname) {
2757 $array = $self->padany($array);
2759 $array = $self->deparse($array, 24);
2761 $kid = $op->first->sibling; # skip pushmark
2762 if ($kid->name eq "list") {
2763 $kid = $kid->first->sibling; # skip list, pushmark
2764 for (; !null $kid; $kid = $kid->sibling) {
2765 push @elems, $self->deparse($kid, 6);
2767 $list = join(", ", @elems);
2769 $list = $self->deparse($kid, 1);
2771 return "\@" . $array . $left . $list . $right;
2774 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
2775 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
2780 my $idx = $op->first;
2781 my $list = $op->last;
2783 $list = $self->deparse($list, 1);
2784 $idx = $self->deparse($idx, 1);
2785 return "($list)" . "[$idx]";
2790 return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
2795 return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
2801 my $kid = $op->first->sibling; # skip pushmark
2802 my($meth, $obj, @exprs);
2803 if ($kid->name eq "list" and want_list $kid) {
2804 # When an indirect object isn't a bareword but the args are in
2805 # parens, the parens aren't part of the method syntax (the LLAFR
2806 # doesn't apply), but they make a list with OPf_PARENS set that
2807 # doesn't get flattened by the append_elem that adds the method,
2808 # making a (object, arg1, arg2, ...) list where the object
2809 # usually is. This can be distinguished from
2810 # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
2811 # object) because in the later the list is in scalar context
2812 # as the left side of -> always is, while in the former
2813 # the list is in list context as method arguments always are.
2814 # (Good thing there aren't method prototypes!)
2815 $meth = $kid->sibling;
2816 $kid = $kid->first->sibling; # skip pushmark
2818 $kid = $kid->sibling;
2819 for (; not null $kid; $kid = $kid->sibling) {
2820 push @exprs, $self->deparse($kid, 6);
2824 $kid = $kid->sibling;
2825 for (; !null ($kid->sibling) && $kid->name ne "method_named";
2826 $kid = $kid->sibling) {
2827 push @exprs, $self->deparse($kid, 6);
2831 $obj = $self->deparse($obj, 24);
2832 if ($meth->name eq "method_named") {
2833 $meth = $self->const_sv($meth)->PV;
2835 $meth = $meth->first;
2836 if ($meth->name eq "const") {
2837 # As of 5.005_58, this case is probably obsoleted by the
2838 # method_named case above
2839 $meth = $self->const_sv($meth)->PV; # needs to be bare
2841 $meth = $self->deparse($meth, 1);
2844 my $args = join(", ", @exprs);
2845 $kid = $obj . "->" . $meth;
2847 return $kid . "(" . $args . ")"; # parens mandatory
2853 # returns "&" if the prototype doesn't match the args,
2854 # or ("", $args_after_prototype_demunging) if it does.
2857 my($proto, @args) = @_;
2861 # An unbackslashed @ or % gobbles up the rest of the args
2862 $proto =~ s/([^\\]|^)([@%])(.*)$/$1$2/;
2864 $proto =~ s/^ *([\\]?[\$\@&%*]|;)//;
2867 return "&" if @args;
2868 } elsif ($chr eq ";") {
2870 } elsif ($chr eq "@" or $chr eq "%") {
2871 push @reals, map($self->deparse($_, 6), @args);
2877 if (want_scalar $arg) {
2878 push @reals, $self->deparse($arg, 6);
2882 } elsif ($chr eq "&") {
2883 if ($arg->name =~ /^(s?refgen|undef)$/) {
2884 push @reals, $self->deparse($arg, 6);
2888 } elsif ($chr eq "*") {
2889 if ($arg->name =~ /^s?refgen$/
2890 and $arg->first->first->name eq "rv2gv")
2892 $real = $arg->first->first; # skip refgen, null
2893 if ($real->first->name eq "gv") {
2894 push @reals, $self->deparse($real, 6);
2896 push @reals, $self->deparse($real->first, 6);
2901 } elsif (substr($chr, 0, 1) eq "\\") {
2902 $chr = substr($chr, 1);
2903 if ($arg->name =~ /^s?refgen$/ and
2904 !null($real = $arg->first) and
2905 ($chr eq "\$" && is_scalar($real->first)
2907 && $real->first->sibling->name
2910 && $real->first->sibling->name
2912 #or ($chr eq "&" # This doesn't work
2913 # && $real->first->name eq "rv2cv")
2915 && $real->first->name eq "rv2gv")))
2917 push @reals, $self->deparse($real, 6);
2924 return "&" if $proto and !$doneok; # too few args and no `;'
2925 return "&" if @args; # too many args
2926 return ("", join ", ", @reals);
2932 return $self->method($op, $cx) unless null $op->first->sibling;
2936 if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
2938 } elsif ($op->private & OPpENTERSUB_AMPER) {
2942 $kid = $kid->first->sibling; # skip ex-list, pushmark
2943 for (; not null $kid->sibling; $kid = $kid->sibling) {
2948 if (is_scope($kid)) {
2950 $kid = "{" . $self->deparse($kid, 0) . "}";
2951 } elsif ($kid->first->name eq "gv") {
2952 my $gv = $self->gv_or_padgv($kid->first);
2953 if (class($gv->CV) ne "SPECIAL") {
2954 $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
2956 $simple = 1; # only calls of named functions can be prototyped
2957 $kid = $self->deparse($kid, 24);
2958 } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
2960 $kid = $self->deparse($kid, 24);
2963 my $arrow = is_subscriptable($kid->first) ? "" : "->";
2964 $kid = $self->deparse($kid, 24) . $arrow;
2967 # Doesn't matter how many prototypes there are, if
2968 # they haven't happened yet!
2972 no warnings 'uninitialized';
2973 $declared = exists $self->{'subs_declared'}{$kid}
2975 defined &{ %{$self->{'curstash'}."::"}->{$kid} }
2977 $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
2978 && defined prototype $self->{'curstash'}."::".$kid
2980 if (!$declared && defined($proto)) {
2981 # Avoid "too early to check prototype" warning
2982 ($amper, $proto) = ('&');
2987 if ($declared and defined $proto and not $amper) {
2988 ($amper, $args) = $self->check_proto($proto, @exprs);
2989 if ($amper eq "&") {
2990 $args = join(", ", map($self->deparse($_, 6), @exprs));
2993 $args = join(", ", map($self->deparse($_, 6), @exprs));
2995 if ($prefix or $amper) {
2996 if ($op->flags & OPf_STACKED) {
2997 return $prefix . $amper . $kid . "(" . $args . ")";
2999 return $prefix . $amper. $kid;
3002 # glob() invocations can be translated into calls of
3003 # CORE::GLOBAL::glob with a second parameter, a number.
3005 if ($kid eq "CORE::GLOBAL::glob") {
3007 $args =~ s/\s*,[^,]+$//;
3010 # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
3011 # so it must have been translated from a keyword call. Translate
3013 $kid =~ s/^CORE::GLOBAL:://;
3016 return "$kid(" . $args . ")";
3017 } elsif (defined $proto and $proto eq "") {
3019 } elsif (defined $proto and $proto eq "\$" and is_scalar($exprs[0])) {
3020 return $self->maybe_parens_func($kid, $args, $cx, 16);
3021 } elsif (defined($proto) && $proto or $simple) {
3022 return $self->maybe_parens_func($kid, $args, $cx, 5);
3024 return "$kid(" . $args . ")";
3029 sub pp_enterwrite { unop(@_, "write") }
3031 # escape things that cause interpolation in double quotes,
3032 # but not character escapes
3035 $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
3043 # Matches any string which is balanced with respect to {braces}
3054 # the same, but treat $|, $), $( and $ at the end of the string differently
3068 (\(\?\??\{$bal\}\)) # $4
3074 /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3079 # This is for regular expressions with the /x modifier
3080 # We have to leave comments unmangled.
3081 sub re_uninterp_extended {
3094 ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
3095 | \#[^\n]* # (skip over comments)
3102 /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3108 # character escapes, but not delimiters that might need to be escaped
3109 sub escape_str { # ASCII, UTF8
3111 $str =~ s/(.)/ord($1)>255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3113 # $str =~ s/\cH/\\b/g; # \b means someting different in a regex
3119 $str =~ s/([\cA-\cZ])/'\\c' . chr(ord('@') + ord($1))/ge;
3120 $str =~ s/([\0\033-\037\177-\377])/'\\' . sprintf("%03o", ord($1))/ge;
3124 # For regexes with the /x modifier.
3125 # Leave whitespace unmangled.
3126 sub escape_extended_re {
3128 $str =~ s/(.)/ord($1)>255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3129 $str =~ s/([\0\033-\037\177-\377])/'\\' . sprintf("%03o", ord($1))/ge;
3130 $str =~ s/\n/\n\f/g;
3134 # Don't do this for regexen
3137 $str =~ s/\\/\\\\/g;
3141 # Remove backslashes which precede literal control characters,
3142 # to avoid creating ambiguity when we escape the latter.
3146 # the insane complexity here is due to the behaviour of "\c\"
3147 $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[\0-\031\177-\377])/$1$2/g;
3151 sub balanced_delim {
3153 my @str = split //, $str;
3154 my($ar, $open, $close, $fail, $c, $cnt);
3155 for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3156 ($open, $close) = @$ar;
3157 $fail = 0; $cnt = 0;
3161 } elsif ($c eq $close) {
3170 $fail = 1 if $cnt != 0;
3171 return ($open, "$open$str$close") if not $fail;
3177 my($q, $default, $str) = @_;
3178 return "$default$str$default" if $default and index($str, $default) == -1;
3180 (my $succeed, $str) = balanced_delim($str);
3181 return "$q$str" if $succeed;
3183 for my $delim ('/', '"', '#') {
3184 return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3187 $str =~ s/$default/\\$default/g;
3188 return "$default$str$default";
3197 if (class($sv) eq "SPECIAL") {
3198 return ('undef', '1', '0')[$$sv-1]; # sv_undef, sv_yes, sv_no
3199 } elsif (class($sv) eq "NULL") {
3201 } elsif ($sv->FLAGS & SVf_IOK) {
3202 return $sv->int_value;
3203 } elsif ($sv->FLAGS & SVf_NOK) {
3204 # try the default stringification
3207 # If it's in scientific notation, we might have lost information
3208 return sprintf("%.20e", $sv->NV);
3211 } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3212 return "\\(" . const($sv->RV) . ")"; # constant folded
3213 } elsif ($sv->FLAGS & SVf_POK) {
3215 if ($str =~ /[^ -~]/) { # ASCII for non-printing
3216 return single_delim("qq", '"', uninterp escape_str unback $str);
3218 return single_delim("q", "'", unback $str);
3229 # the constant could be in the pad (under useithreads)
3230 $sv = $self->padval($op->targ) unless $$sv;
3237 if ($op->private & OPpCONST_ARYBASE) {
3240 # if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
3241 # return $self->const_sv($op)->PV;
3243 my $sv = $self->const_sv($op);
3244 # return const($sv);
3246 return $c =~ /^-\d/ ? $self->maybe_parens($c, $cx, 21) : $c;
3252 my $type = $op->name;
3253 if ($type eq "const") {
3254 return '$[' if $op->private & OPpCONST_ARYBASE;
3255 return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3256 } elsif ($type eq "concat") {
3257 my $first = $self->dq($op->first);
3258 my $last = $self->dq($op->last);
3260 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3261 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3262 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
3263 || ($last =~ /^[{\[\w_]/ &&
3264 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3266 return $first . $last;
3267 } elsif ($type eq "uc") {
3268 return '\U' . $self->dq($op->first->sibling) . '\E';
3269 } elsif ($type eq "lc") {
3270 return '\L' . $self->dq($op->first->sibling) . '\E';
3271 } elsif ($type eq "ucfirst") {
3272 return '\u' . $self->dq($op->first->sibling);
3273 } elsif ($type eq "lcfirst") {
3274 return '\l' . $self->dq($op->first->sibling);
3275 } elsif ($type eq "quotemeta") {
3276 return '\Q' . $self->dq($op->first->sibling) . '\E';
3277 } elsif ($type eq "join") {
3278 return $self->deparse($op->last, 26); # was join($", @ary)
3280 return $self->deparse($op, 26);
3288 return single_delim("qx", '`', $self->dq($op->first->sibling));
3294 my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3295 return $self->deparse($kid, $cx) if $self->{'unquote'};
3296 $self->maybe_targmy($kid, $cx,
3297 sub {single_delim("qq", '"', $self->dq($_[1]))});
3300 # OP_STRINGIFY is a listop, but it only ever has one arg
3301 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3303 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3304 # note that tr(from)/to/ is OK, but not tr/from/(to)
3306 my($from, $to) = @_;
3307 my($succeed, $delim);
3308 if ($from !~ m[/] and $to !~ m[/]) {
3309 return "/$from/$to/";
3310 } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3311 if (($succeed, $to) = balanced_delim($to) and $succeed) {
3314 for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3315 return "$from$delim$to$delim" if index($to, $delim) == -1;
3318 return "$from/$to/";
3321 for $delim ('/', '"', '#') { # note no '
3322 return "$delim$from$delim$to$delim"
3323 if index($to . $from, $delim) == -1;
3325 $from =~ s[/][\\/]g;
3327 return "/$from/$to/";
3331 # Only used by tr///, so backslashes hyphens
3334 if ($n == ord '\\') {
3336 } elsif ($n == ord "-") {
3338 } elsif ($n >= ord(' ') and $n <= ord('~')) {
3340 } elsif ($n == ord "\a") {
3342 } elsif ($n == ord "\b") {
3344 } elsif ($n == ord "\t") {
3346 } elsif ($n == ord "\n") {
3348 } elsif ($n == ord "\e") {
3350 } elsif ($n == ord "\f") {
3352 } elsif ($n == ord "\r") {
3354 } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3355 return '\\c' . chr(ord("@") + $n);
3357 # return '\x' . sprintf("%02x", $n);
3358 return '\\' . sprintf("%03o", $n);
3364 my($str, $c, $tr) = ("");
3365 for ($c = 0; $c < @chars; $c++) {
3368 if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3369 $chars[$c + 2] == $tr + 2)
3371 for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3374 $str .= pchr($chars[$c]);
3380 sub tr_decode_byte {
3381 my($table, $flags) = @_;
3382 my(@table) = unpack("s*", $table);
3383 splice @table, 0x100, 1; # Number of subsequent elements
3384 my($c, $tr, @from, @to, @delfrom, $delhyphen);
3385 if ($table[ord "-"] != -1 and
3386 $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3388 $tr = $table[ord "-"];
3389 $table[ord "-"] = -1;
3393 } else { # -2 ==> delete
3397 for ($c = 0; $c < @table; $c++) {
3400 push @from, $c; push @to, $tr;
3401 } elsif ($tr == -2) {
3405 @from = (@from, @delfrom);
3406 if ($flags & OPpTRANS_COMPLEMENT) {
3409 @from{@from} = (1) x @from;
3410 for ($c = 0; $c < 256; $c++) {
3411 push @newfrom, $c unless $from{$c};
3415 unless ($flags & OPpTRANS_DELETE || !@to) {
3416 pop @to while $#to and $to[$#to] == $to[$#to -1];
3419 $from = collapse(@from);
3420 $to = collapse(@to);
3421 $from .= "-" if $delhyphen;
3422 return ($from, $to);
3427 if ($x == ord "-") {
3429 } elsif ($x == ord "\\") {
3436 # XXX This doesn't yet handle all cases correctly either
3438 sub tr_decode_utf8 {
3439 my($swash_hv, $flags) = @_;
3440 my %swash = $swash_hv->ARRAY;
3442 $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
3443 my $none = $swash{"NONE"}->IV;
3444 my $extra = $none + 1;
3445 my(@from, @delfrom, @to);
3447 foreach $line (split /\n/, $swash{'LIST'}->PV) {
3448 my($min, $max, $result) = split(/\t/, $line);
3455 $result = hex $result;
3456 if ($result == $extra) {
3457 push @delfrom, [$min, $max];
3459 push @from, [$min, $max];
3460 push @to, [$result, $result + $max - $min];
3463 for my $i (0 .. $#from) {
3464 if ($from[$i][0] == ord '-') {
3465 unshift @from, splice(@from, $i, 1);
3466 unshift @to, splice(@to, $i, 1);
3468 } elsif ($from[$i][1] == ord '-') {
3471 unshift @from, ord '-';
3472 unshift @to, ord '-';
3476 for my $i (0 .. $#delfrom) {
3477 if ($delfrom[$i][0] == ord '-') {
3478 push @delfrom, splice(@delfrom, $i, 1);
3480 } elsif ($delfrom[$i][1] == ord '-') {
3482 push @delfrom, ord '-';
3486 if (defined $final and $to[$#to][1] != $final) {
3487 push @to, [$final, $final];
3489 push @from, @delfrom;
3490 if ($flags & OPpTRANS_COMPLEMENT) {
3493 for my $i (0 .. $#from) {
3494 push @newfrom, [$next, $from[$i][0] - 1];
3495 $next = $from[$i][1] + 1;
3498 for my $range (@newfrom) {
3499 if ($range->[0] <= $range->[1]) {
3504 my($from, $to, $diff);
3505 for my $chunk (@from) {
3506 $diff = $chunk->[1] - $chunk->[0];
3508 $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3509 } elsif ($diff == 1) {
3510 $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3512 $from .= tr_chr($chunk->[0]);
3515 for my $chunk (@to) {
3516 $diff = $chunk->[1] - $chunk->[0];
3518 $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3519 } elsif ($diff == 1) {
3520 $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3522 $to .= tr_chr($chunk->[0]);
3525 #$final = sprintf("%04x", $final) if defined $final;
3526 #$none = sprintf("%04x", $none) if defined $none;
3527 #$extra = sprintf("%04x", $extra) if defined $extra;
3528 #print STDERR "final: $final\n none: $none\nextra: $extra\n";
3529 #print STDERR $swash{'LIST'}->PV;
3530 return (escape_str($from), escape_str($to));
3537 if (class($op) eq "PVOP") {
3538 ($from, $to) = tr_decode_byte($op->pv, $op->private);
3539 } else { # class($op) eq "SVOP"
3540 ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
3543 $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
3544 $flags .= "d" if $op->private & OPpTRANS_DELETE;
3545 $to = "" if $from eq $to and $flags eq "";
3546 $flags .= "s" if $op->private & OPpTRANS_SQUASH;
3547 return "tr" . double_delim($from, $to) . $flags;
3550 # Like dq(), but different
3553 my ($op, $extended) = @_;
3555 my $type = $op->name;
3556 if ($type eq "const") {
3557 return '$[' if $op->private & OPpCONST_ARYBASE;
3558 my $unbacked = re_unback($self->const_sv($op)->as_string);
3559 return re_uninterp_extended(escape_extended_re($unbacked))
3561 return re_uninterp(escape_str($unbacked));
3562 } elsif ($type eq "concat") {
3563 my $first = $self->re_dq($op->first, $extended);
3564 my $last = $self->re_dq($op->last, $extended);
3566 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3567 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3568 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
3569 || ($last =~ /^[{\[\w_]/ &&
3570 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3572 return $first . $last;
3573 } elsif ($type eq "uc") {
3574 return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
3575 } elsif ($type eq "lc") {
3576 return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
3577 } elsif ($type eq "ucfirst") {
3578 return '\u' . $self->re_dq($op->first->sibling, $extended);
3579 } elsif ($type eq "lcfirst") {
3580 return '\l' . $self->re_dq($op->first->sibling, $extended);
3581 } elsif ($type eq "quotemeta") {
3582 return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
3583 } elsif ($type eq "join") {
3584 return $self->deparse($op->last, 26); # was join($", @ary)
3586 return $self->deparse($op, 26);
3591 my ($self, $op) = @_;
3592 my $type = $op->name;
3594 if ($type eq 'const') {
3597 elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
3598 return $self->pure_string($op->first->sibling);
3600 elsif ($type eq 'join') {
3601 my $join_op = $op->first->sibling; # Skip pushmark
3602 return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
3604 my $gvop = $join_op->first;
3605 return 0 unless $gvop->name eq 'gvsv';
3606 return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
3608 return 0 unless ${$join_op->sibling} eq ${$op->last};
3609 return 0 unless $op->last->name =~ /^(rv2|pad)av$/;
3611 elsif ($type eq 'concat') {
3612 return $self->pure_string($op->first)
3613 && $self->pure_string($op->last);
3615 elsif (is_scalar($op) || $type =~ /^[ah]elem(fast)?$/) {
3627 my($op, $cx, $extended) = @_;
3628 my $kid = $op->first;
3629 $kid = $kid->first if $kid->name eq "regcmaybe";
3630 $kid = $kid->first if $kid->name eq "regcreset";
3631 return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
3632 return ($self->deparse($kid, $cx), 0);
3636 my ($self, $op, $cx) = @_;
3637 return (($self->regcomp($op, $cx, 0))[0]);
3640 # osmic acid -- see osmium tetroxide
3643 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
3644 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
3645 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
3649 my($op, $cx, $name, $delim) = @_;
3650 my $kid = $op->first;
3651 my ($binop, $var, $re) = ("", "", "");
3652 if ($op->flags & OPf_STACKED) {
3654 $var = $self->deparse($kid, 20);
3655 $kid = $kid->sibling;
3658 my $extended = ($op->pmflags & PMf_EXTENDED);
3660 my $unbacked = re_unback($op->precomp);
3662 $re = re_uninterp_extended(escape_extended_re($unbacked));
3664 $re = re_uninterp(escape_str(re_unback($op->precomp)));
3666 } elsif ($kid->name ne 'regcomp') {
3667 carp("found ".$kid->name." where regcomp expected");
3669 ($re, $quote) = $self->regcomp($kid, 1, $extended);
3672 $flags .= "c" if $op->pmflags & PMf_CONTINUE;
3673 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
3674 $flags .= "i" if $op->pmflags & PMf_FOLD;
3675 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
3676 $flags .= "o" if $op->pmflags & PMf_KEEP;
3677 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
3678 $flags .= "x" if $op->pmflags & PMf_EXTENDED;
3679 $flags = $matchwords{$flags} if $matchwords{$flags};
3680 if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
3684 $re = single_delim($name, $delim, $re);
3686 $re = $re . $flags if $quote;
3688 return $self->maybe_parens("$var =~ $re", $cx, 20);
3694 sub pp_match { matchop(@_, "m", "/") }
3695 sub pp_pushre { matchop(@_, "m", "/") }
3696 sub pp_qr { matchop(@_, "qr", "") }
3701 my($kid, @exprs, $ary, $expr);
3703 if ($ {$kid->pmreplroot}) {
3704 $ary = $self->stash_variable('@', $self->gv_name($kid->pmreplroot));
3706 for (; !null($kid); $kid = $kid->sibling) {
3707 push @exprs, $self->deparse($kid, 6);
3710 # handle special case of split(), and split(" ") that compiles to /\s+/
3712 if ($kid->flags & OPf_SPECIAL
3713 && $exprs[0] eq '/\\s+/'
3714 && $kid->pmflags & PMf_SKIPWHITE ) {
3718 $expr = "split(" . join(", ", @exprs) . ")";
3720 return $self->maybe_parens("$ary = $expr", $cx, 7);
3726 # oxime -- any of various compounds obtained chiefly by the action of
3727 # hydroxylamine on aldehydes and ketones and characterized by the
3728 # bivalent grouping C=NOH [Webster's Tenth]
3731 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
3732 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
3733 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
3734 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
3739 my $kid = $op->first;
3740 my($binop, $var, $re, $repl) = ("", "", "", "");
3741 if ($op->flags & OPf_STACKED) {
3743 $var = $self->deparse($kid, 20);
3744 $kid = $kid->sibling;
3747 if (null($op->pmreplroot)) {
3748 $repl = $self->dq($kid);
3749 $kid = $kid->sibling;
3751 $repl = $op->pmreplroot->first; # skip substcont
3752 while ($repl->name eq "entereval") {
3753 $repl = $repl->first;
3756 if ($op->pmflags & PMf_EVAL) {
3757 $repl = $self->deparse($repl, 0);
3759 $repl = $self->dq($repl);
3762 my $extended = ($op->pmflags & PMf_EXTENDED);
3764 my $unbacked = re_unback($op->precomp);
3766 $re = re_uninterp_extended(escape_extended_re($unbacked));
3769 $re = re_uninterp(escape_str($unbacked));
3772 ($re) = $self->regcomp($kid, 1, $extended);
3774 $flags .= "e" if $op->pmflags & PMf_EVAL;
3775 $flags .= "g" if $op->pmflags & PMf_GLOBAL;
3776 $flags .= "i" if $op->pmflags & PMf_FOLD;
3777 $flags .= "m" if $op->pmflags & PMf_MULTILINE;
3778 $flags .= "o" if $op->pmflags & PMf_KEEP;
3779 $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
3780 $flags .= "x" if $extended;
3781 $flags = $substwords{$flags} if $substwords{$flags};
3783 return $self->maybe_parens("$var =~ s"
3784 . double_delim($re, $repl) . $flags,
3787 return "s". double_delim($re, $repl) . $flags;
3796 B::Deparse - Perl compiler backend to produce perl code
3800 B<perl> B<-MO=Deparse>[B<,-u>I<PACKAGE>][B<,-p>][B<,-q>][B<,-l>]
3801 [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
3805 B::Deparse is a backend module for the Perl compiler that generates
3806 perl source code, based on the internal compiled structure that perl
3807 itself creates after parsing a program. The output of B::Deparse won't
3808 be exactly the same as the original source, since perl doesn't keep
3809 track of comments or whitespace, and there isn't a one-to-one
3810 correspondence between perl's syntactical constructions and their
3811 compiled form, but it will often be close. When you use the B<-p>
3812 option, the output also includes parentheses even when they are not
3813 required by precedence, which can make it easy to see if perl is
3814 parsing your expressions the way you intended.
3816 Please note that this module is mainly new and untested code and is
3817 still under development, so it may change in the future.
3821 As with all compiler backend options, these must follow directly after
3822 the '-MO=Deparse', separated by a comma but not any white space.
3828 Add '#line' declarations to the output based on the line and file
3829 locations of the original code.
3833 Print extra parentheses. Without this option, B::Deparse includes
3834 parentheses in its output only when they are needed, based on the
3835 structure of your program. With B<-p>, it uses parentheses (almost)
3836 whenever they would be legal. This can be useful if you are used to
3837 LISP, or if you want to see how perl parses your input. If you say
3839 if ($var & 0x7f == 65) {print "Gimme an A!"}
3840 print ($which ? $a : $b), "\n";
3841 $name = $ENV{USER} or "Bob";
3843 C<B::Deparse,-p> will print
3846 print('Gimme an A!')
3848 (print(($which ? $a : $b)), '???');
3849 (($name = $ENV{'USER'}) or '???')
3851 which probably isn't what you intended (the C<'???'> is a sign that
3852 perl optimized away a constant value).
3856 Expand double-quoted strings into the corresponding combinations of
3857 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
3860 print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
3864 print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
3865 . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
3867 Note that the expanded form represents the way perl handles such
3868 constructions internally -- this option actually turns off the reverse
3869 translation that B::Deparse usually does. On the other hand, note that
3870 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
3871 of $y into a string before doing the assignment.
3875 Normally, B::Deparse deparses the main code of a program, and all the subs
3876 defined in the same file. To include subs defined in other files, pass the
3877 B<-f> option with the filename. You can pass the B<-f> option several times, to
3878 include more than one secondary file. (Most of the time you don't want to
3879 use it at all.) You can also use this option to include subs which are
3880 defined in the scope of a B<#line> directive with two parameters.
3882 =item B<-s>I<LETTERS>
3884 Tweak the style of B::Deparse's output. The letters should follow
3885 directly after the 's', with no space or punctuation. The following
3886 options are available:
3892 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
3909 The default is not to cuddle.
3913 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
3917 Use tabs for each 8 columns of indent. The default is to use only spaces.
3918 For instance, if the style options are B<-si4T>, a line that's indented
3919 3 times will be preceded by one tab and four spaces; if the options were
3920 B<-si8T>, the same line would be preceded by three tabs.
3922 =item B<v>I<STRING>B<.>
3924 Print I<STRING> for the value of a constant that can't be determined
3925 because it was optimized away (mnemonic: this happens when a constant
3926 is used in B<v>oid context). The end of the string is marked by a period.
3927 The string should be a valid perl expression, generally a constant.
3928 Note that unless it's a number, it probably needs to be quoted, and on
3929 a command line quotes need to be protected from the shell. Some
3930 conventional values include 0, 1, 42, '', 'foo', and
3931 'Useless use of constant omitted' (which may need to be
3932 B<-sv"'Useless use of constant omitted'.">
3933 or something similar depending on your shell). The default is '???'.
3934 If you're using B::Deparse on a module or other file that's require'd,
3935 you shouldn't use a value that evaluates to false, since the customary
3936 true constant at the end of a module will be in void context when the
3937 file is compiled as a main program.
3943 Expand conventional syntax constructions into equivalent ones that expose
3944 their internal operation. I<LEVEL> should be a digit, with higher values
3945 meaning more expansion. As with B<-q>, this actually involves turning off
3946 special cases in B::Deparse's normal operations.
3948 If I<LEVEL> is at least 3, for loops will be translated into equivalent
3949 while loops with continue blocks; for instance
3951 for ($i = 0; $i < 10; ++$i) {
3964 Note that in a few cases this translation can't be perfectly carried back
3965 into the source code -- if the loop's initializer declares a my variable,
3966 for instance, it won't have the correct scope outside of the loop.
3968 If I<LEVEL> is at least 7, if statements will be translated into equivalent
3969 expressions using C<&&>, C<?:> and C<do {}>; for instance
3971 print 'hi' if $nice;
3983 $nice and print 'hi';
3984 $nice and do { print 'hi' };
3985 $nice ? do { print 'hi' } : do { print 'bye' };
3987 Long sequences of elsifs will turn into nested ternary operators, which
3988 B::Deparse doesn't know how to indent nicely.
3992 =head1 USING B::Deparse AS A MODULE
3997 $deparse = B::Deparse->new("-p", "-sC");
3998 $body = $deparse->coderef2text(\&func);
3999 eval "sub func $body"; # the inverse operation
4003 B::Deparse can also be used on a sub-by-sub basis from other perl
4008 $deparse = B::Deparse->new(OPTIONS)
4010 Create an object to store the state of a deparsing operation and any
4011 options. The options are the same as those that can be given on the
4012 command line (see L</OPTIONS>); options that are separated by commas
4013 after B<-MO=Deparse> should be given as separate strings. Some
4014 options, like B<-u>, don't make sense for a single subroutine, so
4017 =head2 ambient_pragmas
4019 $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
4021 The compilation of a subroutine can be affected by a few compiler
4022 directives, B<pragmas>. These are:
4036 Assigning to the special variable $[
4056 Ordinarily, if you use B::Deparse on a subroutine which has
4057 been compiled in the presence of one or more of these pragmas,
4058 the output will include statements to turn on the appropriate
4059 directives. So if you then compile the code returned by coderef2text,
4060 it will behave the same way as the subroutine which you deparsed.
4062 However, you may know that you intend to use the results in a
4063 particular context, where some pragmas are already in scope. In
4064 this case, you use the B<ambient_pragmas> method to describe the
4065 assumptions you wish to make.
4067 Not all of the options currently have any useful effect. See
4068 L</BUGS> for more details.
4070 The parameters it accepts are:
4076 Takes a string, possibly containing several values separated
4077 by whitespace. The special values "all" and "none" mean what you'd
4080 $deparse->ambient_pragmas(strict => 'subs refs');
4084 Takes a number, the value of the array base $[.
4092 If the value is true, then the appropriate pragma is assumed to
4093 be in the ambient scope, otherwise not.
4097 Takes a string, possibly containing a whitespace-separated list of
4098 values. The values "all" and "none" are special. It's also permissible
4099 to pass an array reference here.
4101 $deparser->ambient_pragmas(re => 'eval');
4106 Takes a string, possibly containing a whitespace-separated list of
4107 values. The values "all" and "none" are special, again. It's also
4108 permissible to pass an array reference here.
4110 $deparser->ambient_pragmas(warnings => [qw[void io]]);
4112 If one of the values is the string "FATAL", then all the warnings
4113 in that list will be considered fatal, just as with the B<warnings>
4114 pragma itself. Should you need to specify that some warnings are
4115 fatal, and others are merely enabled, you can pass the B<warnings>
4118 $deparser->ambient_pragmas(
4120 warnings => [FATAL => qw/void io/],
4123 See L<perllexwarn> for more information about lexical warnings.
4129 These two parameters are used to specify the ambient pragmas in
4130 the format used by the special variables $^H and ${^WARNING_BITS}.
4132 They exist principally so that you can write code like:
4134 { my ($hint_bits, $warning_bits);
4135 BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
4136 $deparser->ambient_pragmas (
4137 hint_bits => $hint_bits,
4138 warning_bits => $warning_bits,
4142 which specifies that the ambient pragmas are exactly those which
4143 are in scope at the point of calling.
4149 $body = $deparse->coderef2text(\&func)
4150 $body = $deparse->coderef2text(sub ($$) { ... })
4152 Return source code for the body of a subroutine (a block, optionally
4153 preceded by a prototype in parens), given a reference to the
4154 sub. Because a subroutine can have no names, or more than one name,
4155 this method doesn't return a complete subroutine definition -- if you
4156 want to eval the result, you should prepend "sub subname ", or "sub "
4157 for an anonymous function constructor. Unless the sub was defined in
4158 the main:: package, the code will include a package declaration.
4166 The only pragmas to be completely supported are: C<use warnings>,
4167 C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
4168 behaves like a pragma, is also supported.)
4170 Excepting those listed above, we're currently unable to guarantee that
4171 B::Deparse will produce a pragma at the correct point in the program.
4172 Since the effects of pragmas are often lexically scoped, this can mean
4173 that the pragma holds sway over a different portion of the program
4174 than in the input file.
4178 In fact, the above is a specific instance of a more general problem:
4179 we can't guarantee to produce BEGIN blocks or C<use> declarations in
4180 exactly the right place. So if you use a module which affects compilation
4181 (such as by over-riding keywords, overloading constants or whatever)
4182 then the output code might not work as intended.
4184 This is the most serious outstanding problem, and will be very hard
4189 If a keyword is over-ridden, and your program explicitly calls
4190 the built-in version by using CORE::keyword, the output of B::Deparse
4191 will not reflect this. If you run the resulting code, it will call
4192 the over-ridden version rather than the built-in one. (Maybe there
4193 should be an option to B<always> print keyword calls as C<CORE::name>.)
4197 C<sort foo (1, 2, 3)> comes out as C<sort (foo 1, 2, 3)>, which
4198 causes perl to issue a warning.
4200 The obvious fix doesn't work, because these are different:
4202 print (FOO 1, 2, 3), 4, 5, 6;
4203 print FOO (1, 2, 3), 4, 5, 6;
4207 Constants (other than simple strings or numbers) don't work properly.
4208 Pathological examples that fail (and probably always will) include:
4210 use constant E2BIG => ($!=7);
4211 use constant x=>\$x; print x
4213 The following could (and should) be made to work:
4215 use constant regex => qr/blah/;
4220 An input file that uses source filtering probably won't be deparsed into
4221 runnable code, because it will still include the B<use> declaration
4222 for the source filtering module, even though the code that is
4223 produced is already ordinary Perl which shouldn't be filtered again.
4227 There are probably many more bugs on non-ASCII platforms (EBCDIC).
4233 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier
4234 version by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with
4235 contributions from Gisle Aas, James Duncan, Albert Dvornik, Robin
4236 Houston, Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons,
4237 and Rafael Garcia-Suarez.