This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
b54a5af97b6319a6c74094407d9841a82bf3d3e2
[perl5.git] / ext / B / B / Deparse.pm
1 # B::Deparse.pm
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.
5
6 # This is based on the module of the same name by Malcolm Beattie,
7 # but essentially none of his code remains.
8
9 package B::Deparse;
10 use Carp;
11 use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
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
17          OPpSORT_REVERSE
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);
22 $VERSION = 0.63;
23 use strict;
24 use vars qw/$AUTOLOAD/;
25 use warnings ();
26
27 # Changes between 0.50 and 0.51:
28 # - fixed nulled leave with live enter in sort { }
29 # - fixed reference constants (\"str")
30 # - handle empty programs gracefully
31 # - handle infinte loops (for (;;) {}, while (1) {})
32 # - differentiate between `for my $x ...' and `my $x; for $x ...'
33 # - various minor cleanups
34 # - moved globals into an object
35 # - added `-u', like B::C
36 # - package declarations using cop_stash
37 # - subs, formats and code sorted by cop_seq
38 # Changes between 0.51 and 0.52:
39 # - added pp_threadsv (special variables under USE_5005THREADS)
40 # - added documentation
41 # Changes between 0.52 and 0.53:
42 # - many changes adding precedence contexts and associativity
43 # - added `-p' and `-s' output style options
44 # - various other minor fixes
45 # Changes between 0.53 and 0.54:
46 # - added support for new `for (1..100)' optimization,
47 #   thanks to Gisle Aas
48 # Changes between 0.54 and 0.55:
49 # - added support for new qr// construct
50 # - added support for new pp_regcreset OP
51 # Changes between 0.55 and 0.56:
52 # - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
53 # - fixed $# on non-lexicals broken in last big rewrite
54 # - added temporary fix for change in opcode of OP_STRINGIFY
55 # - fixed problem in 0.54's for() patch in `for (@ary)'
56 # - fixed precedence in conditional of ?:
57 # - tweaked list paren elimination in `my($x) = @_'
58 # - made continue-block detection trickier wrt. null ops
59 # - fixed various prototype problems in pp_entersub
60 # - added support for sub prototypes that never get GVs
61 # - added unquoting for special filehandle first arg in truncate
62 # - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
63 # - added semicolons at the ends of blocks
64 # - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
65 # Changes between 0.56 and 0.561:
66 # - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
67 # - used new B.pm symbolic constants (done by Nick Ing-Simmons)
68 # Changes between 0.561 and 0.57:
69 # - stylistic changes to symbolic constant stuff
70 # - handled scope in s///e replacement code
71 # - added unquote option for expanding "" into concats, etc.
72 # - split method and proto parts of pp_entersub into separate functions
73 # - various minor cleanups
74 # Changes after 0.57:
75 # - added parens in \&foo (patch by Albert Dvornik)
76 # Changes between 0.57 and 0.58:
77 # - fixed `0' statements that weren't being printed
78 # - added methods for use from other programs
79 #   (based on patches from James Duncan and Hugo van der Sanden)
80 # - added -si and -sT to control indenting (also based on a patch from Hugo)
81 # - added -sv to print something else instead of '???'
82 # - preliminary version of utf8 tr/// handling
83 # Changes after 0.58:
84 # - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
85 # - added support for Hugo's new OP_SETSTATE (like nextstate) 
86 # Changes between 0.58 and 0.59
87 # - added support for Chip's OP_METHOD_NAMED
88 # - added support for Ilya's OPpTARGET_MY optimization
89 # - elided arrows before `()' subscripts when possible
90 # Changes between 0.59 and 0.60
91 # - support for method attribues was added
92 # - some warnings fixed
93 # - separate recognition of constant subs
94 # - rewrote continue block handling, now recoginizing for loops
95 # - added more control of expanding control structures
96 # Changes between 0.60 and 0.61 (mostly by Robin Houston)
97 # - many bug-fixes
98 # - support for pragmas and 'use'
99 # - support for the little-used $[ variable
100 # - support for __DATA__ sections
101 # - UTF8 support
102 # - BEGIN, CHECK, INIT and END blocks
103 # - scoping of subroutine declarations fixed
104 # - compile-time output from the input program can be suppressed, so that the
105 #   output is just the deparsed code. (a change to O.pm in fact)
106 # - our() declarations
107 # - *all* the known bugs are now listed in the BUGS section
108 # - comprehensive test mechanism (TEST -deparse)
109 # Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
110 # - bug-fixes
111 # - new switch -P
112 # - support for command-line switches (-l, -0, etc.)
113
114 # Todo:
115 #  (See also BUGS section at the end of this file)
116 #
117 # - finish tr/// changes
118 # - add option for even more parens (generalize \&foo change)
119 # - left/right context
120 # - treat top-level block specially for incremental output
121 # - copy comments (look at real text with $^P?)
122 # - avoid semis in one-statement blocks
123 # - associativity of &&=, ||=, ?:
124 # - ',' => '=>' (auto-unquote?)
125 # - break long lines ("\r" as discretionary break?)
126 # - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
127 # - more style options: brace style, hex vs. octal, quotes, ...
128 # - print big ints as hex/octal instead of decimal (heuristic?)
129 # - handle `my $x if 0'?
130 # - coordinate with Data::Dumper (both directions? see previous)
131 # - version using op_next instead of op_first/sibling?
132 # - avoid string copies (pass arrays, one big join?)
133 # - here-docs?
134
135 # Tests that will always fail:
136 # (see t/TEST for the short list)
137
138 # Object fields (were globals):
139 #
140 # avoid_local:
141 # (local($a), local($b)) and local($a, $b) have the same internal
142 # representation but the short form looks better. We notice we can
143 # use a large-scale local when checking the list, but need to prevent
144 # individual locals too. This hash holds the addresses of OPs that 
145 # have already had their local-ness accounted for. The same thing
146 # is done with my().
147 #
148 # curcv:
149 # CV for current sub (or main program) being deparsed
150 #
151 # curcvlex:
152 # Cached hash of lexical variables for curcv: keys are names,
153 # each value is an array of pairs, indicating the cop_seq of scopes
154 # in which a var of that name is valid.
155 #
156 # curcop:
157 # COP for statement being deparsed
158 #
159 # curstash:
160 # name of the current package for deparsed code
161 #
162 # subs_todo:
163 # array of [cop_seq, CV, is_format?] for subs and formats we still
164 # want to deparse
165 #
166 # protos_todo:
167 # as above, but [name, prototype] for subs that never got a GV
168 #
169 # subs_done, forms_done:
170 # keys are addresses of GVs for subs and formats we've already
171 # deparsed (or at least put into subs_todo)
172 #
173 # subs_declared
174 # keys are names of subs for which we've printed declarations.
175 # That means we can omit parentheses from the arguments.
176 #
177 # subs_deparsed
178 # Keeps track of fully qualified names of all deparsed subs.
179 #
180 # parens: -p
181 # linenums: -l
182 # unquote: -q
183 # cuddle: ` ' or `\n', depending on -sC
184 # indent_size: -si
185 # use_tabs: -sT
186 # ex_const: -sv
187
188 # A little explanation of how precedence contexts and associativity
189 # work:
190 #
191 # deparse() calls each per-op subroutine with an argument $cx (short
192 # for context, but not the same as the cx* in the perl core), which is
193 # a number describing the op's parents in terms of precedence, whether
194 # they're inside an expression or at statement level, etc.  (see
195 # chart below). When ops with children call deparse on them, they pass
196 # along their precedence. Fractional values are used to implement
197 # associativity (`($x + $y) + $z' => `$x + $y + $y') and related
198 # parentheses hacks. The major disadvantage of this scheme is that
199 # it doesn't know about right sides and left sides, so say if you
200 # assign a listop to a variable, it can't tell it's allowed to leave
201 # the parens off the listop.
202
203 # Precedences:
204 # 26             [TODO] inside interpolation context ("")
205 # 25 left        terms and list operators (leftward)
206 # 24 left        ->
207 # 23 nonassoc    ++ --
208 # 22 right       **
209 # 21 right       ! ~ \ and unary + and -
210 # 20 left        =~ !~
211 # 19 left        * / % x
212 # 18 left        + - .
213 # 17 left        << >>
214 # 16 nonassoc    named unary operators
215 # 15 nonassoc    < > <= >= lt gt le ge
216 # 14 nonassoc    == != <=> eq ne cmp
217 # 13 left        &
218 # 12 left        | ^
219 # 11 left        &&
220 # 10 left        ||
221 #  9 nonassoc    ..  ...
222 #  8 right       ?:
223 #  7 right       = += -= *= etc.
224 #  6 left        , =>
225 #  5 nonassoc    list operators (rightward)
226 #  4 right       not
227 #  3 left        and
228 #  2 left        or xor
229 #  1             statement modifiers
230 #  0             statement level
231
232 # Also, lineseq may pass a fourth parameter to the pp_ routines:
233 # if present, the fourth parameter is passed on by deparse.
234 #
235 # If present and true, it means that the op exists directly as
236 # part of a lineseq. Currently it's only used by scopeop to
237 # decide whether its results need to be enclosed in a do {} block.
238
239 # Nonprinting characters with special meaning:
240 # \cS - steal parens (see maybe_parens_unop)
241 # \n - newline and indent
242 # \t - increase indent
243 # \b - decrease indent (`outdent')
244 # \f - flush left (no indent)
245 # \cK - kill following semicolon, if any
246
247 sub null {
248     my $op = shift;
249     return class($op) eq "NULL";
250 }
251
252 sub todo {
253     my $self = shift;
254     my($cv, $is_form) = @_;
255     return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE});
256     my $seq;
257     if (!null($cv->START) and is_state($cv->START)) {
258         $seq = $cv->START->cop_seq;
259     } else {
260         $seq = 0;
261     }
262     push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form];
263     unless ($is_form || class($cv->STASH) eq 'SPECIAL') {
264         $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1;
265     }
266 }
267
268 sub next_todo {
269     my $self = shift;
270     my $ent = shift @{$self->{'subs_todo'}};
271     my $cv = $ent->[1];
272     my $gv = $cv->GV;
273     my $name = $self->gv_name($gv);
274     if ($ent->[2]) {
275         return "format $name =\n"
276             . $self->deparse_format($ent->[1]). "\n";
277     } else {
278         $self->{'subs_declared'}{$name} = 1;
279         if ($name eq "BEGIN") {
280             my $use_dec = $self->begin_is_use($cv);
281             if (defined ($use_dec)) {
282                 return () if 0 == length($use_dec);
283                 return $use_dec;
284             }
285         }
286         my $l = '';
287         if ($self->{'linenums'}) {
288             my $line = $gv->LINE;
289             my $file = $gv->FILE;
290             $l = "\n\f#line $line \"$file\"\n";
291         }
292         return "${l}sub $name " . $self->deparse_sub($cv);
293     }
294 }
295
296 # Return a "use" declaration for this BEGIN block, if appropriate
297 sub begin_is_use {
298     my ($self, $cv) = @_;
299     my $root = $cv->ROOT;
300     local @$self{qw'curcv curcvlex'} = ($cv);
301 #require B::Debug;
302 #B::walkoptree($cv->ROOT, "debug");
303     my $lineseq = $root->first;
304     return if $lineseq->name ne "lineseq";
305
306     my $req_op = $lineseq->first->sibling;
307     return if $req_op->name ne "require";
308
309     my $module;
310     if ($req_op->first->private & OPpCONST_BARE) {
311         # Actually it should always be a bareword
312         $module = $self->const_sv($req_op->first)->PV;
313         $module =~ s[/][::]g;
314         $module =~ s/.pm$//;
315     }
316     else {
317         $module = const($self->const_sv($req_op->first));
318     }
319
320     my $version;
321     my $version_op = $req_op->sibling;
322     return if class($version_op) eq "NULL";
323     if ($version_op->name eq "lineseq") {
324         # We have a version parameter; skip nextstate & pushmark
325         my $constop = $version_op->first->next->next;
326
327         return unless $self->const_sv($constop)->PV eq $module;
328         $constop = $constop->sibling;
329         $version = $self->const_sv($constop)->int_value;
330         $constop = $constop->sibling;
331         return if $constop->name ne "method_named";
332         return if $self->const_sv($constop)->PV ne "VERSION";
333     }
334
335     $lineseq = $version_op->sibling;
336     return if $lineseq->name ne "lineseq";
337     my $entersub = $lineseq->first->sibling;
338     if ($entersub->name eq "stub") {
339         return "use $module $version ();\n" if defined $version;
340         return "use $module ();\n";
341     }
342     return if $entersub->name ne "entersub";
343
344     # See if there are import arguments
345     my $args = '';
346
347     my $svop = $entersub->first->sibling; # Skip over pushmark
348     return unless $self->const_sv($svop)->PV eq $module;
349
350     # Pull out the arguments
351     for ($svop=$svop->sibling; $svop->name ne "method_named";
352                 $svop = $svop->sibling) {
353         $args .= ", " if length($args);
354         $args .= $self->deparse($svop, 6);
355     }
356
357     my $use = 'use';
358     my $method_named = $svop;
359     return if $method_named->name ne "method_named";
360     my $method_name = $self->const_sv($method_named)->PV;
361
362     if ($method_name eq "unimport") {
363         $use = 'no';
364     }
365
366     # Certain pragmas are dealt with using hint bits,
367     # so we ignore them here
368     if ($module eq 'strict' || $module eq 'integer'
369         || $module eq 'bytes' || $module eq 'warnings') {
370         return "";
371     }
372
373     if (defined $version && length $args) {
374         return "$use $module $version ($args);\n";
375     } elsif (defined $version) {
376         return "$use $module $version;\n";
377     } elsif (length $args) {
378         return "$use $module ($args);\n";
379     } else {
380         return "$use $module;\n";
381     }
382 }
383
384 sub stash_subs {
385     my ($self, $pack) = @_;
386     my (@ret, $stash);
387     if (!defined $pack) {
388         $pack = '';
389         $stash = \%::;
390     }
391     else {
392         $pack =~ s/(::)?$/::/;
393         no strict 'refs';
394         $stash = \%$pack;
395     }
396     my %stash = svref_2object($stash)->ARRAY;
397     while (my ($key, $val) = each %stash) {
398         next if $key eq 'main::';       # avoid infinite recursion
399         my $class = class($val);
400         if ($class eq "PV") {
401             # Just a prototype. As an ugly but fairly effective way
402             # to find out if it belongs here is to see if the AUTOLOAD
403             # (if any) for the stash was defined in one of our files.
404             my $A = $stash{"AUTOLOAD"};
405             if (defined ($A) && class($A) eq "GV" && defined($A->CV)
406                 && class($A->CV) eq "CV") {
407                 my $AF = $A->FILE;
408                 next unless $AF eq $0 || exists $self->{'files'}{$AF};
409             }
410             push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV];
411         } elsif ($class eq "IV") {
412             # Just a name. As above.
413             my $A = $stash{"AUTOLOAD"};
414             if (defined ($A) && class($A) eq "GV" && defined($A->CV)
415                 && class($A->CV) eq "CV") {
416                 my $AF = $A->FILE;
417                 next unless $AF eq $0 || exists $self->{'files'}{$AF};
418             }
419             push @{$self->{'protos_todo'}}, [$pack . $key, undef];          
420         } elsif ($class eq "GV") {
421             if (class(my $cv = $val->CV) ne "SPECIAL") {
422                 next if $self->{'subs_done'}{$$val}++;
423                 next if $$val != ${$cv->GV};   # Ignore imposters
424                 $self->todo($cv, 0);
425             }
426             if (class(my $cv = $val->FORM) ne "SPECIAL") {
427                 next if $self->{'forms_done'}{$$val}++;
428                 next if $$val != ${$cv->GV};   # Ignore imposters
429                 $self->todo($cv, 1);
430             }
431             if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
432                 $self->stash_subs($pack . $key);
433             }
434         }
435     }
436 }
437
438 sub print_protos {
439     my $self = shift;
440     my $ar;
441     my @ret;
442     foreach $ar (@{$self->{'protos_todo'}}) {
443         my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : "");
444         push @ret, "sub " . $ar->[0] .  "$proto;\n";
445     }
446     delete $self->{'protos_todo'};
447     return @ret;
448 }
449
450 sub style_opts {
451     my $self = shift;
452     my $opts = shift;
453     my $opt;
454     while (length($opt = substr($opts, 0, 1))) {
455         if ($opt eq "C") {
456             $self->{'cuddle'} = " ";
457             $opts = substr($opts, 1);
458         } elsif ($opt eq "i") {
459             $opts =~ s/^i(\d+)//;
460             $self->{'indent_size'} = $1;
461         } elsif ($opt eq "T") {
462             $self->{'use_tabs'} = 1;
463             $opts = substr($opts, 1);
464         } elsif ($opt eq "v") {
465             $opts =~ s/^v([^.]*)(.|$)//;
466             $self->{'ex_const'} = $1;
467         }
468     }
469 }
470
471 sub new {
472     my $class = shift;
473     my $self = bless {}, $class;
474     $self->{'subs_todo'} = [];
475     $self->{'files'} = {};
476     $self->{'curstash'} = "main";
477     $self->{'curcop'} = undef;
478     $self->{'cuddle'} = "\n";
479     $self->{'indent_size'} = 4;
480     $self->{'use_tabs'} = 0;
481     $self->{'expand'} = 0;
482     $self->{'unquote'} = 0;
483     $self->{'linenums'} = 0;
484     $self->{'parens'} = 0;
485     $self->{'ex_const'} = "'???'";
486
487     $self->{'ambient_arybase'} = 0;
488     $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
489     $self->{'ambient_hints'} = 0;
490     $self->init();
491
492     while (my $arg = shift @_) {
493         if ($arg =~ /^-f(.*)/) {
494             $self->{'files'}{$1} = 1;
495         } elsif ($arg eq "-p") {
496             $self->{'parens'} = 1;
497         } elsif ($arg eq "-P") {
498             $self->{'noproto'} = 1;
499         } elsif ($arg eq "-l") {
500             $self->{'linenums'} = 1;
501         } elsif ($arg eq "-q") {
502             $self->{'unquote'} = 1;
503         } elsif (substr($arg, 0, 2) eq "-s") {
504             $self->style_opts(substr $arg, 2);
505         } elsif ($arg =~ /^-x(\d)$/) {
506             $self->{'expand'} = $1;
507         }
508     }
509     return $self;
510 }
511
512 {
513     # Mask out the bits that L<warnings::register> uses
514     my $WARN_MASK;
515     BEGIN {
516         $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
517     }
518     sub WARN_MASK () {
519         return $WARN_MASK;
520     }
521 }
522
523 # Initialise the contextual information, either from
524 # defaults provided with the ambient_pragmas method,
525 # or from perl's own defaults otherwise.
526 sub init {
527     my $self = shift;
528
529     $self->{'arybase'}  = $self->{'ambient_arybase'};
530     $self->{'warnings'} = defined ($self->{'ambient_warnings'})
531                                 ? $self->{'ambient_warnings'} & WARN_MASK
532                                 : undef;
533     $self->{'hints'}    = $self->{'ambient_hints'} & 0xFF;
534
535     # also a convenient place to clear out subs_declared
536     delete $self->{'subs_declared'};
537 }
538
539 sub compile {
540     my(@args) = @_;
541     return sub { 
542         my $self = B::Deparse->new(@args);
543         # First deparse command-line args
544         if (defined $^I) { # deparse -i
545             print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
546         }
547         if ($^W) { # deparse -w
548             print qq(BEGIN { \$^W = $^W; }\n);
549         }
550         if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
551             my $fs = perlstring($/) || 'undef';
552             my $bs = perlstring($O::savebackslash) || 'undef';
553             print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
554         }
555         my @BEGINs  = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
556         my @CHECKs  = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
557         my @INITs   = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
558         my @ENDs    = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
559         for my $block (@BEGINs, @CHECKs, @INITs, @ENDs) {
560             $self->todo($block, 0);
561         }
562         $self->stash_subs();
563         $self->{'curcv'} = main_cv;
564         $self->{'curcvlex'} = undef;
565         print $self->print_protos;
566         @{$self->{'subs_todo'}} =
567           sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
568         print $self->indent($self->deparse(main_root, 0)), "\n"
569           unless null main_root;
570         my @text;
571         while (scalar(@{$self->{'subs_todo'}})) {
572             push @text, $self->next_todo;
573         }
574         print $self->indent(join("", @text)), "\n" if @text;
575
576         # Print __DATA__ section, if necessary
577         no strict 'refs';
578         my $laststash = defined $self->{'curcop'}
579             ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
580         if (defined *{$laststash."::DATA"}{IO}) {
581             print "__DATA__\n";
582             print readline(*{$laststash."::DATA"});
583         }
584     }
585 }
586
587 sub coderef2text {
588     my $self = shift;
589     my $sub = shift;
590     croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
591
592     $self->init();
593     return $self->indent($self->deparse_sub(svref_2object($sub)));
594 }
595
596 sub ambient_pragmas {
597     my $self = shift;
598     my ($arybase, $hint_bits, $warning_bits) = (0, 0);
599
600     while (@_ > 1) {
601         my $name = shift();
602         my $val  = shift();
603
604         if ($name eq 'strict') {
605             require strict;
606
607             if ($val eq 'none') {
608                 $hint_bits &= ~strict::bits(qw/refs subs vars/);
609                 next();
610             }
611
612             my @names;
613             if ($val eq "all") {
614                 @names = qw/refs subs vars/;
615             }
616             elsif (ref $val) {
617                 @names = @$val;
618             }
619             else {
620                 @names = split' ', $val;
621             }
622             $hint_bits |= strict::bits(@names);
623         }
624
625         elsif ($name eq '$[') {
626             $arybase = $val;
627         }
628
629         elsif ($name eq 'integer'
630             || $name eq 'bytes'
631             || $name eq 'utf8') {
632             require "$name.pm";
633             if ($val) {
634                 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
635             }
636             else {
637                 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
638             }
639         }
640
641         elsif ($name eq 're') {
642             require re;
643             if ($val eq 'none') {
644                 $hint_bits &= ~re::bits(qw/taint eval/);
645                 next();
646             }
647
648             my @names;
649             if ($val eq 'all') {
650                 @names = qw/taint eval/;
651             }
652             elsif (ref $val) {
653                 @names = @$val;
654             }
655             else {
656                 @names = split' ',$val;
657             }
658             $hint_bits |= re::bits(@names);
659         }
660
661         elsif ($name eq 'warnings') {
662             if ($val eq 'none') {
663                 $warning_bits = $warnings::NONE;
664                 next();
665             }
666
667             my @names;
668             if (ref $val) {
669                 @names = @$val;
670             }
671             else {
672                 @names = split/\s+/, $val;
673             }
674
675             $warning_bits = $warnings::NONE if !defined ($warning_bits);
676             $warning_bits |= warnings::bits(@names);
677         }
678
679         elsif ($name eq 'warning_bits') {
680             $warning_bits = $val;
681         }
682
683         elsif ($name eq 'hint_bits') {
684             $hint_bits = $val;
685         }
686
687         else {
688             croak "Unknown pragma type: $name";
689         }
690     }
691     if (@_) {
692         croak "The ambient_pragmas method expects an even number of args";
693     }
694
695     $self->{'ambient_arybase'} = $arybase;
696     $self->{'ambient_warnings'} = $warning_bits;
697     $self->{'ambient_hints'} = $hint_bits;
698 }
699
700 sub deparse {
701     my $self = shift;
702     my($op, $cx, $flags) = @_;
703
704     Carp::confess("Null op in deparse") if !defined($op)
705                                         || class($op) eq "NULL";
706     my $meth = "pp_" . $op->name;
707     if (is_scope($op)) {
708         return $self->$meth($op, $cx, $flags);
709     }
710     return $self->$meth($op, $cx);
711 }
712
713 sub indent {
714     my $self = shift;
715     my $txt = shift;
716     my @lines = split(/\n/, $txt);
717     my $leader = "";
718     my $level = 0;
719     my $line;
720     for $line (@lines) {
721         my $cmd = substr($line, 0, 1);
722         if ($cmd eq "\t" or $cmd eq "\b") {
723             $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
724             if ($self->{'use_tabs'}) {
725                 $leader = "\t" x ($level / 8) . " " x ($level % 8);
726             } else {
727                 $leader = " " x $level;
728             }
729             $line = substr($line, 1);
730         }
731         if (substr($line, 0, 1) eq "\f") {
732             $line = substr($line, 1); # no indent
733         } else {
734             $line = $leader . $line;
735         }
736         $line =~ s/\cK;?//g;
737     }
738     return join("\n", @lines);
739 }
740
741 sub deparse_sub {
742     my $self = shift;
743     my $cv = shift;
744     my $proto = "";
745 Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
746 Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
747     local $self->{'curcop'} = $self->{'curcop'};
748     if ($cv->FLAGS & SVf_POK) {
749         $proto = "(". $cv->PV . ") ";
750     }
751     if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
752         $proto .= ": ";
753         $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
754         $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
755         $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
756     }
757
758     local($self->{'curcv'}) = $cv;
759     local($self->{'curcvlex'});
760     local(@$self{qw'curstash warnings hints'})
761                 = @$self{qw'curstash warnings hints'};
762     my $body;
763     if (not null $cv->ROOT) {
764         my $lineseq = $cv->ROOT->first;
765         if ($lineseq->name eq "lineseq") {
766             my @ops;
767             for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
768                 push @ops, $o;
769             }
770             $body = $self->lineseq(undef, @ops).";";
771             my $scope_en = $self->find_scope_en($lineseq);
772             if (defined $scope_en) {
773                 my $subs = join"", $self->seq_subs($scope_en);
774                 $body .= ";\n$subs" if length($subs);
775             }
776         }
777         else {
778             $body = $self->deparse($cv->ROOT->first, 0);
779         }
780     }
781     else {
782         my $sv = $cv->const_sv;
783         if ($$sv) {
784             # uh-oh. inlinable sub... format it differently
785             return $proto . "{ " . const($sv) . " }\n";
786         } else { # XSUB? (or just a declaration)
787             return "$proto;\n";
788         }
789     }
790     return $proto ."{\n\t$body\n\b}" ."\n";
791 }
792
793 sub deparse_format {
794     my $self = shift;
795     my $form = shift;
796     my @text;
797     local($self->{'curcv'}) = $form;
798     local($self->{'curcvlex'});
799     local($self->{'in_format'}) = 1;
800     local(@$self{qw'curstash warnings hints'})
801                 = @$self{qw'curstash warnings hints'};
802     my $op = $form->ROOT;
803     my $kid;
804     return "\f." if $op->first->name eq 'stub'
805                 || $op->first->name eq 'nextstate';
806     $op = $op->first->first; # skip leavewrite, lineseq
807     while (not null $op) {
808         $op = $op->sibling; # skip nextstate
809         my @exprs;
810         $kid = $op->first->sibling; # skip pushmark
811         push @text, "\f".$self->const_sv($kid)->PV;
812         $kid = $kid->sibling;
813         for (; not null $kid; $kid = $kid->sibling) {
814             push @exprs, $self->deparse($kid, 0);
815         }
816         push @text, "\f".join(", ", @exprs)."\n" if @exprs;
817         $op = $op->sibling;
818     }
819     return join("", @text) . "\f.";
820 }
821
822 sub is_scope {
823     my $op = shift;
824     return $op->name eq "leave" || $op->name eq "scope"
825       || $op->name eq "lineseq"
826         || ($op->name eq "null" && class($op) eq "UNOP" 
827             && (is_scope($op->first) || $op->first->name eq "enter"));
828 }
829
830 sub is_state {
831     my $name = $_[0]->name;
832     return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
833 }
834
835 sub is_miniwhile { # check for one-line loop (`foo() while $y--')
836     my $op = shift;
837     return (!null($op) and null($op->sibling) 
838             and $op->name eq "null" and class($op) eq "UNOP"
839             and (($op->first->name =~ /^(and|or)$/
840                   and $op->first->first->sibling->name eq "lineseq")
841                  or ($op->first->name eq "lineseq"
842                      and not null $op->first->first->sibling
843                      and $op->first->first->sibling->name eq "unstack")
844                  ));
845 }
846
847 sub is_scalar {
848     my $op = shift;
849     return ($op->name eq "rv2sv" or
850             $op->name eq "padsv" or
851             $op->name eq "gv" or # only in array/hash constructs
852             $op->flags & OPf_KIDS && !null($op->first)
853               && $op->first->name eq "gvsv");
854 }
855
856 sub maybe_parens {
857     my $self = shift;
858     my($text, $cx, $prec) = @_;
859     if ($prec < $cx              # unary ops nest just fine
860         or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
861         or $self->{'parens'})
862     {
863         $text = "($text)";
864         # In a unop, let parent reuse our parens; see maybe_parens_unop
865         $text = "\cS" . $text if $cx == 16;
866         return $text;
867     } else {
868         return $text;
869     }
870 }
871
872 # same as above, but get around the `if it looks like a function' rule
873 sub maybe_parens_unop {
874     my $self = shift;
875     my($name, $kid, $cx) = @_;
876     if ($cx > 16 or $self->{'parens'}) {
877         $kid =  $self->deparse($kid, 1);
878         if ($name eq "umask" && $kid =~ /^\d+$/) {
879             $kid = sprintf("%#o", $kid);
880         }
881         return "$name($kid)";
882     } else {
883         $kid = $self->deparse($kid, 16);
884         if ($name eq "umask" && $kid =~ /^\d+$/) {
885             $kid = sprintf("%#o", $kid);
886         }
887         if (substr($kid, 0, 1) eq "\cS") {
888             # use kid's parens
889             return $name . substr($kid, 1);
890         } elsif (substr($kid, 0, 1) eq "(") {
891             # avoid looks-like-a-function trap with extra parens
892             # (`+' can lead to ambiguities)
893             return "$name(" . $kid  . ")";
894         } else {
895             return "$name $kid";
896         }
897     }
898 }
899
900 sub maybe_parens_func {
901     my $self = shift;
902     my($func, $text, $cx, $prec) = @_;
903     if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
904         return "$func($text)";
905     } else {
906         return "$func $text";
907     }
908 }
909
910 sub maybe_local {
911     my $self = shift;
912     my($op, $cx, $text) = @_;
913     my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0;
914     if ($op->private & (OPpLVAL_INTRO|$our_intro)
915         and not $self->{'avoid_local'}{$$op}) {
916         my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our";
917         if (want_scalar($op)) {
918             return "$our_local $text";
919         } else {
920             return $self->maybe_parens_func("$our_local", $text, $cx, 16);
921         }
922     } else {
923         return $text;
924     }
925 }
926
927 sub maybe_targmy {
928     my $self = shift;
929     my($op, $cx, $func, @args) = @_;
930     if ($op->private & OPpTARGET_MY) {
931         my $var = $self->padname($op->targ);
932         my $val = $func->($self, $op, 7, @args);
933         return $self->maybe_parens("$var = $val", $cx, 7);
934     } else {
935         return $func->($self, $op, $cx, @args);
936     }
937 }
938
939 sub padname_sv {
940     my $self = shift;
941     my $targ = shift;
942     return (($self->{'curcv'}->PADLIST->ARRAY)[0]->ARRAY)[$targ];
943 }
944
945 sub maybe_my {
946     my $self = shift;
947     my($op, $cx, $text) = @_;
948     if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
949         if (want_scalar($op)) {
950             return "my $text";
951         } else {
952             return $self->maybe_parens_func("my", $text, $cx, 16);
953         }
954     } else {
955         return $text;
956     }
957 }
958
959 # The following OPs don't have functions:
960
961 # pp_padany -- does not exist after parsing
962
963 sub AUTOLOAD {
964     if ($AUTOLOAD =~ s/^.*::pp_//) {
965         warn "unexpected OP_".uc $AUTOLOAD;
966         return "XXX";
967     } else {
968         die "Undefined subroutine $AUTOLOAD called";
969     }
970 }
971
972 sub DESTROY {}  #       Do not AUTOLOAD
973
974 # $root should be the op which represents the root of whatever
975 # we're sequencing here. If it's undefined, then we don't append
976 # any subroutine declarations to the deparsed ops, otherwise we
977 # append appropriate declarations.
978 sub lineseq {
979     my($self, $root, @ops) = @_;
980     my($expr, @exprs);
981
982     my $out_cop = $self->{'curcop'};
983     my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
984     my $limit_seq;
985     if (defined $root) {
986         $limit_seq = $out_seq;
987         my $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
988         $limit_seq = $nseq if !defined($limit_seq)
989                            or defined($nseq) && $nseq < $limit_seq;
990     }
991     $limit_seq = $self->{'limit_seq'}
992         if defined($self->{'limit_seq'})
993         && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
994     local $self->{'limit_seq'} = $limit_seq;
995     for (my $i = 0; $i < @ops; $i++) {
996         $expr = "";
997         if (is_state $ops[$i]) {
998             $expr = $self->deparse($ops[$i], 0);
999             $i++;
1000             if ($i > $#ops) {
1001                 push @exprs, $expr;
1002                 last;
1003             }
1004         }
1005         if (!is_state $ops[$i] and (my $ls = $ops[$i+1]) and
1006             !null($ops[$i+1]) and $ops[$i+1]->name eq "lineseq")
1007         {
1008             if ($ls->first && !null($ls->first) && is_state($ls->first)
1009                 && (my $sib = $ls->first->sibling)) {
1010                 if (!null($sib) && $sib->name eq "leaveloop") {
1011                     push @exprs, $expr . $self->for_loop($ops[$i], 0);
1012                     $i++;
1013                     next;
1014                 }
1015             }
1016         }
1017         $expr .= $self->deparse($ops[$i], 0, (@ops != 1));
1018         $expr =~ s/;\n?\z//;
1019         push @exprs, $expr;
1020     }
1021     my $body = join(";\n", grep {length} @exprs);
1022     my $subs = "";
1023     if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
1024         $subs = join "\n", $self->seq_subs($limit_seq);
1025     }
1026     return join(";\n", grep {length} $body, $subs);
1027 }
1028
1029 sub scopeop {
1030     my($real_block, $self, $op, $cx, $flags) = @_;
1031     my $kid;
1032     my @kids;
1033
1034     local(@$self{qw'curstash warnings hints'})
1035                 = @$self{qw'curstash warnings hints'} if $real_block;
1036     if ($real_block) {
1037         $kid = $op->first->sibling; # skip enter
1038         if (is_miniwhile($kid)) {
1039             my $top = $kid->first;
1040             my $name = $top->name;
1041             if ($name eq "and") {
1042                 $name = "while";
1043             } elsif ($name eq "or") {
1044                 $name = "until";
1045             } else { # no conditional -> while 1 or until 0
1046                 return $self->deparse($top->first, 1) . " while 1";
1047             }
1048             my $cond = $top->first;
1049             my $body = $cond->sibling->first; # skip lineseq
1050             $cond = $self->deparse($cond, 1);
1051             $body = $self->deparse($body, 1);
1052             return "$body $name $cond";
1053         }
1054     } else {
1055         $kid = $op->first;
1056     }
1057     for (; !null($kid); $kid = $kid->sibling) {
1058         push @kids, $kid;
1059     }
1060     if ($flags || $cx > 0) { # inside an expression, (a do {} while for lineseq)
1061         return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}";
1062     } else {
1063         my $lineseq = $self->lineseq($op, @kids);
1064         return (length ($lineseq) ? "$lineseq;" : "");
1065     }
1066 }
1067
1068 sub pp_scope { scopeop(0, @_); }
1069 sub pp_lineseq { scopeop(0, @_); }
1070 sub pp_leave { scopeop(1, @_); }
1071
1072 # The BEGIN {} is used here because otherwise this code isn't executed
1073 # when you run B::Deparse on itself.
1074 my %globalnames;
1075 BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1076             "ENV", "ARGV", "ARGVOUT", "_"); }
1077
1078 sub gv_name {
1079     my $self = shift;
1080     my $gv = shift;
1081 Carp::confess() if $gv->isa("B::CV");
1082     my $stash = $gv->STASH->NAME;
1083     my $name = $gv->SAFENAME;
1084     if (($stash eq 'main' && $globalnames{$name})
1085         or ($stash eq $self->{'curstash'} && !$globalnames{$name})
1086         or $name =~ /^[^A-Za-z_]/)
1087     {
1088         $stash = "";
1089     } else {
1090         $stash = $stash . "::";
1091     }
1092     if ($name =~ /^(\^..|{)/) {
1093         $name = "{$name}";       # ${^WARNING_BITS}, etc and ${
1094     }
1095     return $stash . $name;
1096 }
1097
1098 # Return the name to use for a stash variable.
1099 # If a lexical with the same name is in scope, it may need to be
1100 # fully-qualified.
1101 sub stash_variable {
1102     my ($self, $prefix, $name) = @_;
1103
1104     return "$prefix$name" if $name =~ /::/;
1105
1106     unless ($prefix eq '$' || $prefix eq '@' ||
1107             $prefix eq '%' || $prefix eq '$#') {
1108         return "$prefix$name";
1109     }
1110
1111     my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1112     return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
1113     return "$prefix$name";
1114 }
1115
1116 sub lex_in_scope {
1117     my ($self, $name) = @_;
1118     $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1119
1120     return 0 if !defined($self->{'curcop'});
1121     my $seq = $self->{'curcop'}->cop_seq;
1122     return 0 if !exists $self->{'curcvlex'}{$name};
1123     for my $a (@{$self->{'curcvlex'}{$name}}) {
1124         my ($st, $en) = @$a;
1125         return 1 if $seq > $st && $seq <= $en;
1126     }
1127     return 0;
1128 }
1129
1130 sub populate_curcvlex {
1131     my $self = shift;
1132     for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
1133         my @padlist = $cv->PADLIST->ARRAY;
1134         my @ns = $padlist[0]->ARRAY;
1135
1136         for (my $i=0; $i<@ns; ++$i) {
1137             next if class($ns[$i]) eq "SPECIAL";
1138             next if $ns[$i]->FLAGS & SVpad_OUR;  # Skip "our" vars
1139             if (class($ns[$i]) eq "PV") {
1140                 # Probably that pesky lexical @_
1141                 next;
1142             }
1143             my $name = $ns[$i]->PVX;
1144             my $seq_st = $ns[$i]->NVX;
1145             my $seq_en = int($ns[$i]->IVX);
1146
1147             push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en];
1148         }
1149     }
1150 }
1151
1152 sub find_scope_st { ((find_scope(@_))[0]); }
1153 sub find_scope_en { ((find_scope(@_))[1]); }
1154
1155 # Recurses down the tree, looking for pad variable introductions and COPs
1156 sub find_scope {
1157     my ($self, $op, $scope_st, $scope_en) = @_;
1158     carp("Undefined op in find_scope") if !defined $op;
1159     return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1160
1161     for (my $o=$op->first; $$o; $o=$o->sibling) {
1162         if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1163             my $s = int($self->padname_sv($o->targ)->NVX);
1164             my $e = $self->padname_sv($o->targ)->IVX;
1165             $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1166             $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1167         }
1168         elsif (is_state($o)) {
1169             my $c = $o->cop_seq;
1170             $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1171             $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1172         }
1173         elsif ($o->flags & OPf_KIDS) {
1174             ($scope_st, $scope_en) =
1175                 $self->find_scope($o, $scope_st, $scope_en)
1176         }
1177     }
1178
1179     return ($scope_st, $scope_en);
1180 }
1181
1182 # Returns a list of subs which should be inserted before the COP
1183 sub cop_subs {
1184     my ($self, $op, $out_seq) = @_;
1185     my $seq = $op->cop_seq;
1186     # If we have nephews, then our sequence number indicates
1187     # the cop_seq of the end of some sort of scope.
1188     if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
1189         and my $nseq = $self->find_scope_st($op->sibling) ) {
1190         $seq = $nseq;
1191     }
1192     $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1193     return $self->seq_subs($seq);
1194 }
1195
1196 sub seq_subs {
1197     my ($self, $seq) = @_;
1198     my @text;
1199 #push @text, "# ($seq)\n";
1200
1201     return "" if !defined $seq;
1202     while (scalar(@{$self->{'subs_todo'}})
1203            and $seq > $self->{'subs_todo'}[0][0]) {
1204         push @text, $self->next_todo;
1205     }
1206     return @text;
1207 }
1208
1209 # Notice how subs and formats are inserted between statements here;
1210 # also $[ assignments and pragmas.
1211 sub pp_nextstate {
1212     my $self = shift;
1213     my($op, $cx) = @_;
1214     $self->{'curcop'} = $op;
1215     my @text;
1216     push @text, $self->cop_subs($op);
1217     push @text, $op->label . ": " if $op->label;
1218     my $stash = $op->stashpv;
1219     if ($stash ne $self->{'curstash'}) {
1220         push @text, "package $stash;\n";
1221         $self->{'curstash'} = $stash;
1222     }
1223     if ($self->{'linenums'}) {
1224         push @text, "\f#line " . $op->line . 
1225           ' "' . $op->file, qq'"\n';
1226     }
1227
1228     if ($self->{'arybase'} != $op->arybase) {
1229         push @text, '$[ = '. $op->arybase .";\n";
1230         $self->{'arybase'} = $op->arybase;
1231     }
1232
1233     my $warnings = $op->warnings;
1234     my $warning_bits;
1235     if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
1236         $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
1237     }
1238     elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
1239         $warning_bits = $warnings::NONE;
1240     }
1241     elsif ($warnings->isa("B::SPECIAL")) {
1242         $warning_bits = undef;
1243     }
1244     else {
1245         $warning_bits = $warnings->PV & WARN_MASK;
1246     }
1247
1248     if (defined ($warning_bits) and
1249        !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
1250         push @text, declare_warnings($self->{'warnings'}, $warning_bits);
1251         $self->{'warnings'} = $warning_bits;
1252     }
1253
1254     if ($self->{'hints'} != $op->private) {
1255         push @text, declare_hints($self->{'hints'}, $op->private);
1256         $self->{'hints'} = $op->private;
1257     }
1258
1259     return join("", @text);
1260 }
1261
1262 sub declare_warnings {
1263     my ($from, $to) = @_;
1264     if (($to & WARN_MASK) eq warnings::bits("all")) {
1265         return "use warnings;\n";
1266     }
1267     elsif (($to & WARN_MASK) eq "\0"x length($to)) {
1268         return "no warnings;\n";
1269     }
1270     return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n";
1271 }
1272
1273 sub declare_hints {
1274     my ($from, $to) = @_;
1275     my $use = $to   & ~$from;
1276     my $no  = $from & ~$to;
1277     my $decls = "";
1278     for my $pragma (hint_pragmas($use)) {
1279         $decls .= "use $pragma;\n";
1280     }
1281     for my $pragma (hint_pragmas($no)) {
1282         $decls .= "no $pragma;\n";
1283     }
1284     return $decls;
1285 }
1286
1287 sub hint_pragmas {
1288     my ($bits) = @_;
1289     my @pragmas;
1290     push @pragmas, "integer" if $bits & 0x1;
1291     push @pragmas, "strict 'refs'" if $bits & 0x2;
1292     push @pragmas, "bytes" if $bits & 0x8;
1293     return @pragmas;
1294 }
1295
1296 sub pp_dbstate { pp_nextstate(@_) }
1297 sub pp_setstate { pp_nextstate(@_) }
1298
1299 sub pp_unstack { return "" } # see also leaveloop
1300
1301 sub baseop {
1302     my $self = shift;
1303     my($op, $cx, $name) = @_;
1304     return $name;
1305 }
1306
1307 sub pp_stub {
1308     my $self = shift;
1309     my($op, $cx, $name) = @_;
1310     if ($cx) {
1311         return "()";
1312     }
1313     else {
1314         return "();";
1315     }
1316 }
1317 sub pp_wantarray { baseop(@_, "wantarray") }
1318 sub pp_fork { baseop(@_, "fork") }
1319 sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
1320 sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
1321 sub pp_time { maybe_targmy(@_, \&baseop, "time") }
1322 sub pp_tms { baseop(@_, "times") }
1323 sub pp_ghostent { baseop(@_, "gethostent") }
1324 sub pp_gnetent { baseop(@_, "getnetent") }
1325 sub pp_gprotoent { baseop(@_, "getprotoent") }
1326 sub pp_gservent { baseop(@_, "getservent") }
1327 sub pp_ehostent { baseop(@_, "endhostent") }
1328 sub pp_enetent { baseop(@_, "endnetent") }
1329 sub pp_eprotoent { baseop(@_, "endprotoent") }
1330 sub pp_eservent { baseop(@_, "endservent") }
1331 sub pp_gpwent { baseop(@_, "getpwent") }
1332 sub pp_spwent { baseop(@_, "setpwent") }
1333 sub pp_epwent { baseop(@_, "endpwent") }
1334 sub pp_ggrent { baseop(@_, "getgrent") }
1335 sub pp_sgrent { baseop(@_, "setgrent") }
1336 sub pp_egrent { baseop(@_, "endgrent") }
1337 sub pp_getlogin { baseop(@_, "getlogin") }
1338
1339 sub POSTFIX () { 1 }
1340
1341 # I couldn't think of a good short name, but this is the category of
1342 # symbolic unary operators with interesting precedence
1343
1344 sub pfixop {
1345     my $self = shift;
1346     my($op, $cx, $name, $prec, $flags) = (@_, 0);
1347     my $kid = $op->first;
1348     $kid = $self->deparse($kid, $prec);
1349     return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid",
1350                                $cx, $prec);
1351 }
1352
1353 sub pp_preinc { pfixop(@_, "++", 23) }
1354 sub pp_predec { pfixop(@_, "--", 23) }
1355 sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1356 sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1357 sub pp_i_preinc { pfixop(@_, "++", 23) }
1358 sub pp_i_predec { pfixop(@_, "--", 23) }
1359 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
1360 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
1361 sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
1362
1363 sub pp_negate { maybe_targmy(@_, \&real_negate) }
1364 sub real_negate {
1365     my $self = shift;
1366     my($op, $cx) = @_;
1367     if ($op->first->name =~ /^(i_)?negate$/) {
1368         # avoid --$x
1369         $self->pfixop($op, $cx, "-", 21.5);
1370     } else {
1371         $self->pfixop($op, $cx, "-", 21);       
1372     }
1373 }
1374 sub pp_i_negate { pp_negate(@_) }
1375
1376 sub pp_not {
1377     my $self = shift;
1378     my($op, $cx) = @_;
1379     if ($cx <= 4) {
1380         $self->pfixop($op, $cx, "not ", 4);
1381     } else {
1382         $self->pfixop($op, $cx, "!", 21);       
1383     }
1384 }
1385
1386 sub unop {
1387     my $self = shift;
1388     my($op, $cx, $name) = @_;
1389     my $kid;
1390     if ($op->flags & OPf_KIDS) {
1391         $kid = $op->first;
1392         if (defined prototype("CORE::$name") 
1393            && prototype("CORE::$name") =~ /^;?\*/
1394            && $kid->name eq "rv2gv") {
1395             $kid = $kid->first;
1396         }
1397
1398         return $self->maybe_parens_unop($name, $kid, $cx);
1399     } else {
1400         return $name .  ($op->flags & OPf_SPECIAL ? "()" : "");       
1401     }
1402 }
1403
1404 sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
1405 sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
1406 sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
1407 sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
1408 sub pp_defined { unop(@_, "defined") }
1409 sub pp_undef { unop(@_, "undef") }
1410 sub pp_study { unop(@_, "study") }
1411 sub pp_ref { unop(@_, "ref") }
1412 sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
1413
1414 sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
1415 sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
1416 sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
1417 sub pp_srand { unop(@_, "srand") }
1418 sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
1419 sub pp_log { maybe_targmy(@_, \&unop, "log") }
1420 sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
1421 sub pp_int { maybe_targmy(@_, \&unop, "int") }
1422 sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
1423 sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
1424 sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
1425
1426 sub pp_length { maybe_targmy(@_, \&unop, "length") }
1427 sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
1428 sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
1429
1430 sub pp_each { unop(@_, "each") }
1431 sub pp_values { unop(@_, "values") }
1432 sub pp_keys { unop(@_, "keys") }
1433 sub pp_pop { unop(@_, "pop") }
1434 sub pp_shift { unop(@_, "shift") }
1435
1436 sub pp_caller { unop(@_, "caller") }
1437 sub pp_reset { unop(@_, "reset") }
1438 sub pp_exit { unop(@_, "exit") }
1439 sub pp_prototype { unop(@_, "prototype") }
1440
1441 sub pp_close { unop(@_, "close") }
1442 sub pp_fileno { unop(@_, "fileno") }
1443 sub pp_umask { unop(@_, "umask") }
1444 sub pp_untie { unop(@_, "untie") }
1445 sub pp_tied { unop(@_, "tied") }
1446 sub pp_dbmclose { unop(@_, "dbmclose") }
1447 sub pp_getc { unop(@_, "getc") }
1448 sub pp_eof { unop(@_, "eof") }
1449 sub pp_tell { unop(@_, "tell") }
1450 sub pp_getsockname { unop(@_, "getsockname") }
1451 sub pp_getpeername { unop(@_, "getpeername") }
1452
1453 sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
1454 sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
1455 sub pp_readlink { unop(@_, "readlink") }
1456 sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
1457 sub pp_readdir { unop(@_, "readdir") }
1458 sub pp_telldir { unop(@_, "telldir") }
1459 sub pp_rewinddir { unop(@_, "rewinddir") }
1460 sub pp_closedir { unop(@_, "closedir") }
1461 sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
1462 sub pp_localtime { unop(@_, "localtime") }
1463 sub pp_gmtime { unop(@_, "gmtime") }
1464 sub pp_alarm { unop(@_, "alarm") }
1465 sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
1466
1467 sub pp_dofile { unop(@_, "do") }
1468 sub pp_entereval { unop(@_, "eval") }
1469
1470 sub pp_ghbyname { unop(@_, "gethostbyname") }
1471 sub pp_gnbyname { unop(@_, "getnetbyname") }
1472 sub pp_gpbyname { unop(@_, "getprotobyname") }
1473 sub pp_shostent { unop(@_, "sethostent") }
1474 sub pp_snetent { unop(@_, "setnetent") }
1475 sub pp_sprotoent { unop(@_, "setprotoent") }
1476 sub pp_sservent { unop(@_, "setservent") }
1477 sub pp_gpwnam { unop(@_, "getpwnam") }
1478 sub pp_gpwuid { unop(@_, "getpwuid") }
1479 sub pp_ggrnam { unop(@_, "getgrnam") }
1480 sub pp_ggrgid { unop(@_, "getgrgid") }
1481
1482 sub pp_lock { unop(@_, "lock") }
1483
1484 sub pp_exists {
1485     my $self = shift;
1486     my($op, $cx) = @_;
1487     my $arg;
1488     if ($op->private & OPpEXISTS_SUB) {
1489         # Checking for the existence of a subroutine
1490         return $self->maybe_parens_func("exists",
1491                                 $self->pp_rv2cv($op->first, 16), $cx, 16);
1492     }
1493     if ($op->flags & OPf_SPECIAL) {
1494         # Array element, not hash element
1495         return $self->maybe_parens_func("exists",
1496                                 $self->pp_aelem($op->first, 16), $cx, 16);
1497     }
1498     return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16),
1499                                     $cx, 16);
1500 }
1501
1502 sub pp_delete {
1503     my $self = shift;
1504     my($op, $cx) = @_;
1505     my $arg;
1506     if ($op->private & OPpSLICE) {
1507         if ($op->flags & OPf_SPECIAL) {
1508             # Deleting from an array, not a hash
1509             return $self->maybe_parens_func("delete",
1510                                         $self->pp_aslice($op->first, 16),
1511                                         $cx, 16);
1512         }
1513         return $self->maybe_parens_func("delete",
1514                                         $self->pp_hslice($op->first, 16),
1515                                         $cx, 16);
1516     } else {
1517         if ($op->flags & OPf_SPECIAL) {
1518             # Deleting from an array, not a hash
1519             return $self->maybe_parens_func("delete",
1520                                         $self->pp_aelem($op->first, 16),
1521                                         $cx, 16);
1522         }
1523         return $self->maybe_parens_func("delete",
1524                                         $self->pp_helem($op->first, 16),
1525                                         $cx, 16);
1526     }
1527 }
1528
1529 sub pp_require {
1530     my $self = shift;
1531     my($op, $cx) = @_;
1532     if (class($op) eq "UNOP" and $op->first->name eq "const"
1533         and $op->first->private & OPpCONST_BARE)
1534     {
1535         my $name = $self->const_sv($op->first)->PV;
1536         $name =~ s[/][::]g;
1537         $name =~ s/\.pm//g;
1538         return "require $name";
1539     } else {    
1540         $self->unop($op, $cx, "require");
1541     }
1542 }
1543
1544 sub pp_scalar { 
1545     my $self = shift;
1546     my($op, $cv) = @_;
1547     my $kid = $op->first;
1548     if (not null $kid->sibling) {
1549         # XXX Was a here-doc
1550         return $self->dquote($op);
1551     }
1552     $self->unop(@_, "scalar");
1553 }
1554
1555
1556 sub padval {
1557     my $self = shift;
1558     my $targ = shift;
1559     return (($self->{'curcv'}->PADLIST->ARRAY)[1]->ARRAY)[$targ];
1560 }
1561
1562 sub pp_refgen {
1563     my $self = shift;   
1564     my($op, $cx) = @_;
1565     my $kid = $op->first;
1566     if ($kid->name eq "null") {
1567         $kid = $kid->first;
1568         if ($kid->name eq "anonlist" || $kid->name eq "anonhash") {
1569             my($pre, $post) = @{{"anonlist" => ["[","]"],
1570                                  "anonhash" => ["{","}"]}->{$kid->name}};
1571             my($expr, @exprs);
1572             $kid = $kid->first->sibling; # skip pushmark
1573             for (; !null($kid); $kid = $kid->sibling) {
1574                 $expr = $self->deparse($kid, 6);
1575                 push @exprs, $expr;
1576             }
1577             return $pre . join(", ", @exprs) . $post;
1578         } elsif (!null($kid->sibling) and 
1579                  $kid->sibling->name eq "anoncode") {
1580             return "sub " .
1581                 $self->deparse_sub($self->padval($kid->sibling->targ));
1582         } elsif ($kid->name eq "pushmark") {
1583             my $sib_name = $kid->sibling->name;
1584             if ($sib_name =~ /^(pad|rv2)[ah]v$/
1585                 and not $kid->sibling->flags & OPf_REF)
1586             {
1587                 # The @a in \(@a) isn't in ref context, but only when the
1588                 # parens are there.
1589                 return "\\(" . $self->deparse($kid->sibling, 1) . ")";
1590             } elsif ($sib_name eq 'entersub') {
1591                 my $text = $self->deparse($kid->sibling, 1);
1592                 # Always show parens for \(&func()), but only with -p otherwise
1593                 $text = "($text)" if $self->{'parens'}
1594                                  or $kid->sibling->private & OPpENTERSUB_AMPER;
1595                 return "\\$text";
1596             }
1597         }
1598     }
1599     $self->pfixop($op, $cx, "\\", 20);
1600 }
1601
1602 sub pp_srefgen { pp_refgen(@_) }
1603
1604 sub pp_readline {
1605     my $self = shift;
1606     my($op, $cx) = @_;
1607     my $kid = $op->first;
1608     $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
1609     return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
1610     return $self->unop($op, $cx, "readline");
1611 }
1612
1613 sub pp_rcatline {
1614     my $self = shift;
1615     my($op) = @_;
1616     return "<" . $self->gv_name($op->gv) . ">";
1617 }
1618
1619 # Unary operators that can occur as pseudo-listops inside double quotes
1620 sub dq_unop {
1621     my $self = shift;
1622     my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
1623     my $kid;
1624     if ($op->flags & OPf_KIDS) {
1625        $kid = $op->first;
1626        # If there's more than one kid, the first is an ex-pushmark.
1627        $kid = $kid->sibling if not null $kid->sibling;
1628        return $self->maybe_parens_unop($name, $kid, $cx);
1629     } else {
1630        return $name .  ($op->flags & OPf_SPECIAL ? "()" : "");       
1631     }
1632 }
1633
1634 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
1635 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
1636 sub pp_uc { dq_unop(@_, "uc") }
1637 sub pp_lc { dq_unop(@_, "lc") }
1638 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
1639
1640 sub loopex {
1641     my $self = shift;
1642     my ($op, $cx, $name) = @_;
1643     if (class($op) eq "PVOP") {
1644         return "$name " . $op->pv;
1645     } elsif (class($op) eq "OP") {
1646         return $name;
1647     } elsif (class($op) eq "UNOP") {
1648         # Note -- loop exits are actually exempt from the
1649         # looks-like-a-func rule, but a few extra parens won't hurt
1650         return $self->maybe_parens_unop($name, $op->first, $cx);
1651     }
1652 }
1653
1654 sub pp_last { loopex(@_, "last") }
1655 sub pp_next { loopex(@_, "next") }
1656 sub pp_redo { loopex(@_, "redo") }
1657 sub pp_goto { loopex(@_, "goto") }
1658 sub pp_dump { loopex(@_, "dump") }
1659
1660 sub ftst {
1661     my $self = shift;
1662     my($op, $cx, $name) = @_;
1663     if (class($op) eq "UNOP") {
1664         # Genuine `-X' filetests are exempt from the LLAFR, but not
1665         # l?stat(); for the sake of clarity, give'em all parens
1666         return $self->maybe_parens_unop($name, $op->first, $cx);
1667     } elsif (class($op) eq "SVOP") {
1668         return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
1669     } else { # I don't think baseop filetests ever survive ck_ftst, but...
1670         return $name;
1671     }
1672 }
1673
1674 sub pp_lstat { ftst(@_, "lstat") }
1675 sub pp_stat { ftst(@_, "stat") }
1676 sub pp_ftrread { ftst(@_, "-R") }
1677 sub pp_ftrwrite { ftst(@_, "-W") }
1678 sub pp_ftrexec { ftst(@_, "-X") }
1679 sub pp_fteread { ftst(@_, "-r") }
1680 sub pp_ftewrite { ftst(@_, "-w") }
1681 sub pp_fteexec { ftst(@_, "-x") }
1682 sub pp_ftis { ftst(@_, "-e") }
1683 sub pp_fteowned { ftst(@_, "-O") }
1684 sub pp_ftrowned { ftst(@_, "-o") }
1685 sub pp_ftzero { ftst(@_, "-z") }
1686 sub pp_ftsize { ftst(@_, "-s") }
1687 sub pp_ftmtime { ftst(@_, "-M") }
1688 sub pp_ftatime { ftst(@_, "-A") }
1689 sub pp_ftctime { ftst(@_, "-C") }
1690 sub pp_ftsock { ftst(@_, "-S") }
1691 sub pp_ftchr { ftst(@_, "-c") }
1692 sub pp_ftblk { ftst(@_, "-b") }
1693 sub pp_ftfile { ftst(@_, "-f") }
1694 sub pp_ftdir { ftst(@_, "-d") }
1695 sub pp_ftpipe { ftst(@_, "-p") }
1696 sub pp_ftlink { ftst(@_, "-l") }
1697 sub pp_ftsuid { ftst(@_, "-u") }
1698 sub pp_ftsgid { ftst(@_, "-g") }
1699 sub pp_ftsvtx { ftst(@_, "-k") }
1700 sub pp_fttty { ftst(@_, "-t") }
1701 sub pp_fttext { ftst(@_, "-T") }
1702 sub pp_ftbinary { ftst(@_, "-B") }
1703
1704 sub SWAP_CHILDREN () { 1 }
1705 sub ASSIGN () { 2 } # has OP= variant
1706 sub LIST_CONTEXT () { 4 } # Assignment is in list context
1707
1708 my(%left, %right);
1709
1710 sub assoc_class {
1711     my $op = shift;
1712     my $name = $op->name;
1713     if ($name eq "concat" and $op->first->name eq "concat") {
1714         # avoid spurious `=' -- see comment in pp_concat
1715         return "concat";
1716     }
1717     if ($name eq "null" and class($op) eq "UNOP"
1718         and $op->first->name =~ /^(and|x?or)$/
1719         and null $op->first->sibling)
1720     {
1721         # Like all conditional constructs, OP_ANDs and OP_ORs are topped
1722         # with a null that's used as the common end point of the two
1723         # flows of control. For precedence purposes, ignore it.
1724         # (COND_EXPRs have these too, but we don't bother with
1725         # their associativity).
1726         return assoc_class($op->first);
1727     }
1728     return $name . ($op->flags & OPf_STACKED ? "=" : "");
1729 }
1730
1731 # Left associative operators, like `+', for which
1732 # $a + $b + $c is equivalent to ($a + $b) + $c
1733
1734 BEGIN {
1735     %left = ('multiply' => 19, 'i_multiply' => 19,
1736              'divide' => 19, 'i_divide' => 19,
1737              'modulo' => 19, 'i_modulo' => 19,
1738              'repeat' => 19,
1739              'add' => 18, 'i_add' => 18,
1740              'subtract' => 18, 'i_subtract' => 18,
1741              'concat' => 18,
1742              'left_shift' => 17, 'right_shift' => 17,
1743              'bit_and' => 13,
1744              'bit_or' => 12, 'bit_xor' => 12,
1745              'and' => 3,
1746              'or' => 2, 'xor' => 2,
1747             );
1748 }
1749
1750 sub deparse_binop_left {
1751     my $self = shift;
1752     my($op, $left, $prec) = @_;
1753     if ($left{assoc_class($op)} && $left{assoc_class($left)}
1754         and $left{assoc_class($op)} == $left{assoc_class($left)})
1755     {
1756         return $self->deparse($left, $prec - .00001);
1757     } else {
1758         return $self->deparse($left, $prec);    
1759     }
1760 }
1761
1762 # Right associative operators, like `=', for which
1763 # $a = $b = $c is equivalent to $a = ($b = $c)
1764
1765 BEGIN {
1766     %right = ('pow' => 22,
1767               'sassign=' => 7, 'aassign=' => 7,
1768               'multiply=' => 7, 'i_multiply=' => 7,
1769               'divide=' => 7, 'i_divide=' => 7,
1770               'modulo=' => 7, 'i_modulo=' => 7,
1771               'repeat=' => 7,
1772               'add=' => 7, 'i_add=' => 7,
1773               'subtract=' => 7, 'i_subtract=' => 7,
1774               'concat=' => 7,
1775               'left_shift=' => 7, 'right_shift=' => 7,
1776               'bit_and=' => 7,
1777               'bit_or=' => 7, 'bit_xor=' => 7,
1778               'andassign' => 7,
1779               'orassign' => 7,
1780              );
1781 }
1782
1783 sub deparse_binop_right {
1784     my $self = shift;
1785     my($op, $right, $prec) = @_;
1786     if ($right{assoc_class($op)} && $right{assoc_class($right)}
1787         and $right{assoc_class($op)} == $right{assoc_class($right)})
1788     {
1789         return $self->deparse($right, $prec - .00001);
1790     } else {
1791         return $self->deparse($right, $prec);   
1792     }
1793 }
1794
1795 sub binop {
1796     my $self = shift;
1797     my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
1798     my $left = $op->first;
1799     my $right = $op->last;
1800     my $eq = "";
1801     if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
1802         $eq = "=";
1803         $prec = 7;
1804     }
1805     if ($flags & SWAP_CHILDREN) {
1806         ($left, $right) = ($right, $left);
1807     }
1808     $left = $self->deparse_binop_left($op, $left, $prec);
1809     $left = "($left)" if $flags & LIST_CONTEXT
1810                 && $left !~ /^(my|our|local|)[\@\(]/;
1811     $right = $self->deparse_binop_right($op, $right, $prec);
1812     return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
1813 }
1814
1815 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
1816 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
1817 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18,  ASSIGN) }
1818 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
1819 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
1820 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
1821 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
1822 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
1823 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
1824 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
1825 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
1826
1827 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
1828 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
1829 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
1830 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
1831 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
1832
1833 sub pp_eq { binop(@_, "==", 14) }
1834 sub pp_ne { binop(@_, "!=", 14) }
1835 sub pp_lt { binop(@_, "<", 15) }
1836 sub pp_gt { binop(@_, ">", 15) }
1837 sub pp_ge { binop(@_, ">=", 15) }
1838 sub pp_le { binop(@_, "<=", 15) }
1839 sub pp_ncmp { binop(@_, "<=>", 14) }
1840 sub pp_i_eq { binop(@_, "==", 14) }
1841 sub pp_i_ne { binop(@_, "!=", 14) }
1842 sub pp_i_lt { binop(@_, "<", 15) }
1843 sub pp_i_gt { binop(@_, ">", 15) }
1844 sub pp_i_ge { binop(@_, ">=", 15) }
1845 sub pp_i_le { binop(@_, "<=", 15) }
1846 sub pp_i_ncmp { binop(@_, "<=>", 14) }
1847
1848 sub pp_seq { binop(@_, "eq", 14) }
1849 sub pp_sne { binop(@_, "ne", 14) }
1850 sub pp_slt { binop(@_, "lt", 15) }
1851 sub pp_sgt { binop(@_, "gt", 15) }
1852 sub pp_sge { binop(@_, "ge", 15) }
1853 sub pp_sle { binop(@_, "le", 15) }
1854 sub pp_scmp { binop(@_, "cmp", 14) }
1855
1856 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
1857 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
1858
1859 # `.' is special because concats-of-concats are optimized to save copying
1860 # by making all but the first concat stacked. The effect is as if the
1861 # programmer had written `($a . $b) .= $c', except legal.
1862 sub pp_concat { maybe_targmy(@_, \&real_concat) }
1863 sub real_concat {
1864     my $self = shift;
1865     my($op, $cx) = @_;
1866     my $left = $op->first;
1867     my $right = $op->last;
1868     my $eq = "";
1869     my $prec = 18;
1870     if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
1871         $eq = "=";
1872         $prec = 7;
1873     }
1874     $left = $self->deparse_binop_left($op, $left, $prec);
1875     $right = $self->deparse_binop_right($op, $right, $prec);
1876     return $self->maybe_parens("$left .$eq $right", $cx, $prec);
1877 }
1878
1879 # `x' is weird when the left arg is a list
1880 sub pp_repeat {
1881     my $self = shift;
1882     my($op, $cx) = @_;
1883     my $left = $op->first;
1884     my $right = $op->last;
1885     my $eq = "";
1886     my $prec = 19;
1887     if ($op->flags & OPf_STACKED) {
1888         $eq = "=";
1889         $prec = 7;
1890     }
1891     if (null($right)) { # list repeat; count is inside left-side ex-list
1892         my $kid = $left->first->sibling; # skip pushmark
1893         my @exprs;
1894         for (; !null($kid->sibling); $kid = $kid->sibling) {
1895             push @exprs, $self->deparse($kid, 6);
1896         }
1897         $right = $kid;
1898         $left = "(" . join(", ", @exprs). ")";
1899     } else {
1900         $left = $self->deparse_binop_left($op, $left, $prec);
1901     }
1902     $right = $self->deparse_binop_right($op, $right, $prec);
1903     return $self->maybe_parens("$left x$eq $right", $cx, $prec);
1904 }
1905
1906 sub range {
1907     my $self = shift;
1908     my ($op, $cx, $type) = @_;
1909     my $left = $op->first;
1910     my $right = $left->sibling;
1911     $left = $self->deparse($left, 9);
1912     $right = $self->deparse($right, 9);
1913     return $self->maybe_parens("$left $type $right", $cx, 9);
1914 }
1915
1916 sub pp_flop {
1917     my $self = shift;
1918     my($op, $cx) = @_;
1919     my $flip = $op->first;
1920     my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
1921     return $self->range($flip->first, $cx, $type);
1922 }
1923
1924 # one-line while/until is handled in pp_leave
1925
1926 sub logop {
1927     my $self = shift;
1928     my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
1929     my $left = $op->first;
1930     my $right = $op->first->sibling;
1931     if ($cx == 0 and is_scope($right) and $blockname
1932         and $self->{'expand'} < 7)
1933     { # if ($a) {$b}
1934         $left = $self->deparse($left, 1);
1935         $right = $self->deparse($right, 0);
1936         return "$blockname ($left) {\n\t$right\n\b}\cK";
1937     } elsif ($cx == 0 and $blockname and not $self->{'parens'}
1938              and $self->{'expand'} < 7) { # $b if $a
1939         $right = $self->deparse($right, 1);
1940         $left = $self->deparse($left, 1);
1941         return "$right $blockname $left";
1942     } elsif ($cx > $lowprec and $highop) { # $a && $b
1943         $left = $self->deparse_binop_left($op, $left, $highprec);
1944         $right = $self->deparse_binop_right($op, $right, $highprec);
1945         return $self->maybe_parens("$left $highop $right", $cx, $highprec);
1946     } else { # $a and $b
1947         $left = $self->deparse_binop_left($op, $left, $lowprec);
1948         $right = $self->deparse_binop_right($op, $right, $lowprec);
1949         return $self->maybe_parens("$left $lowop $right", $cx, $lowprec); 
1950     }
1951 }
1952
1953 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
1954 sub pp_or  { logop(@_, "or",  2, "||", 10, "unless") }
1955 sub pp_dor { logop(@_, "err", 2, "//", 10, "") }
1956
1957 # xor is syntactically a logop, but it's really a binop (contrary to
1958 # old versions of opcode.pl). Syntax is what matters here.
1959 sub pp_xor { logop(@_, "xor", 2, "",   0,  "") }
1960
1961 sub logassignop {
1962     my $self = shift;
1963     my ($op, $cx, $opname) = @_;
1964     my $left = $op->first;
1965     my $right = $op->first->sibling->first; # skip sassign
1966     $left = $self->deparse($left, 7);
1967     $right = $self->deparse($right, 7);
1968     return $self->maybe_parens("$left $opname $right", $cx, 7);
1969 }
1970
1971 sub pp_andassign { logassignop(@_, "&&=") }
1972 sub pp_orassign  { logassignop(@_, "||=") }
1973 sub pp_dorassign { logassignop(@_, "//=") }
1974
1975 sub listop {
1976     my $self = shift;
1977     my($op, $cx, $name) = @_;
1978     my(@exprs);
1979     my $parens = ($cx >= 5) || $self->{'parens'};
1980     my $kid = $op->first->sibling;
1981     return $name if null $kid;
1982     my $first;
1983     $name = "socketpair" if $name eq "sockpair";
1984     if (defined prototype("CORE::$name")
1985         && prototype("CORE::$name") =~ /^;?\*/
1986         && $kid->name eq "rv2gv") {
1987         $first = $self->deparse($kid->first, 6);
1988     }
1989     else {
1990         $first = $self->deparse($kid, 6);
1991     }
1992     if ($name eq "chmod" && $first =~ /^\d+$/) {
1993         $first = sprintf("%#o", $first);
1994     }
1995     $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
1996     push @exprs, $first;
1997     $kid = $kid->sibling;
1998     for (; !null($kid); $kid = $kid->sibling) {
1999         push @exprs, $self->deparse($kid, 6);
2000     }
2001     if ($parens) {
2002         return "$name(" . join(", ", @exprs) . ")";
2003     } else {
2004         return "$name " . join(", ", @exprs);
2005     }
2006 }
2007
2008 sub pp_bless { listop(@_, "bless") }
2009 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
2010 sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
2011 sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
2012 sub pp_index { maybe_targmy(@_, \&listop, "index") }
2013 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
2014 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
2015 sub pp_formline { listop(@_, "formline") } # see also deparse_format
2016 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
2017 sub pp_unpack { listop(@_, "unpack") }
2018 sub pp_pack { listop(@_, "pack") }
2019 sub pp_join { maybe_targmy(@_, \&listop, "join") }
2020 sub pp_splice { listop(@_, "splice") }
2021 sub pp_push { maybe_targmy(@_, \&listop, "push") }
2022 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
2023 sub pp_reverse { listop(@_, "reverse") }
2024 sub pp_warn { listop(@_, "warn") }
2025 sub pp_die { listop(@_, "die") }
2026 # Actually, return is exempt from the LLAFR (see examples in this very
2027 # module!), but for consistency's sake, ignore that fact
2028 sub pp_return { listop(@_, "return") }
2029 sub pp_open { listop(@_, "open") }
2030 sub pp_pipe_op { listop(@_, "pipe") }
2031 sub pp_tie { listop(@_, "tie") }
2032 sub pp_binmode { listop(@_, "binmode") }
2033 sub pp_dbmopen { listop(@_, "dbmopen") }
2034 sub pp_sselect { listop(@_, "select") }
2035 sub pp_select { listop(@_, "select") }
2036 sub pp_read { listop(@_, "read") }
2037 sub pp_sysopen { listop(@_, "sysopen") }
2038 sub pp_sysseek { listop(@_, "sysseek") }
2039 sub pp_sysread { listop(@_, "sysread") }
2040 sub pp_syswrite { listop(@_, "syswrite") }
2041 sub pp_send { listop(@_, "send") }
2042 sub pp_recv { listop(@_, "recv") }
2043 sub pp_seek { listop(@_, "seek") }
2044 sub pp_fcntl { listop(@_, "fcntl") }
2045 sub pp_ioctl { listop(@_, "ioctl") }
2046 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
2047 sub pp_socket { listop(@_, "socket") }
2048 sub pp_sockpair { listop(@_, "sockpair") }
2049 sub pp_bind { listop(@_, "bind") }
2050 sub pp_connect { listop(@_, "connect") }
2051 sub pp_listen { listop(@_, "listen") }
2052 sub pp_accept { listop(@_, "accept") }
2053 sub pp_shutdown { listop(@_, "shutdown") }
2054 sub pp_gsockopt { listop(@_, "getsockopt") }
2055 sub pp_ssockopt { listop(@_, "setsockopt") }
2056 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
2057 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
2058 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
2059 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
2060 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
2061 sub pp_link { maybe_targmy(@_, \&listop, "link") }
2062 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
2063 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
2064 sub pp_open_dir { listop(@_, "opendir") }
2065 sub pp_seekdir { listop(@_, "seekdir") }
2066 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
2067 sub pp_system { maybe_targmy(@_, \&listop, "system") }
2068 sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
2069 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
2070 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
2071 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
2072 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
2073 sub pp_shmget { listop(@_, "shmget") }
2074 sub pp_shmctl { listop(@_, "shmctl") }
2075 sub pp_shmread { listop(@_, "shmread") }
2076 sub pp_shmwrite { listop(@_, "shmwrite") }
2077 sub pp_msgget { listop(@_, "msgget") }
2078 sub pp_msgctl { listop(@_, "msgctl") }
2079 sub pp_msgsnd { listop(@_, "msgsnd") }
2080 sub pp_msgrcv { listop(@_, "msgrcv") }
2081 sub pp_semget { listop(@_, "semget") }
2082 sub pp_semctl { listop(@_, "semctl") }
2083 sub pp_semop { listop(@_, "semop") }
2084 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
2085 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
2086 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
2087 sub pp_gsbyname { listop(@_, "getservbyname") }
2088 sub pp_gsbyport { listop(@_, "getservbyport") }
2089 sub pp_syscall { listop(@_, "syscall") }
2090
2091 sub pp_glob {
2092     my $self = shift;
2093     my($op, $cx) = @_;
2094     my $text = $self->dq($op->first->sibling);  # skip pushmark
2095     if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
2096         or $text =~ /[<>]/) { 
2097         return 'glob(' . single_delim('qq', '"', $text) . ')';
2098     } else {
2099         return '<' . $text . '>';
2100     }
2101 }
2102
2103 # Truncate is special because OPf_SPECIAL makes a bareword first arg
2104 # be a filehandle. This could probably be better fixed in the core
2105 # by moving the GV lookup into ck_truc.
2106
2107 sub pp_truncate {
2108     my $self = shift;
2109     my($op, $cx) = @_;
2110     my(@exprs);
2111     my $parens = ($cx >= 5) || $self->{'parens'};
2112     my $kid = $op->first->sibling;
2113     my $fh;
2114     if ($op->flags & OPf_SPECIAL) {
2115         # $kid is an OP_CONST
2116         $fh = $self->const_sv($kid)->PV;
2117     } else {
2118         $fh = $self->deparse($kid, 6);
2119         $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
2120     }
2121     my $len = $self->deparse($kid->sibling, 6);
2122     if ($parens) {
2123         return "truncate($fh, $len)";
2124     } else {
2125         return "truncate $fh, $len";
2126     }
2127 }
2128
2129 sub indirop {
2130     my $self = shift;
2131     my($op, $cx, $name) = @_;
2132     my($expr, @exprs);
2133     my $kid = $op->first->sibling;
2134     my $indir = "";
2135     if ($op->flags & OPf_STACKED) {
2136         $indir = $kid;
2137         $indir = $indir->first; # skip rv2gv
2138         if (is_scope($indir)) {
2139             $indir = "{" . $self->deparse($indir, 0) . "}";
2140         } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
2141             $indir = $self->const_sv($indir)->PV;
2142         } else {
2143             $indir = $self->deparse($indir, 24);
2144         }
2145         $indir = $indir . " ";
2146         $kid = $kid->sibling;
2147     }
2148     if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
2149         $indir = ($op->private & OPpSORT_REVERSE) ? '{$b <=> $a} '
2150                                                   : '{$a <=> $b} ';
2151     }
2152     elsif ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
2153         $indir = '{$b cmp $a} ';
2154     }
2155     for (; !null($kid); $kid = $kid->sibling) {
2156         $expr = $self->deparse($kid, 6);
2157         push @exprs, $expr;
2158     }
2159     return $self->maybe_parens_func($name, $indir . join(", ", @exprs),
2160                                     $cx, 5);
2161 }
2162
2163 sub pp_prtf { indirop(@_, "printf") }
2164 sub pp_print { indirop(@_, "print") }
2165 sub pp_sort { indirop(@_, "sort") }
2166
2167 sub mapop {
2168     my $self = shift;
2169     my($op, $cx, $name) = @_;
2170     my($expr, @exprs);
2171     my $kid = $op->first; # this is the (map|grep)start
2172     $kid = $kid->first->sibling; # skip a pushmark
2173     my $code = $kid->first; # skip a null
2174     if (is_scope $code) {
2175         $code = "{" . $self->deparse($code, 0) . "} ";
2176     } else {
2177         $code = $self->deparse($code, 24) . ", ";
2178     }
2179     $kid = $kid->sibling;
2180     for (; !null($kid); $kid = $kid->sibling) {
2181         $expr = $self->deparse($kid, 6);
2182         push @exprs, $expr if defined $expr;
2183     }
2184     return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
2185 }
2186
2187 sub pp_mapwhile { mapop(@_, "map") }   
2188 sub pp_grepwhile { mapop(@_, "grep") }   
2189
2190 sub pp_list {
2191     my $self = shift;
2192     my($op, $cx) = @_;
2193     my($expr, @exprs);
2194     my $kid = $op->first->sibling; # skip pushmark
2195     my $lop;
2196     my $local = "either"; # could be local(...), my(...) or our(...)
2197     for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
2198         # This assumes that no other private flags equal 128, and that
2199         # OPs that store things other than flags in their op_private,
2200         # like OP_AELEMFAST, won't be immediate children of a list.
2201         #
2202         # OP_ENTERSUB can break this logic, so check for it.
2203         # I suspect that open and exit can too.
2204
2205         if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
2206                 or $lop->name eq "undef")
2207             or $lop->name eq "entersub"
2208             or $lop->name eq "exit"
2209             or $lop->name eq "open")
2210         {
2211             $local = ""; # or not
2212             last;
2213         }
2214         if ($lop->name =~ /^pad[ash]v$/) { # my()
2215             ($local = "", last) if $local eq "local" || $local eq "our";
2216             $local = "my";
2217         } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
2218                         && $lop->private & OPpOUR_INTRO
2219                 or $lop->name eq "null" && $lop->first->name eq "gvsv"
2220                         && $lop->first->private & OPpOUR_INTRO) { # our()
2221             ($local = "", last) if $local eq "my" || $local eq "local";
2222             $local = "our";
2223         } elsif ($lop->name ne "undef") { # local()
2224             ($local = "", last) if $local eq "my" || $local eq "our";
2225             $local = "local";
2226         }
2227     }
2228     $local = "" if $local eq "either"; # no point if it's all undefs
2229     return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
2230     for (; !null($kid); $kid = $kid->sibling) {
2231         if ($local) {
2232             if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
2233                 $lop = $kid->first;
2234             } else {
2235                 $lop = $kid;
2236             }
2237             $self->{'avoid_local'}{$$lop}++;
2238             $expr = $self->deparse($kid, 6);
2239             delete $self->{'avoid_local'}{$$lop};
2240         } else {
2241             $expr = $self->deparse($kid, 6);
2242         }
2243         push @exprs, $expr;
2244     }
2245     if ($local) {
2246         return "$local(" . join(", ", @exprs) . ")";
2247     } else {
2248         return $self->maybe_parens( join(", ", @exprs), $cx, 6);        
2249     }
2250 }
2251
2252 sub is_ifelse_cont {
2253     my $op = shift;
2254     return ($op->name eq "null" and class($op) eq "UNOP"
2255             and $op->first->name =~ /^(and|cond_expr)$/
2256             and is_scope($op->first->first->sibling));
2257 }
2258
2259 sub pp_cond_expr {
2260     my $self = shift;
2261     my($op, $cx) = @_;
2262     my $cond = $op->first;
2263     my $true = $cond->sibling;
2264     my $false = $true->sibling;
2265     my $cuddle = $self->{'cuddle'};
2266     unless ($cx == 0 and (is_scope($true) and $true->name ne "null") and
2267             (is_scope($false) || is_ifelse_cont($false))
2268             and $self->{'expand'} < 7) {
2269         $cond = $self->deparse($cond, 8);
2270         $true = $self->deparse($true, 8);
2271         $false = $self->deparse($false, 8);
2272         return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
2273     }
2274
2275     $cond = $self->deparse($cond, 1);
2276     $true = $self->deparse($true, 0);    
2277     my $head = "if ($cond) {\n\t$true\n\b}";
2278     my @elsifs;
2279     while (!null($false) and is_ifelse_cont($false)) {
2280         my $newop = $false->first;
2281         my $newcond = $newop->first;
2282         my $newtrue = $newcond->sibling;
2283         $false = $newtrue->sibling; # last in chain is OP_AND => no else
2284         $newcond = $self->deparse($newcond, 1);
2285         $newtrue = $self->deparse($newtrue, 0);
2286         push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
2287     }
2288     if (!null($false)) {            
2289         $false = $cuddle . "else {\n\t" .
2290           $self->deparse($false, 0) . "\n\b}\cK";
2291     } else {
2292         $false = "\cK";
2293     }
2294     return $head . join($cuddle, "", @elsifs) . $false; 
2295 }
2296
2297 sub loop_common {
2298     my $self = shift;
2299     my($op, $cx, $init) = @_;
2300     my $enter = $op->first;
2301     my $kid = $enter->sibling;
2302     local(@$self{qw'curstash warnings hints'})
2303                 = @$self{qw'curstash warnings hints'};
2304     my $head = "";
2305     my $bare = 0;
2306     my $body;
2307     my $cond = undef;
2308     if ($kid->name eq "lineseq") { # bare or infinite loop 
2309         if (is_state $kid->last) { # infinite
2310             $head = "while (1) "; # Can't use for(;;) if there's a continue
2311             $cond = "";
2312         } else {
2313             $bare = 1;
2314         }
2315         $body = $kid;
2316     } elsif ($enter->name eq "enteriter") { # foreach
2317         my $ary = $enter->first->sibling; # first was pushmark
2318         my $var = $ary->sibling;
2319         if ($enter->flags & OPf_STACKED
2320             and not null $ary->first->sibling->sibling)
2321         {
2322             $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
2323               $self->deparse($ary->first->sibling->sibling, 9);
2324         } else {
2325             $ary = $self->deparse($ary, 1);
2326         }
2327         if (null $var) {
2328             if ($enter->flags & OPf_SPECIAL) { # thread special var
2329                 $var = $self->pp_threadsv($enter, 1);
2330             } else { # regular my() variable
2331                 $var = $self->pp_padsv($enter, 1);
2332                 if ($self->padname_sv($enter->targ)->IVX ==
2333                     $kid->first->first->sibling->last->cop_seq)
2334                 {
2335                     # If the scope of this variable closes at the last
2336                     # statement of the loop, it must have been
2337                     # declared here.
2338                     $var = "my " . $var;
2339                 }
2340             }
2341         } elsif ($var->name eq "rv2gv") {
2342             $var = $self->pp_rv2sv($var, 1);
2343         } elsif ($var->name eq "gv") {
2344             $var = "\$" . $self->deparse($var, 1);
2345         }
2346         $head = "foreach $var ($ary) ";
2347         $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
2348     } elsif ($kid->name eq "null") { # while/until
2349         $kid = $kid->first;
2350         my $name = {"and" => "while", "or" => "until"}->{$kid->name};
2351         $cond = $self->deparse($kid->first, 1);
2352         $head = "$name ($cond) ";
2353         $body = $kid->first->sibling;
2354     } elsif ($kid->name eq "stub") { # bare and empty
2355         return "{;}"; # {} could be a hashref
2356     }
2357     # If there isn't a continue block, then the next pointer for the loop
2358     # will point to the unstack, which is kid's penultimate child, except
2359     # in a bare loop, when it will point to the leaveloop. When neither of
2360     # these conditions hold, then the third-to-last child in the continue
2361     # block (or the last in a bare loop).
2362     my $cont_start = $enter->nextop;
2363     my $cont;
2364     if ($$cont_start != $$op && ${$cont_start->sibling} != ${$body->last}) {
2365         if ($bare) {
2366             $cont = $body->last;
2367         } else {
2368             $cont = $body->first;
2369             while (!null($cont->sibling->sibling->sibling)) {
2370                 $cont = $cont->sibling;
2371             }
2372         }
2373         my $state = $body->first;
2374         my $cuddle = $self->{'cuddle'};
2375         my @states;
2376         for (; $$state != $$cont; $state = $state->sibling) {
2377             push @states, $state;
2378         }
2379         $body = $self->lineseq(undef, @states);
2380         if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
2381             $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
2382             $cont = "\cK";
2383         } else {
2384             $cont = $cuddle . "continue {\n\t" .
2385               $self->deparse($cont, 0) . "\n\b}\cK";
2386         }
2387     } else {
2388         return "" if !defined $body;
2389         if (length $init) {
2390             $head = "for ($init; $cond;) ";
2391         }
2392         $cont = "\cK";
2393         $body = $self->deparse($body, 0);
2394     }
2395     $body =~ s/;?$/;\n/;
2396
2397     return $head . "{\n\t" . $body . "\b}" . $cont;
2398 }
2399
2400 sub pp_leaveloop { loop_common(@_, "") }
2401
2402 sub for_loop {
2403     my $self = shift;
2404     my($op, $cx) = @_;
2405     my $init = $self->deparse($op, 1);
2406     return $self->loop_common($op->sibling->first->sibling, $cx, $init);
2407 }
2408
2409 sub pp_leavetry {
2410     my $self = shift;
2411     return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
2412 }
2413
2414 BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
2415 BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
2416 BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
2417 BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
2418
2419 sub pp_null {
2420     my $self = shift;
2421     my($op, $cx, $flags) = @_;
2422     if (class($op) eq "OP") {
2423         # old value is lost
2424         return $self->{'ex_const'} if $op->targ == OP_CONST;
2425     } elsif ($op->first->name eq "pushmark") {
2426         return $self->pp_list($op, $cx);
2427     } elsif ($op->first->name eq "enter") {
2428         return $self->pp_leave($op, $cx);
2429     } elsif ($op->targ == OP_STRINGIFY) {
2430         return $self->dquote($op, $cx);
2431     } elsif (!null($op->first->sibling) and
2432              $op->first->sibling->name eq "readline" and
2433              $op->first->sibling->flags & OPf_STACKED) {
2434         return $self->maybe_parens($self->deparse($op->first, 7) . " = "
2435                                    . $self->deparse($op->first->sibling, 7),
2436                                    $cx, 7);
2437     } elsif (!null($op->first->sibling) and
2438              $op->first->sibling->name eq "trans" and
2439              $op->first->sibling->flags & OPf_STACKED) {
2440         return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
2441                                    . $self->deparse($op->first->sibling, 20),
2442                                    $cx, 20);
2443     } elsif ($op->flags & OPf_SPECIAL && $cx == 0 && !$op->targ) {
2444         if ($flags) {
2445             return $self->deparse($op->first, $cx);
2446         }
2447         else {
2448             return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2449         }
2450     } elsif (!null($op->first->sibling) and
2451              $op->first->sibling->name eq "null" and
2452              class($op->first->sibling) eq "UNOP" and
2453              $op->first->sibling->first->flags & OPf_STACKED and
2454              $op->first->sibling->first->name eq "rcatline") {
2455         return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2456                                    . $self->deparse($op->first->sibling, 18),
2457                                    $cx, 18);
2458     } else {
2459         return $self->deparse($op->first, $cx);
2460     }
2461 }
2462
2463 sub padname {
2464     my $self = shift;
2465     my $targ = shift;
2466     return $self->padname_sv($targ)->PVX;
2467 }
2468
2469 sub padany {
2470     my $self = shift;
2471     my $op = shift;
2472     return substr($self->padname($op->targ), 1); # skip $/@/%
2473 }
2474
2475 sub pp_padsv {
2476     my $self = shift;
2477     my($op, $cx) = @_;
2478     return $self->maybe_my($op, $cx, $self->padname($op->targ));
2479 }
2480
2481 sub pp_padav { pp_padsv(@_) }
2482 sub pp_padhv { pp_padsv(@_) }
2483
2484 my @threadsv_names;
2485
2486 BEGIN {
2487     @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
2488                        "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
2489                        "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
2490                        "!", "@");
2491 }
2492
2493 sub pp_threadsv {
2494     my $self = shift;
2495     my($op, $cx) = @_;
2496     return $self->maybe_local($op, $cx, "\$" .  $threadsv_names[$op->targ]);
2497 }    
2498
2499 sub gv_or_padgv {
2500     my $self = shift;
2501     my $op = shift;
2502     if (class($op) eq "PADOP") {
2503         return $self->padval($op->padix);
2504     } else { # class($op) eq "SVOP"
2505         return $op->gv;
2506     }
2507 }
2508
2509 sub pp_gvsv {
2510     my $self = shift;
2511     my($op, $cx) = @_;
2512     my $gv = $self->gv_or_padgv($op);
2513     return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2514                                  $self->gv_name($gv)));
2515 }
2516
2517 sub pp_gv {
2518     my $self = shift;
2519     my($op, $cx) = @_;
2520     my $gv = $self->gv_or_padgv($op);
2521     return $self->gv_name($gv);
2522 }
2523
2524 sub pp_aelemfast {
2525     my $self = shift;
2526     my($op, $cx) = @_;
2527     my $gv = $self->gv_or_padgv($op);
2528     my $name = $self->gv_name($gv);
2529     $name = $self->{'curstash'}."::$name"
2530         if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2531
2532     return "\$" . $name . "[" .
2533                   ($op->private + $self->{'arybase'}) . "]";
2534 }
2535
2536 sub rv2x {
2537     my $self = shift;
2538     my($op, $cx, $type) = @_;
2539
2540     if (class($op) eq 'NULL' || !$op->can("first")) {
2541         carp("Unexpected op in pp_rv2x");
2542         return 'XXX';
2543     }
2544     my $kid = $op->first;
2545     my $str = $self->deparse($kid, 0);
2546     return $self->stash_variable($type, $str) if is_scalar($kid);
2547     return $type ."{$str}";
2548 }
2549
2550 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2551 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2552 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2553
2554 # skip rv2av
2555 sub pp_av2arylen {
2556     my $self = shift;
2557     my($op, $cx) = @_;
2558     if ($op->first->name eq "padav") {
2559         return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2560     } else {
2561         return $self->maybe_local($op, $cx,
2562                                   $self->rv2x($op->first, $cx, '$#'));
2563     }
2564 }
2565
2566 # skip down to the old, ex-rv2cv
2567 sub pp_rv2cv {
2568     my ($self, $op, $cx) = @_;
2569     if (!null($op->first) && $op->first->name eq 'null' &&
2570         $op->first->targ eq OP_LIST)
2571     {
2572         return $self->rv2x($op->first->first->sibling, $cx, "&")
2573     }
2574     else {
2575         return $self->rv2x($op, $cx, "")
2576     }
2577 }
2578
2579 sub pp_rv2av {
2580     my $self = shift;
2581     my($op, $cx) = @_;
2582     my $kid = $op->first;
2583     if ($kid->name eq "const") { # constant list
2584         my $av = $self->const_sv($kid);
2585         return "(" . join(", ", map(const($_), $av->ARRAY)) . ")";
2586     } else {
2587         return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
2588     }
2589  }
2590
2591 sub is_subscriptable {
2592     my $op = shift;
2593     if ($op->name =~ /^[ahg]elem/) {
2594         return 1;
2595     } elsif ($op->name eq "entersub") {
2596         my $kid = $op->first;
2597         return 0 unless null $kid->sibling;
2598         $kid = $kid->first;
2599         $kid = $kid->sibling until null $kid->sibling;
2600         return 0 if is_scope($kid);
2601         $kid = $kid->first;
2602         return 0 if $kid->name eq "gv";
2603         return 0 if is_scalar($kid);
2604         return is_subscriptable($kid);  
2605     } else {
2606         return 0;
2607     }
2608 }
2609
2610 sub elem {
2611     my $self = shift;
2612     my ($op, $cx, $left, $right, $padname) = @_;
2613     my($array, $idx) = ($op->first, $op->first->sibling);
2614     unless ($array->name eq $padname) { # Maybe this has been fixed     
2615         $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
2616     }
2617     if ($array->name eq $padname) {
2618         $array = $self->padany($array);
2619     } elsif (is_scope($array)) { # ${expr}[0]
2620         $array = "{" . $self->deparse($array, 0) . "}";
2621     } elsif ($array->name eq "gv") {
2622         $array = $self->gv_name($self->gv_or_padgv($array));
2623         if ($array !~ /::/) {
2624             my $prefix = ($left eq '[' ? '@' : '%');
2625             $array = $self->{curstash}.'::'.$array
2626                 if $self->lex_in_scope($prefix . $array);
2627         }
2628     } elsif (is_scalar $array) { # $x[0], $$x[0], ...
2629         $array = $self->deparse($array, 24);
2630     } else {
2631         # $x[20][3]{hi} or expr->[20]
2632         my $arrow = is_subscriptable($array) ? "" : "->";
2633         return $self->deparse($array, 24) . $arrow .
2634             $left . $self->deparse($idx, 1) . $right;
2635     }
2636     $idx = $self->deparse($idx, 1);
2637
2638     # Outer parens in an array index will confuse perl
2639     # if we're interpolating in a regular expression, i.e.
2640     # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
2641     #
2642     # If $self->{parens}, then an initial '(' will
2643     # definitely be paired with a final ')'. If
2644     # !$self->{parens}, the misleading parens won't
2645     # have been added in the first place.
2646     #
2647     # [You might think that we could get "(...)...(...)"
2648     # where the initial and final parens do not match
2649     # each other. But we can't, because the above would
2650     # only happen if there's an infix binop between the
2651     # two pairs of parens, and *that* means that the whole
2652     # expression would be parenthesized as well.]
2653     #
2654     $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
2655
2656     # Hash-element braces will autoquote a bareword inside themselves.
2657     # We need to make sure that C<$hash{warn()}> doesn't come out as
2658     # C<$hash{warn}>, which has a quite different meaning. Currently
2659     # B::Deparse will always quote strings, even if the string was a
2660     # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
2661     # for constant strings.) So we can cheat slightly here - if we see
2662     # a bareword, we know that it is supposed to be a function call.
2663     #
2664     $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
2665
2666     return "\$" . $array . $left . $idx . $right;
2667 }
2668
2669 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
2670 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
2671
2672 sub pp_gelem {
2673     my $self = shift;
2674     my($op, $cx) = @_;
2675     my($glob, $part) = ($op->first, $op->last);
2676     $glob = $glob->first; # skip rv2gv
2677     $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
2678     my $scope = is_scope($glob);
2679     $glob = $self->deparse($glob, 0);
2680     $part = $self->deparse($part, 1);
2681     return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
2682 }
2683
2684 sub slice {
2685     my $self = shift;
2686     my ($op, $cx, $left, $right, $regname, $padname) = @_;
2687     my $last;
2688     my(@elems, $kid, $array, $list);
2689     if (class($op) eq "LISTOP") {
2690         $last = $op->last;
2691     } else { # ex-hslice inside delete()
2692         for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
2693         $last = $kid;
2694     }
2695     $array = $last;
2696     $array = $array->first
2697         if $array->name eq $regname or $array->name eq "null";
2698     if (is_scope($array)) {
2699         $array = "{" . $self->deparse($array, 0) . "}";
2700     } elsif ($array->name eq $padname) {
2701         $array = $self->padany($array);
2702     } else {
2703         $array = $self->deparse($array, 24);
2704     }
2705     $kid = $op->first->sibling; # skip pushmark
2706     if ($kid->name eq "list") {
2707         $kid = $kid->first->sibling; # skip list, pushmark
2708         for (; !null $kid; $kid = $kid->sibling) {
2709             push @elems, $self->deparse($kid, 6);
2710         }
2711         $list = join(", ", @elems);
2712     } else {
2713         $list = $self->deparse($kid, 1);
2714     }
2715     return "\@" . $array . $left . $list . $right;
2716 }
2717
2718 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
2719 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
2720
2721 sub pp_lslice {
2722     my $self = shift;
2723     my($op, $cx) = @_;
2724     my $idx = $op->first;
2725     my $list = $op->last;
2726     my(@elems, $kid);
2727     $list = $self->deparse($list, 1);
2728     $idx = $self->deparse($idx, 1);
2729     return "($list)" . "[$idx]";
2730 }
2731
2732 sub want_scalar {
2733     my $op = shift;
2734     return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
2735 }
2736
2737 sub want_list {
2738     my $op = shift;
2739     return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
2740 }
2741
2742 sub method {
2743     my $self = shift;
2744     my($op, $cx) = @_;
2745     my $kid = $op->first->sibling; # skip pushmark
2746     my($meth, $obj, @exprs);
2747     if ($kid->name eq "list" and want_list $kid) {
2748         # When an indirect object isn't a bareword but the args are in
2749         # parens, the parens aren't part of the method syntax (the LLAFR
2750         # doesn't apply), but they make a list with OPf_PARENS set that
2751         # doesn't get flattened by the append_elem that adds the method,
2752         # making a (object, arg1, arg2, ...) list where the object
2753         # usually is. This can be distinguished from 
2754         # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
2755         # object) because in the later the list is in scalar context
2756         # as the left side of -> always is, while in the former
2757         # the list is in list context as method arguments always are.
2758         # (Good thing there aren't method prototypes!)
2759         $meth = $kid->sibling;
2760         $kid = $kid->first->sibling; # skip pushmark
2761         $obj = $kid;
2762         $kid = $kid->sibling;
2763         for (; not null $kid; $kid = $kid->sibling) {
2764             push @exprs, $self->deparse($kid, 6);
2765         }
2766     } else {
2767         $obj = $kid;
2768         $kid = $kid->sibling;
2769         for (; !null ($kid->sibling) && $kid->name ne "method_named";
2770               $kid = $kid->sibling) {
2771             push @exprs, $self->deparse($kid, 6);
2772         }
2773         $meth = $kid;
2774     }
2775     $obj = $self->deparse($obj, 24);
2776     if ($meth->name eq "method_named") {
2777         $meth = $self->const_sv($meth)->PV;
2778     } else {
2779         $meth = $meth->first;
2780         if ($meth->name eq "const") {
2781             # As of 5.005_58, this case is probably obsoleted by the
2782             # method_named case above
2783             $meth = $self->const_sv($meth)->PV; # needs to be bare
2784         } else {
2785             $meth = $self->deparse($meth, 1);
2786         }
2787     }
2788     my $args = join(", ", @exprs);      
2789     $kid = $obj . "->" . $meth;
2790     if (length $args) {
2791         return $kid . "(" . $args . ")"; # parens mandatory
2792     } else {
2793         return $kid;
2794     }
2795 }
2796
2797 # returns "&" if the prototype doesn't match the args,
2798 # or ("", $args_after_prototype_demunging) if it does.
2799 sub check_proto {
2800     my $self = shift;
2801     return "&" if $self->{'noproto'};
2802     my($proto, @args) = @_;
2803     my($arg, $real);
2804     my $doneok = 0;
2805     my @reals;
2806     # An unbackslashed @ or % gobbles up the rest of the args
2807     1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
2808     while ($proto) {
2809         $proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|;)//;
2810         my $chr = $1;
2811         if ($chr eq "") {
2812             return "&" if @args;
2813         } elsif ($chr eq ";") {
2814             $doneok = 1;
2815         } elsif ($chr eq "@" or $chr eq "%") {
2816             push @reals, map($self->deparse($_, 6), @args);
2817             @args = ();
2818         } else {
2819             $arg = shift @args;
2820             last unless $arg;
2821             if ($chr eq "\$") {
2822                 if (want_scalar $arg) {
2823                     push @reals, $self->deparse($arg, 6);
2824                 } else {
2825                     return "&";
2826                 }
2827             } elsif ($chr eq "&") {
2828                 if ($arg->name =~ /^(s?refgen|undef)$/) {
2829                     push @reals, $self->deparse($arg, 6);
2830                 } else {
2831                     return "&";
2832                 }
2833             } elsif ($chr eq "*") {
2834                 if ($arg->name =~ /^s?refgen$/
2835                     and $arg->first->first->name eq "rv2gv")
2836                   {
2837                       $real = $arg->first->first; # skip refgen, null
2838                       if ($real->first->name eq "gv") {
2839                           push @reals, $self->deparse($real, 6);
2840                       } else {
2841                           push @reals, $self->deparse($real->first, 6);
2842                       }
2843                   } else {
2844                       return "&";
2845                   }
2846             } elsif (substr($chr, 0, 1) eq "\\") {
2847                 $chr =~ tr/\\[]//d;
2848                 if ($arg->name =~ /^s?refgen$/ and
2849                     !null($real = $arg->first) and
2850                     ($chr =~ /\$/ && is_scalar($real->first)
2851                      or ($chr =~ /@/
2852                          && class($real->first->sibling) ne 'NULL'
2853                          && $real->first->sibling->name
2854                          =~ /^(rv2|pad)av$/)
2855                      or ($chr =~ /%/
2856                          && class($real->first->sibling) ne 'NULL'
2857                          && $real->first->sibling->name
2858                          =~ /^(rv2|pad)hv$/)
2859                      #or ($chr =~ /&/ # This doesn't work
2860                      #   && $real->first->name eq "rv2cv")
2861                      or ($chr =~ /\*/
2862                          && $real->first->name eq "rv2gv")))
2863                   {
2864                       push @reals, $self->deparse($real, 6);
2865                   } else {
2866                       return "&";
2867                   }
2868             }
2869        }
2870     }
2871     return "&" if $proto and !$doneok; # too few args and no `;'
2872     return "&" if @args;               # too many args
2873     return ("", join ", ", @reals);
2874 }
2875
2876 sub pp_entersub {
2877     my $self = shift;
2878     my($op, $cx) = @_;
2879     return $self->method($op, $cx) unless null $op->first->sibling;
2880     my $prefix = "";
2881     my $amper = "";
2882     my($kid, @exprs);
2883     if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
2884         $prefix = "do ";
2885     } elsif ($op->private & OPpENTERSUB_AMPER) {
2886         $amper = "&";
2887     }
2888     $kid = $op->first;
2889     $kid = $kid->first->sibling; # skip ex-list, pushmark
2890     for (; not null $kid->sibling; $kid = $kid->sibling) {
2891         push @exprs, $kid;
2892     }
2893     my $simple = 0;
2894     my $proto = undef;
2895     if (is_scope($kid)) {
2896         $amper = "&";
2897         $kid = "{" . $self->deparse($kid, 0) . "}";
2898     } elsif ($kid->first->name eq "gv") {
2899         my $gv = $self->gv_or_padgv($kid->first);
2900         if (class($gv->CV) ne "SPECIAL") {
2901             $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
2902         }
2903         $simple = 1; # only calls of named functions can be prototyped
2904         $kid = $self->deparse($kid, 24);
2905     } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
2906         $amper = "&";
2907         $kid = $self->deparse($kid, 24);
2908     } else {
2909         $prefix = "";
2910         my $arrow = is_subscriptable($kid->first) ? "" : "->";
2911         $kid = $self->deparse($kid, 24) . $arrow;
2912     }
2913
2914     # Doesn't matter how many prototypes there are, if
2915     # they haven't happened yet!
2916     my $declared;
2917     {
2918         no strict 'refs';
2919         no warnings 'uninitialized';
2920         $declared = exists $self->{'subs_declared'}{$kid}
2921             || ( 
2922                  defined &{ %{$self->{'curstash'}."::"}->{$kid} }
2923                  && !exists
2924                      $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
2925                  && defined prototype $self->{'curstash'}."::".$kid
2926                );
2927         if (!$declared && defined($proto)) {
2928             # Avoid "too early to check prototype" warning
2929             ($amper, $proto) = ('&');
2930         }
2931     }
2932
2933     my $args;
2934     if ($declared and defined $proto and not $amper) {
2935         ($amper, $args) = $self->check_proto($proto, @exprs);
2936         if ($amper eq "&") {
2937             $args = join(", ", map($self->deparse($_, 6), @exprs));
2938         }
2939     } else {
2940         $args = join(", ", map($self->deparse($_, 6), @exprs));
2941     }
2942     if ($prefix or $amper) {
2943         if ($op->flags & OPf_STACKED) {
2944             return $prefix . $amper . $kid . "(" . $args . ")";
2945         } else {
2946             return $prefix . $amper. $kid;
2947         }
2948     } else {
2949         # glob() invocations can be translated into calls of
2950         # CORE::GLOBAL::glob with a second parameter, a number.
2951         # Reverse this.
2952         if ($kid eq "CORE::GLOBAL::glob") {
2953             $kid = "glob";
2954             $args =~ s/\s*,[^,]+$//;
2955         }
2956
2957         # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
2958         # so it must have been translated from a keyword call. Translate
2959         # it back.
2960         $kid =~ s/^CORE::GLOBAL:://;
2961
2962         if (!$declared) {
2963             return "$kid(" . $args . ")";
2964         } elsif (defined $proto and $proto eq "") {
2965             return $kid;
2966         } elsif (defined $proto and $proto eq "\$" and is_scalar($exprs[0])) {
2967             return $self->maybe_parens_func($kid, $args, $cx, 16);
2968         } elsif (defined($proto) && $proto or $simple) {
2969             return $self->maybe_parens_func($kid, $args, $cx, 5);
2970         } else {
2971             return "$kid(" . $args . ")";
2972         }
2973     }
2974 }
2975
2976 sub pp_enterwrite { unop(@_, "write") }
2977
2978 # escape things that cause interpolation in double quotes,
2979 # but not character escapes
2980 sub uninterp {
2981     my($str) = @_;
2982     $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
2983     return $str;
2984 }
2985
2986 {
2987 my $bal;
2988 BEGIN {
2989     use re "eval";
2990     # Matches any string which is balanced with respect to {braces}
2991     $bal = qr(
2992       (?:
2993         [^\\{}]
2994       | \\\\
2995       | \\[{}]
2996       | \{(??{$bal})\}
2997       )*
2998     )x;
2999 }
3000
3001 # the same, but treat $|, $), $( and $ at the end of the string differently
3002 sub re_uninterp {
3003     my($str) = @_;
3004
3005     $str =~ s/
3006           ( ^|\G                  # $1
3007           | [^\\]
3008           )
3009
3010           (                       # $2
3011             (?:\\\\)*
3012           )
3013
3014           (                       # $3
3015             (\(\?\??\{$bal\}\))   # $4
3016           | [\$\@]
3017             (?!\||\)|\(|$)
3018           | \\[uUlLQE]
3019           )
3020
3021         /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3022
3023     return $str;
3024 }
3025
3026 # This is for regular expressions with the /x modifier
3027 # We have to leave comments unmangled.
3028 sub re_uninterp_extended {
3029     my($str) = @_;
3030
3031     $str =~ s/
3032           ( ^|\G                  # $1
3033           | [^\\]
3034           )
3035
3036           (                       # $2
3037             (?:\\\\)*
3038           )
3039
3040           (                       # $3
3041             ( \(\?\??\{$bal\}\)   # $4  (skip over (?{}) and (??{}) blocks)
3042             | \#[^\n]*            #     (skip over comments)
3043             )
3044           | [\$\@]
3045             (?!\||\)|\(|$|\s)
3046           | \\[uUlLQE]
3047           )
3048
3049         /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3050
3051     return $str;
3052 }
3053 }
3054
3055 my %unctrl = # portable to to EBCDIC
3056     (
3057      "\c@" => '\c@',    # unused
3058      "\cA" => '\cA',
3059      "\cB" => '\cB',
3060      "\cC" => '\cC',
3061      "\cD" => '\cD',
3062      "\cE" => '\cE',
3063      "\cF" => '\cF',
3064      "\cG" => '\cG',
3065      "\cH" => '\cH',
3066      "\cI" => '\cI',
3067      "\cJ" => '\cJ',
3068      "\cK" => '\cK',
3069      "\cL" => '\cL',
3070      "\cM" => '\cM',
3071      "\cN" => '\cN',
3072      "\cO" => '\cO',
3073      "\cP" => '\cP',
3074      "\cQ" => '\cQ',
3075      "\cR" => '\cR',
3076      "\cS" => '\cS',
3077      "\cT" => '\cT',
3078      "\cU" => '\cU',
3079      "\cV" => '\cV',
3080      "\cW" => '\cW',
3081      "\cX" => '\cX',
3082      "\cY" => '\cY',
3083      "\cZ" => '\cZ',
3084      "\c[" => '\c[',    # unused
3085      "\c\\" => '\c\\',  # unused
3086      "\c]" => '\c]',    # unused
3087      "\c_" => '\c_',    # unused
3088     );
3089
3090 # character escapes, but not delimiters that might need to be escaped
3091 sub escape_str { # ASCII, UTF8
3092     my($str) = @_;
3093     $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3094     $str =~ s/\a/\\a/g;
3095 #    $str =~ s/\cH/\\b/g; # \b means something different in a regex 
3096     $str =~ s/\t/\\t/g;
3097     $str =~ s/\n/\\n/g;
3098     $str =~ s/\e/\\e/g;
3099     $str =~ s/\f/\\f/g;
3100     $str =~ s/\r/\\r/g;
3101     $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
3102     $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
3103     return $str;
3104 }
3105
3106 # For regexes with the /x modifier.
3107 # Leave whitespace unmangled.
3108 sub escape_extended_re {
3109     my($str) = @_;
3110     $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3111     $str =~ s/([[:^print:]])/
3112         ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
3113     $str =~ s/\n/\n\f/g;
3114     return $str;
3115 }
3116
3117 # Don't do this for regexen
3118 sub unback {
3119     my($str) = @_;
3120     $str =~ s/\\/\\\\/g;
3121     return $str;
3122 }
3123
3124 # Remove backslashes which precede literal control characters,
3125 # to avoid creating ambiguity when we escape the latter.
3126 sub re_unback {
3127     my($str) = @_;
3128
3129     # the insane complexity here is due to the behaviour of "\c\"
3130     $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
3131     return $str;
3132 }
3133
3134 sub balanced_delim {
3135     my($str) = @_;
3136     my @str = split //, $str;
3137     my($ar, $open, $close, $fail, $c, $cnt);
3138     for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3139         ($open, $close) = @$ar;
3140         $fail = 0; $cnt = 0;
3141         for $c (@str) {
3142             if ($c eq $open) {
3143                 $cnt++;
3144             } elsif ($c eq $close) {
3145                 $cnt--;
3146                 if ($cnt < 0) {
3147                     # qq()() isn't ")("
3148                     $fail = 1;
3149                     last;
3150                 }
3151             }
3152         }
3153         $fail = 1 if $cnt != 0;
3154         return ($open, "$open$str$close") if not $fail;
3155     }
3156     return ("", $str);
3157 }
3158
3159 sub single_delim {
3160     my($q, $default, $str) = @_;
3161     return "$default$str$default" if $default and index($str, $default) == -1;
3162     if ($q ne 'qr') {
3163         (my $succeed, $str) = balanced_delim($str);
3164         return "$q$str" if $succeed;
3165     }
3166     for my $delim ('/', '"', '#') {
3167         return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3168     }
3169     if ($default) {
3170         $str =~ s/$default/\\$default/g;
3171         return "$default$str$default";
3172     } else {
3173         $str =~ s[/][\\/]g;
3174         return "$q/$str/";
3175     }
3176 }
3177
3178 sub const {
3179     my $sv = shift;
3180     if (class($sv) eq "SPECIAL") {
3181         return ('undef', '1', '0')[$$sv-1]; # sv_undef, sv_yes, sv_no
3182     } elsif (class($sv) eq "NULL") {
3183        return 'undef';
3184     } elsif ($sv->FLAGS & SVf_IOK) {
3185         return $sv->int_value;
3186     } elsif ($sv->FLAGS & SVf_NOK) {
3187         # try the default stringification
3188         my $r = "".$sv->NV;
3189         if ($r =~ /e/) {
3190             # If it's in scientific notation, we might have lost information
3191             return sprintf("%.20e", $sv->NV);
3192         }
3193         return $r;
3194     } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3195         return "\\(" . const($sv->RV) . ")"; # constant folded
3196     } elsif ($sv->FLAGS & SVf_POK) {
3197         my $str = $sv->PV;
3198         if ($str =~ /[^ -~]/) { # ASCII for non-printing
3199             return single_delim("qq", '"', uninterp escape_str unback $str);
3200         } else {
3201             return single_delim("q", "'", unback $str);
3202         }
3203     } else {
3204         return "undef";
3205     }
3206 }
3207
3208 sub const_sv {
3209     my $self = shift;
3210     my $op = shift;
3211     my $sv = $op->sv;
3212     # the constant could be in the pad (under useithreads)
3213     $sv = $self->padval($op->targ) unless $$sv;
3214     return $sv;
3215 }
3216
3217 sub pp_const {
3218     my $self = shift;
3219     my($op, $cx) = @_;
3220     if ($op->private & OPpCONST_ARYBASE) {
3221         return '$[';
3222     }
3223 #    if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting 
3224 #       return $self->const_sv($op)->PV;
3225 #    }
3226     my $sv = $self->const_sv($op);
3227 #    return const($sv);
3228     my $c = const $sv; 
3229     return $c =~ /^-\d/ ? $self->maybe_parens($c, $cx, 21) : $c;
3230 }
3231
3232 sub dq {
3233     my $self = shift;
3234     my $op = shift;
3235     my $type = $op->name;
3236     if ($type eq "const") {
3237         return '$[' if $op->private & OPpCONST_ARYBASE;
3238         return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3239     } elsif ($type eq "concat") {
3240         my $first = $self->dq($op->first);
3241         my $last  = $self->dq($op->last);
3242
3243         # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3244         ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3245             $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
3246             || ($last =~ /^[{\[\w_]/ &&
3247                 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3248
3249         return $first . $last;
3250     } elsif ($type eq "uc") {
3251         return '\U' . $self->dq($op->first->sibling) . '\E';
3252     } elsif ($type eq "lc") {
3253         return '\L' . $self->dq($op->first->sibling) . '\E';
3254     } elsif ($type eq "ucfirst") {
3255         return '\u' . $self->dq($op->first->sibling);
3256     } elsif ($type eq "lcfirst") {
3257         return '\l' . $self->dq($op->first->sibling);
3258     } elsif ($type eq "quotemeta") {
3259         return '\Q' . $self->dq($op->first->sibling) . '\E';
3260     } elsif ($type eq "join") {
3261         return $self->deparse($op->last, 26); # was join($", @ary)
3262     } else {
3263         return $self->deparse($op, 26);
3264     }
3265 }
3266
3267 sub pp_backtick {
3268     my $self = shift;
3269     my($op, $cx) = @_;
3270     # skip pushmark
3271     return single_delim("qx", '`', $self->dq($op->first->sibling));
3272 }
3273
3274 sub dquote {
3275     my $self = shift;
3276     my($op, $cx) = @_;
3277     my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3278     return $self->deparse($kid, $cx) if $self->{'unquote'};
3279     $self->maybe_targmy($kid, $cx,
3280                         sub {single_delim("qq", '"', $self->dq($_[1]))});
3281 }
3282
3283 # OP_STRINGIFY is a listop, but it only ever has one arg
3284 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3285
3286 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3287 # note that tr(from)/to/ is OK, but not tr/from/(to)
3288 sub double_delim {
3289     my($from, $to) = @_;
3290     my($succeed, $delim);
3291     if ($from !~ m[/] and $to !~ m[/]) {
3292         return "/$from/$to/";
3293     } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3294         if (($succeed, $to) = balanced_delim($to) and $succeed) {
3295             return "$from$to";
3296         } else {
3297             for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3298                 return "$from$delim$to$delim" if index($to, $delim) == -1;
3299             }
3300             $to =~ s[/][\\/]g;
3301             return "$from/$to/";
3302         }
3303     } else {
3304         for $delim ('/', '"', '#') { # note no '
3305             return "$delim$from$delim$to$delim"
3306                 if index($to . $from, $delim) == -1;
3307         }
3308         $from =~ s[/][\\/]g;
3309         $to =~ s[/][\\/]g;
3310         return "/$from/$to/";   
3311     }
3312 }
3313
3314 # Only used by tr///, so backslashes hyphens
3315 sub pchr { # ASCII
3316     my($n) = @_;
3317     if ($n == ord '\\') {
3318         return '\\\\';
3319     } elsif ($n == ord "-") {
3320         return "\\-";
3321     } elsif ($n >= ord(' ') and $n <= ord('~')) {
3322         return chr($n);
3323     } elsif ($n == ord "\a") {
3324         return '\\a';
3325     } elsif ($n == ord "\b") {
3326         return '\\b';
3327     } elsif ($n == ord "\t") {
3328         return '\\t';
3329     } elsif ($n == ord "\n") {
3330         return '\\n';
3331     } elsif ($n == ord "\e") {
3332         return '\\e';
3333     } elsif ($n == ord "\f") {
3334         return '\\f';
3335     } elsif ($n == ord "\r") {
3336         return '\\r';
3337     } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3338         return '\\c' . chr(ord("@") + $n);
3339     } else {
3340 #       return '\x' . sprintf("%02x", $n);
3341         return '\\' . sprintf("%03o", $n);
3342     }
3343 }
3344
3345 sub collapse {
3346     my(@chars) = @_;
3347     my($str, $c, $tr) = ("");
3348     for ($c = 0; $c < @chars; $c++) {
3349         $tr = $chars[$c];
3350         $str .= pchr($tr);
3351         if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3352             $chars[$c + 2] == $tr + 2)
3353         {
3354             for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3355               {}
3356             $str .= "-";
3357             $str .= pchr($chars[$c]);
3358         }
3359     }
3360     return $str;
3361 }
3362
3363 sub tr_decode_byte {
3364     my($table, $flags) = @_;
3365     my(@table) = unpack("s*", $table);
3366     splice @table, 0x100, 1;   # Number of subsequent elements
3367     my($c, $tr, @from, @to, @delfrom, $delhyphen);
3368     if ($table[ord "-"] != -1 and 
3369         $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3370     {
3371         $tr = $table[ord "-"];
3372         $table[ord "-"] = -1;
3373         if ($tr >= 0) {
3374             @from = ord("-");
3375             @to = $tr;
3376         } else { # -2 ==> delete
3377             $delhyphen = 1;
3378         }
3379     }
3380     for ($c = 0; $c < @table; $c++) {
3381         $tr = $table[$c];
3382         if ($tr >= 0) {
3383             push @from, $c; push @to, $tr;
3384         } elsif ($tr == -2) {
3385             push @delfrom, $c;
3386         }
3387     }
3388     @from = (@from, @delfrom);
3389     if ($flags & OPpTRANS_COMPLEMENT) {
3390         my @newfrom = ();
3391         my %from;
3392         @from{@from} = (1) x @from;
3393         for ($c = 0; $c < 256; $c++) {
3394             push @newfrom, $c unless $from{$c};
3395         }
3396         @from = @newfrom;
3397     }
3398     unless ($flags & OPpTRANS_DELETE || !@to) {
3399         pop @to while $#to and $to[$#to] == $to[$#to -1];
3400     }
3401     my($from, $to);
3402     $from = collapse(@from);
3403     $to = collapse(@to);
3404     $from .= "-" if $delhyphen;
3405     return ($from, $to);
3406 }
3407
3408 sub tr_chr {
3409     my $x = shift;
3410     if ($x == ord "-") {
3411         return "\\-";
3412     } elsif ($x == ord "\\") {
3413         return "\\\\";
3414     } else {
3415         return chr $x;
3416     }
3417 }
3418
3419 # XXX This doesn't yet handle all cases correctly either
3420
3421 sub tr_decode_utf8 {
3422     my($swash_hv, $flags) = @_;
3423     my %swash = $swash_hv->ARRAY;
3424     my $final = undef;
3425     $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
3426     my $none = $swash{"NONE"}->IV;
3427     my $extra = $none + 1;
3428     my(@from, @delfrom, @to);
3429     my $line;
3430     foreach $line (split /\n/, $swash{'LIST'}->PV) {
3431         my($min, $max, $result) = split(/\t/, $line);
3432         $min = hex $min;
3433         if (length $max) {
3434             $max = hex $max;
3435         } else {
3436             $max = $min;
3437         }
3438         $result = hex $result;
3439         if ($result == $extra) {
3440             push @delfrom, [$min, $max];            
3441         } else {
3442             push @from, [$min, $max];
3443             push @to, [$result, $result + $max - $min];
3444         }
3445     }
3446     for my $i (0 .. $#from) {
3447         if ($from[$i][0] == ord '-') {
3448             unshift @from, splice(@from, $i, 1);
3449             unshift @to, splice(@to, $i, 1);
3450             last;
3451         } elsif ($from[$i][1] == ord '-') {
3452             $from[$i][1]--;
3453             $to[$i][1]--;
3454             unshift @from, ord '-';
3455             unshift @to, ord '-';
3456             last;
3457         }
3458     }
3459     for my $i (0 .. $#delfrom) {
3460         if ($delfrom[$i][0] == ord '-') {
3461             push @delfrom, splice(@delfrom, $i, 1);
3462             last;
3463         } elsif ($delfrom[$i][1] == ord '-') {
3464             $delfrom[$i][1]--;
3465             push @delfrom, ord '-';
3466             last;
3467         }
3468     }
3469     if (defined $final and $to[$#to][1] != $final) {
3470         push @to, [$final, $final];
3471     }
3472     push @from, @delfrom;
3473     if ($flags & OPpTRANS_COMPLEMENT) {
3474         my @newfrom;
3475         my $next = 0;
3476         for my $i (0 .. $#from) {
3477             push @newfrom, [$next, $from[$i][0] - 1];
3478             $next = $from[$i][1] + 1;
3479         }
3480         @from = ();
3481         for my $range (@newfrom) {
3482             if ($range->[0] <= $range->[1]) {
3483                 push @from, $range;
3484             }
3485         }
3486     }
3487     my($from, $to, $diff);
3488     for my $chunk (@from) {
3489         $diff = $chunk->[1] - $chunk->[0];
3490         if ($diff > 1) {
3491             $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3492         } elsif ($diff == 1) {
3493             $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3494         } else {
3495             $from .= tr_chr($chunk->[0]);
3496         }
3497     }
3498     for my $chunk (@to) {
3499         $diff = $chunk->[1] - $chunk->[0];
3500         if ($diff > 1) {
3501             $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3502         } elsif ($diff == 1) {
3503             $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3504         } else {
3505             $to .= tr_chr($chunk->[0]);
3506         }
3507     }
3508     #$final = sprintf("%04x", $final) if defined $final;
3509     #$none = sprintf("%04x", $none) if defined $none;
3510     #$extra = sprintf("%04x", $extra) if defined $extra;    
3511     #print STDERR "final: $final\n none: $none\nextra: $extra\n";
3512     #print STDERR $swash{'LIST'}->PV;
3513     return (escape_str($from), escape_str($to));
3514 }
3515
3516 sub pp_trans {
3517     my $self = shift;
3518     my($op, $cx) = @_;
3519     my($from, $to);
3520     if (class($op) eq "PVOP") {
3521         ($from, $to) = tr_decode_byte($op->pv, $op->private);
3522     } else { # class($op) eq "SVOP"
3523         ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
3524     }
3525     my $flags = "";
3526     $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
3527     $flags .= "d" if $op->private & OPpTRANS_DELETE;
3528     $to = "" if $from eq $to and $flags eq "";
3529     $flags .= "s" if $op->private & OPpTRANS_SQUASH;
3530     return "tr" . double_delim($from, $to) . $flags;
3531 }
3532
3533 # Like dq(), but different
3534 sub re_dq {
3535     my $self = shift;
3536     my ($op, $extended) = @_;
3537
3538     my $type = $op->name;
3539     if ($type eq "const") {
3540         return '$[' if $op->private & OPpCONST_ARYBASE;
3541         my $unbacked = re_unback($self->const_sv($op)->as_string);
3542         return re_uninterp_extended(escape_extended_re($unbacked))
3543             if $extended;
3544         return re_uninterp(escape_str($unbacked));
3545     } elsif ($type eq "concat") {
3546         my $first = $self->re_dq($op->first, $extended);
3547         my $last  = $self->re_dq($op->last,  $extended);
3548
3549         # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3550         ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3551             $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
3552             || ($last =~ /^[{\[\w_]/ &&
3553                 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3554
3555         return $first . $last;
3556     } elsif ($type eq "uc") {
3557         return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
3558     } elsif ($type eq "lc") {
3559         return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
3560     } elsif ($type eq "ucfirst") {
3561         return '\u' . $self->re_dq($op->first->sibling, $extended);
3562     } elsif ($type eq "lcfirst") {
3563         return '\l' . $self->re_dq($op->first->sibling, $extended);
3564     } elsif ($type eq "quotemeta") {
3565         return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
3566     } elsif ($type eq "join") {
3567         return $self->deparse($op->last, 26); # was join($", @ary)
3568     } else {
3569         return $self->deparse($op, 26);
3570     }
3571 }
3572
3573 sub pure_string {
3574     my ($self, $op) = @_;
3575     my $type = $op->name;
3576
3577     if ($type eq 'const') {
3578         return 1;
3579     }
3580     elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
3581         return $self->pure_string($op->first->sibling);
3582     }
3583     elsif ($type eq 'join') {
3584         my $join_op = $op->first->sibling;  # Skip pushmark
3585         return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
3586
3587         my $gvop = $join_op->first;
3588         return 0 unless $gvop->name eq 'gvsv';
3589         return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
3590
3591         return 0 unless ${$join_op->sibling} eq ${$op->last};
3592         return 0 unless $op->last->name =~ /^(rv2|pad)av$/;
3593     }
3594     elsif ($type eq 'concat') {
3595         return $self->pure_string($op->first)
3596             && $self->pure_string($op->last);
3597     }
3598     elsif (is_scalar($op) || $type =~ /^[ah]elem(fast)?$/) {
3599         return 1;
3600     }
3601     else {
3602         return 0;
3603     }
3604
3605     return 1;
3606 }
3607
3608 sub regcomp {
3609     my $self = shift;
3610     my($op, $cx, $extended) = @_;
3611     my $kid = $op->first;
3612     $kid = $kid->first if $kid->name eq "regcmaybe";
3613     $kid = $kid->first if $kid->name eq "regcreset";
3614     return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
3615     return ($self->deparse($kid, $cx), 0);
3616 }
3617
3618 sub pp_regcomp {
3619     my ($self, $op, $cx) = @_;
3620     return (($self->regcomp($op, $cx, 0))[0]);
3621 }
3622
3623 # osmic acid -- see osmium tetroxide
3624
3625 my %matchwords;
3626 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
3627     'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic', 
3628     'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi'); 
3629
3630 sub matchop {
3631     my $self = shift;
3632     my($op, $cx, $name, $delim) = @_;
3633     my $kid = $op->first;
3634     my ($binop, $var, $re) = ("", "", "");
3635     if ($op->flags & OPf_STACKED) {
3636         $binop = 1;
3637         $var = $self->deparse($kid, 20);
3638         $kid = $kid->sibling;
3639     }
3640     my $quote = 1;
3641     my $extended = ($op->pmflags & PMf_EXTENDED);
3642     if (null $kid) {
3643         my $unbacked = re_unback($op->precomp);
3644         if ($extended) {
3645             $re = re_uninterp_extended(escape_extended_re($unbacked));
3646         } else {
3647             $re = re_uninterp(escape_str(re_unback($op->precomp)));
3648         }
3649     } elsif ($kid->name ne 'regcomp') {
3650         carp("found ".$kid->name." where regcomp expected");
3651     } else {
3652         ($re, $quote) = $self->regcomp($kid, 1, $extended);
3653     }
3654     my $flags = "";
3655     $flags .= "c" if $op->pmflags & PMf_CONTINUE;
3656     $flags .= "g" if $op->pmflags & PMf_GLOBAL;
3657     $flags .= "i" if $op->pmflags & PMf_FOLD;
3658     $flags .= "m" if $op->pmflags & PMf_MULTILINE;
3659     $flags .= "o" if $op->pmflags & PMf_KEEP;
3660     $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
3661     $flags .= "x" if $op->pmflags & PMf_EXTENDED;
3662     $flags = $matchwords{$flags} if $matchwords{$flags};
3663     if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
3664         $re =~ s/\?/\\?/g;
3665         $re = "?$re?";
3666     } elsif ($quote) {
3667         $re = single_delim($name, $delim, $re);
3668     }
3669     $re = $re . $flags if $quote;
3670     if ($binop) {
3671         return $self->maybe_parens("$var =~ $re", $cx, 20);
3672     } else {
3673         return $re;
3674     }
3675 }
3676
3677 sub pp_match { matchop(@_, "m", "/") }
3678 sub pp_pushre { matchop(@_, "m", "/") }
3679 sub pp_qr { matchop(@_, "qr", "") }
3680
3681 sub pp_split {
3682     my $self = shift;
3683     my($op, $cx) = @_;
3684     my($kid, @exprs, $ary, $expr);
3685     $kid = $op->first;
3686     # under ithreads pmreplroot is an integer, not an SV
3687     my $replroot = $kid->pmreplroot;
3688     if ( ( ref($replroot) && $$replroot ) ||
3689          ( !ref($replroot) && $replroot ) ) {
3690         $ary = $self->stash_variable('@', $self->gv_name($kid->pmreplroot));
3691     }
3692     for (; !null($kid); $kid = $kid->sibling) {
3693         push @exprs, $self->deparse($kid, 6);
3694     }
3695
3696     # handle special case of split(), and split(" ") that compiles to /\s+/
3697     $kid = $op->first;
3698     if ($kid->flags & OPf_SPECIAL
3699         && $exprs[0] eq '/\\s+/'
3700         && $kid->pmflags & PMf_SKIPWHITE ) {
3701             $exprs[0] = '" "';
3702     }
3703
3704     $expr = "split(" . join(", ", @exprs) . ")";
3705     if ($ary) {
3706         return $self->maybe_parens("$ary = $expr", $cx, 7);
3707     } else {
3708         return $expr;
3709     }
3710 }
3711
3712 # oxime -- any of various compounds obtained chiefly by the action of
3713 # hydroxylamine on aldehydes and ketones and characterized by the
3714 # bivalent grouping C=NOH [Webster's Tenth]
3715
3716 my %substwords;
3717 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
3718     'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
3719     'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
3720     'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
3721
3722 sub pp_subst {
3723     my $self = shift;
3724     my($op, $cx) = @_;
3725     my $kid = $op->first;
3726     my($binop, $var, $re, $repl) = ("", "", "", "");
3727     if ($op->flags & OPf_STACKED) {
3728         $binop = 1;
3729         $var = $self->deparse($kid, 20);
3730         $kid = $kid->sibling;
3731     }
3732     my $flags = "";    
3733     if (null($op->pmreplroot)) {
3734         $repl = $self->dq($kid);
3735         $kid = $kid->sibling;
3736     } else {
3737         $repl = $op->pmreplroot->first; # skip substcont
3738         while ($repl->name eq "entereval") {
3739             $repl = $repl->first;
3740             $flags .= "e";
3741         }
3742         if ($op->pmflags & PMf_EVAL) {
3743             $repl = $self->deparse($repl, 0, 1);
3744         } else {
3745             $repl = $self->dq($repl);   
3746         }
3747     }
3748     my $extended = ($op->pmflags & PMf_EXTENDED);
3749     if (null $kid) {
3750         my $unbacked = re_unback($op->precomp);
3751         if ($extended) {
3752             $re = re_uninterp_extended(escape_extended_re($unbacked));
3753         }
3754         else {
3755             $re = re_uninterp(escape_str($unbacked));
3756         }
3757     } else {
3758         ($re) = $self->regcomp($kid, 1, $extended);
3759     }
3760     $flags .= "e" if $op->pmflags & PMf_EVAL;
3761     $flags .= "g" if $op->pmflags & PMf_GLOBAL;
3762     $flags .= "i" if $op->pmflags & PMf_FOLD;
3763     $flags .= "m" if $op->pmflags & PMf_MULTILINE;
3764     $flags .= "o" if $op->pmflags & PMf_KEEP;
3765     $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
3766     $flags .= "x" if $extended;
3767     $flags = $substwords{$flags} if $substwords{$flags};
3768     if ($binop) {
3769         return $self->maybe_parens("$var =~ s"
3770                                    . double_delim($re, $repl) . $flags,
3771                                    $cx, 20);
3772     } else {
3773         return "s". double_delim($re, $repl) . $flags;  
3774     }
3775 }
3776
3777 1;
3778 __END__
3779
3780 =head1 NAME
3781
3782 B::Deparse - Perl compiler backend to produce perl code
3783
3784 =head1 SYNOPSIS
3785
3786 B<perl> B<-MO=Deparse>[B<,-u>I<PACKAGE>][B<,-p>][B<,-q>][B<,-l>]
3787         [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
3788
3789 =head1 DESCRIPTION
3790
3791 B::Deparse is a backend module for the Perl compiler that generates
3792 perl source code, based on the internal compiled structure that perl
3793 itself creates after parsing a program. The output of B::Deparse won't
3794 be exactly the same as the original source, since perl doesn't keep
3795 track of comments or whitespace, and there isn't a one-to-one
3796 correspondence between perl's syntactical constructions and their
3797 compiled form, but it will often be close. When you use the B<-p>
3798 option, the output also includes parentheses even when they are not
3799 required by precedence, which can make it easy to see if perl is
3800 parsing your expressions the way you intended.
3801
3802 Please note that this module is mainly new and untested code and is
3803 still under development, so it may change in the future.
3804
3805 =head1 OPTIONS
3806
3807 As with all compiler backend options, these must follow directly after
3808 the '-MO=Deparse', separated by a comma but not any white space.
3809
3810 =over 4
3811
3812 =item B<-l>
3813
3814 Add '#line' declarations to the output based on the line and file
3815 locations of the original code.
3816
3817 =item B<-p>
3818
3819 Print extra parentheses. Without this option, B::Deparse includes
3820 parentheses in its output only when they are needed, based on the
3821 structure of your program. With B<-p>, it uses parentheses (almost)
3822 whenever they would be legal. This can be useful if you are used to
3823 LISP, or if you want to see how perl parses your input. If you say
3824
3825     if ($var & 0x7f == 65) {print "Gimme an A!"} 
3826     print ($which ? $a : $b), "\n";
3827     $name = $ENV{USER} or "Bob";
3828
3829 C<B::Deparse,-p> will print
3830
3831     if (($var & 0)) {
3832         print('Gimme an A!')
3833     };
3834     (print(($which ? $a : $b)), '???');
3835     (($name = $ENV{'USER'}) or '???')
3836
3837 which probably isn't what you intended (the C<'???'> is a sign that
3838 perl optimized away a constant value).
3839
3840 =item B<-P>
3841
3842 Disable prototype checking. With this option, all function calls are
3843 deparsed as if no prototype was defined for them. In other words,
3844
3845     perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
3846
3847 will print
3848
3849     sub foo (\@) {
3850         1;
3851     }
3852     &foo(\@x);
3853
3854 making clear how the parameters are actually passed to C<foo>.
3855
3856 =item B<-q>
3857
3858 Expand double-quoted strings into the corresponding combinations of
3859 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
3860 instance, print
3861
3862     print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
3863
3864 as
3865
3866     print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
3867           . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
3868
3869 Note that the expanded form represents the way perl handles such
3870 constructions internally -- this option actually turns off the reverse
3871 translation that B::Deparse usually does. On the other hand, note that
3872 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
3873 of $y into a string before doing the assignment.
3874
3875 =item B<-f>I<FILE>
3876
3877 Normally, B::Deparse deparses the main code of a program, and all the subs
3878 defined in the same file. To include subs defined in other files, pass the
3879 B<-f> option with the filename. You can pass the B<-f> option several times, to
3880 include more than one secondary file.  (Most of the time you don't want to
3881 use it at all.)  You can also use this option to include subs which are
3882 defined in the scope of a B<#line> directive with two parameters.
3883
3884 =item B<-s>I<LETTERS>
3885
3886 Tweak the style of B::Deparse's output. The letters should follow
3887 directly after the 's', with no space or punctuation. The following
3888 options are available:
3889
3890 =over 4
3891
3892 =item B<C>
3893
3894 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
3895
3896     if (...) {
3897          ...
3898     } else {
3899          ...
3900     }
3901
3902 instead of
3903
3904     if (...) {
3905          ...
3906     }
3907     else {
3908          ...
3909     }
3910
3911 The default is not to cuddle.
3912
3913 =item B<i>I<NUMBER>
3914
3915 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
3916
3917 =item B<T>
3918
3919 Use tabs for each 8 columns of indent. The default is to use only spaces.
3920 For instance, if the style options are B<-si4T>, a line that's indented
3921 3 times will be preceded by one tab and four spaces; if the options were
3922 B<-si8T>, the same line would be preceded by three tabs.
3923
3924 =item B<v>I<STRING>B<.>
3925
3926 Print I<STRING> for the value of a constant that can't be determined
3927 because it was optimized away (mnemonic: this happens when a constant
3928 is used in B<v>oid context). The end of the string is marked by a period.
3929 The string should be a valid perl expression, generally a constant.
3930 Note that unless it's a number, it probably needs to be quoted, and on
3931 a command line quotes need to be protected from the shell. Some
3932 conventional values include 0, 1, 42, '', 'foo', and
3933 'Useless use of constant omitted' (which may need to be
3934 B<-sv"'Useless use of constant omitted'.">
3935 or something similar depending on your shell). The default is '???'.
3936 If you're using B::Deparse on a module or other file that's require'd,
3937 you shouldn't use a value that evaluates to false, since the customary
3938 true constant at the end of a module will be in void context when the
3939 file is compiled as a main program.
3940
3941 =back
3942
3943 =item B<-x>I<LEVEL>
3944
3945 Expand conventional syntax constructions into equivalent ones that expose
3946 their internal operation. I<LEVEL> should be a digit, with higher values
3947 meaning more expansion. As with B<-q>, this actually involves turning off
3948 special cases in B::Deparse's normal operations.
3949
3950 If I<LEVEL> is at least 3, for loops will be translated into equivalent
3951 while loops with continue blocks; for instance
3952
3953     for ($i = 0; $i < 10; ++$i) {
3954         print $i;
3955     }
3956
3957 turns into
3958
3959     $i = 0;
3960     while ($i < 10) {
3961         print $i;
3962     } continue {
3963         ++$i
3964     }
3965
3966 Note that in a few cases this translation can't be perfectly carried back
3967 into the source code -- if the loop's initializer declares a my variable,
3968 for instance, it won't have the correct scope outside of the loop.
3969
3970 If I<LEVEL> is at least 7, if statements will be translated into equivalent
3971 expressions using C<&&>, C<?:> and C<do {}>; for instance
3972
3973     print 'hi' if $nice;
3974     if ($nice) {
3975         print 'hi';
3976     }
3977     if ($nice) {
3978         print 'hi';
3979     } else {
3980         print 'bye';
3981     }
3982
3983 turns into
3984
3985     $nice and print 'hi';
3986     $nice and do { print 'hi' };
3987     $nice ? do { print 'hi' } : do { print 'bye' };
3988
3989 Long sequences of elsifs will turn into nested ternary operators, which
3990 B::Deparse doesn't know how to indent nicely.
3991
3992 =back
3993
3994 =head1 USING B::Deparse AS A MODULE
3995
3996 =head2 Synopsis
3997
3998     use B::Deparse;
3999     $deparse = B::Deparse->new("-p", "-sC");
4000     $body = $deparse->coderef2text(\&func);
4001     eval "sub func $body"; # the inverse operation
4002
4003 =head2 Description
4004
4005 B::Deparse can also be used on a sub-by-sub basis from other perl
4006 programs.
4007
4008 =head2 new
4009
4010     $deparse = B::Deparse->new(OPTIONS)
4011
4012 Create an object to store the state of a deparsing operation and any
4013 options. The options are the same as those that can be given on the
4014 command line (see L</OPTIONS>); options that are separated by commas
4015 after B<-MO=Deparse> should be given as separate strings. Some
4016 options, like B<-u>, don't make sense for a single subroutine, so
4017 don't pass them.
4018
4019 =head2 ambient_pragmas
4020
4021     $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
4022
4023 The compilation of a subroutine can be affected by a few compiler
4024 directives, B<pragmas>. These are:
4025
4026 =over 4
4027
4028 =item *
4029
4030 use strict;
4031
4032 =item *
4033
4034 use warnings;
4035
4036 =item *
4037
4038 Assigning to the special variable $[
4039
4040 =item *
4041
4042 use integer;
4043
4044 =item *
4045
4046 use bytes;
4047
4048 =item *
4049
4050 use utf8;
4051
4052 =item *
4053
4054 use re;
4055
4056 =back
4057
4058 Ordinarily, if you use B::Deparse on a subroutine which has
4059 been compiled in the presence of one or more of these pragmas,
4060 the output will include statements to turn on the appropriate
4061 directives. So if you then compile the code returned by coderef2text, 
4062 it will behave the same way as the subroutine which you deparsed.
4063
4064 However, you may know that you intend to use the results in a
4065 particular context, where some pragmas are already in scope. In
4066 this case, you use the B<ambient_pragmas> method to describe the
4067 assumptions you wish to make.
4068
4069 Not all of the options currently have any useful effect. See
4070 L</BUGS> for more details.
4071
4072 The parameters it accepts are:
4073
4074 =over 4
4075
4076 =item strict
4077
4078 Takes a string, possibly containing several values separated
4079 by whitespace. The special values "all" and "none" mean what you'd
4080 expect.
4081
4082     $deparse->ambient_pragmas(strict => 'subs refs');
4083
4084 =item $[
4085
4086 Takes a number, the value of the array base $[.
4087
4088 =item bytes
4089
4090 =item utf8
4091
4092 =item integer
4093
4094 If the value is true, then the appropriate pragma is assumed to
4095 be in the ambient scope, otherwise not.
4096
4097 =item re
4098
4099 Takes a string, possibly containing a whitespace-separated list of
4100 values. The values "all" and "none" are special. It's also permissible
4101 to pass an array reference here.
4102
4103     $deparser->ambient_pragmas(re => 'eval');
4104
4105
4106 =item warnings
4107
4108 Takes a string, possibly containing a whitespace-separated list of
4109 values. The values "all" and "none" are special, again. It's also
4110 permissible to pass an array reference here.
4111
4112     $deparser->ambient_pragmas(warnings => [qw[void io]]);
4113
4114 If one of the values is the string "FATAL", then all the warnings
4115 in that list will be considered fatal, just as with the B<warnings>
4116 pragma itself. Should you need to specify that some warnings are
4117 fatal, and others are merely enabled, you can pass the B<warnings>
4118 parameter twice:
4119
4120     $deparser->ambient_pragmas(
4121         warnings => 'all',
4122         warnings => [FATAL => qw/void io/],
4123     );
4124
4125 See L<perllexwarn> for more information about lexical warnings. 
4126
4127 =item hint_bits
4128
4129 =item warning_bits
4130
4131 These two parameters are used to specify the ambient pragmas in
4132 the format used by the special variables $^H and ${^WARNING_BITS}.
4133
4134 They exist principally so that you can write code like:
4135
4136     { my ($hint_bits, $warning_bits);
4137     BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
4138     $deparser->ambient_pragmas (
4139         hint_bits    => $hint_bits,
4140         warning_bits => $warning_bits,
4141         '$['         => 0 + $[
4142     ); }
4143
4144 which specifies that the ambient pragmas are exactly those which
4145 are in scope at the point of calling.
4146
4147 =back
4148
4149 =head2 coderef2text
4150
4151     $body = $deparse->coderef2text(\&func)
4152     $body = $deparse->coderef2text(sub ($$) { ... })
4153
4154 Return source code for the body of a subroutine (a block, optionally
4155 preceded by a prototype in parens), given a reference to the
4156 sub. Because a subroutine can have no names, or more than one name,
4157 this method doesn't return a complete subroutine definition -- if you
4158 want to eval the result, you should prepend "sub subname ", or "sub "
4159 for an anonymous function constructor. Unless the sub was defined in
4160 the main:: package, the code will include a package declaration.
4161
4162 =head1 BUGS
4163
4164 =over 4
4165
4166 =item *
4167
4168 The only pragmas to be completely supported are: C<use warnings>,
4169 C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
4170 behaves like a pragma, is also supported.)
4171
4172 Excepting those listed above, we're currently unable to guarantee that
4173 B::Deparse will produce a pragma at the correct point in the program.
4174 Since the effects of pragmas are often lexically scoped, this can mean
4175 that the pragma holds sway over a different portion of the program
4176 than in the input file.
4177
4178 =item *
4179
4180 In fact, the above is a specific instance of a more general problem:
4181 we can't guarantee to produce BEGIN blocks or C<use> declarations in
4182 exactly the right place. So if you use a module which affects compilation
4183 (such as by over-riding keywords, overloading constants or whatever)
4184 then the output code might not work as intended.
4185
4186 This is the most serious outstanding problem, and will be very hard
4187 to fix.
4188
4189 =item *
4190
4191 If a keyword is over-ridden, and your program explicitly calls
4192 the built-in version by using CORE::keyword, the output of B::Deparse
4193 will not reflect this. If you run the resulting code, it will call
4194 the over-ridden version rather than the built-in one. (Maybe there
4195 should be an option to B<always> print keyword calls as C<CORE::name>.)
4196
4197 =item *
4198
4199 C<sort foo (1, 2, 3)> comes out as C<sort (foo 1, 2, 3)>, which
4200 causes perl to issue a warning.
4201
4202 The obvious fix doesn't work, because these are different:
4203
4204     print (FOO 1, 2, 3), 4, 5, 6;
4205     print FOO (1, 2, 3), 4, 5, 6;
4206
4207 =item *
4208
4209 Constants (other than simple strings or numbers) don't work properly.
4210 Pathological examples that fail (and probably always will) include:
4211
4212     use constant E2BIG => ($!=7);
4213     use constant x=>\$x; print x
4214
4215 The following could (and should) be made to work:
4216
4217     use constant regex => qr/blah/;
4218     print regex;
4219
4220 =item *
4221
4222 An input file that uses source filtering probably won't be deparsed into
4223 runnable code, because it will still include the B<use> declaration
4224 for the source filtering module, even though the code that is
4225 produced is already ordinary Perl which shouldn't be filtered again.
4226
4227 =item *
4228
4229 There are probably many more bugs on non-ASCII platforms (EBCDIC).
4230
4231 =back
4232
4233 =head1 AUTHOR
4234
4235 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier
4236 version by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with
4237 contributions from Gisle Aas, James Duncan, Albert Dvornik, Robin
4238 Houston, Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons,
4239 and Rafael Garcia-Suarez.
4240
4241 =cut