B::check_av() ; B::Deparse for CHECK blocks
[p5sagit/p5-mst-13.2.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) = @_;
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         return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2445     } elsif (!null($op->first->sibling) and
2446              $op->first->sibling->name eq "null" and
2447              class($op->first->sibling) eq "UNOP" and
2448              $op->first->sibling->first->flags & OPf_STACKED and
2449              $op->first->sibling->first->name eq "rcatline") {
2450         return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2451                                    . $self->deparse($op->first->sibling, 18),
2452                                    $cx, 18);
2453     } else {
2454         return $self->deparse($op->first, $cx);
2455     }
2456 }
2457
2458 sub padname {
2459     my $self = shift;
2460     my $targ = shift;
2461     return $self->padname_sv($targ)->PVX;
2462 }
2463
2464 sub padany {
2465     my $self = shift;
2466     my $op = shift;
2467     return substr($self->padname($op->targ), 1); # skip $/@/%
2468 }
2469
2470 sub pp_padsv {
2471     my $self = shift;
2472     my($op, $cx) = @_;
2473     return $self->maybe_my($op, $cx, $self->padname($op->targ));
2474 }
2475
2476 sub pp_padav { pp_padsv(@_) }
2477 sub pp_padhv { pp_padsv(@_) }
2478
2479 my @threadsv_names;
2480
2481 BEGIN {
2482     @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
2483                        "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
2484                        "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
2485                        "!", "@");
2486 }
2487
2488 sub pp_threadsv {
2489     my $self = shift;
2490     my($op, $cx) = @_;
2491     return $self->maybe_local($op, $cx, "\$" .  $threadsv_names[$op->targ]);
2492 }    
2493
2494 sub gv_or_padgv {
2495     my $self = shift;
2496     my $op = shift;
2497     if (class($op) eq "PADOP") {
2498         return $self->padval($op->padix);
2499     } else { # class($op) eq "SVOP"
2500         return $op->gv;
2501     }
2502 }
2503
2504 sub pp_gvsv {
2505     my $self = shift;
2506     my($op, $cx) = @_;
2507     my $gv = $self->gv_or_padgv($op);
2508     return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2509                                  $self->gv_name($gv)));
2510 }
2511
2512 sub pp_gv {
2513     my $self = shift;
2514     my($op, $cx) = @_;
2515     my $gv = $self->gv_or_padgv($op);
2516     return $self->gv_name($gv);
2517 }
2518
2519 sub pp_aelemfast {
2520     my $self = shift;
2521     my($op, $cx) = @_;
2522     my $gv = $self->gv_or_padgv($op);
2523     my $name = $self->gv_name($gv);
2524     $name = $self->{'curstash'}."::$name"
2525         if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2526
2527     return "\$" . $name . "[" .
2528                   ($op->private + $self->{'arybase'}) . "]";
2529 }
2530
2531 sub rv2x {
2532     my $self = shift;
2533     my($op, $cx, $type) = @_;
2534
2535     if (class($op) eq 'NULL' || !$op->can("first")) {
2536         carp("Unexpected op in pp_rv2x");
2537         return 'XXX';
2538     }
2539     my $kid = $op->first;
2540     my $str = $self->deparse($kid, 0);
2541     return $self->stash_variable($type, $str) if is_scalar($kid);
2542     return $type ."{$str}";
2543 }
2544
2545 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2546 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2547 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2548
2549 # skip rv2av
2550 sub pp_av2arylen {
2551     my $self = shift;
2552     my($op, $cx) = @_;
2553     if ($op->first->name eq "padav") {
2554         return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2555     } else {
2556         return $self->maybe_local($op, $cx,
2557                                   $self->rv2x($op->first, $cx, '$#'));
2558     }
2559 }
2560
2561 # skip down to the old, ex-rv2cv
2562 sub pp_rv2cv {
2563     my ($self, $op, $cx) = @_;
2564     if (!null($op->first) && $op->first->name eq 'null' &&
2565         $op->first->targ eq OP_LIST)
2566     {
2567         return $self->rv2x($op->first->first->sibling, $cx, "&")
2568     }
2569     else {
2570         return $self->rv2x($op, $cx, "")
2571     }
2572 }
2573
2574 sub pp_rv2av {
2575     my $self = shift;
2576     my($op, $cx) = @_;
2577     my $kid = $op->first;
2578     if ($kid->name eq "const") { # constant list
2579         my $av = $self->const_sv($kid);
2580         return "(" . join(", ", map(const($_), $av->ARRAY)) . ")";
2581     } else {
2582         return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
2583     }
2584  }
2585
2586 sub is_subscriptable {
2587     my $op = shift;
2588     if ($op->name =~ /^[ahg]elem/) {
2589         return 1;
2590     } elsif ($op->name eq "entersub") {
2591         my $kid = $op->first;
2592         return 0 unless null $kid->sibling;
2593         $kid = $kid->first;
2594         $kid = $kid->sibling until null $kid->sibling;
2595         return 0 if is_scope($kid);
2596         $kid = $kid->first;
2597         return 0 if $kid->name eq "gv";
2598         return 0 if is_scalar($kid);
2599         return is_subscriptable($kid);  
2600     } else {
2601         return 0;
2602     }
2603 }
2604
2605 sub elem {
2606     my $self = shift;
2607     my ($op, $cx, $left, $right, $padname) = @_;
2608     my($array, $idx) = ($op->first, $op->first->sibling);
2609     unless ($array->name eq $padname) { # Maybe this has been fixed     
2610         $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
2611     }
2612     if ($array->name eq $padname) {
2613         $array = $self->padany($array);
2614     } elsif (is_scope($array)) { # ${expr}[0]
2615         $array = "{" . $self->deparse($array, 0) . "}";
2616     } elsif ($array->name eq "gv") {
2617         $array = $self->gv_name($self->gv_or_padgv($array));
2618         if ($array !~ /::/) {
2619             my $prefix = ($left eq '[' ? '@' : '%');
2620             $array = $self->{curstash}.'::'.$array
2621                 if $self->lex_in_scope($prefix . $array);
2622         }
2623     } elsif (is_scalar $array) { # $x[0], $$x[0], ...
2624         $array = $self->deparse($array, 24);
2625     } else {
2626         # $x[20][3]{hi} or expr->[20]
2627         my $arrow = is_subscriptable($array) ? "" : "->";
2628         return $self->deparse($array, 24) . $arrow .
2629             $left . $self->deparse($idx, 1) . $right;
2630     }
2631     $idx = $self->deparse($idx, 1);
2632
2633     # Outer parens in an array index will confuse perl
2634     # if we're interpolating in a regular expression, i.e.
2635     # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
2636     #
2637     # If $self->{parens}, then an initial '(' will
2638     # definitely be paired with a final ')'. If
2639     # !$self->{parens}, the misleading parens won't
2640     # have been added in the first place.
2641     #
2642     # [You might think that we could get "(...)...(...)"
2643     # where the initial and final parens do not match
2644     # each other. But we can't, because the above would
2645     # only happen if there's an infix binop between the
2646     # two pairs of parens, and *that* means that the whole
2647     # expression would be parenthesized as well.]
2648     #
2649     $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
2650
2651     # Hash-element braces will autoquote a bareword inside themselves.
2652     # We need to make sure that C<$hash{warn()}> doesn't come out as
2653     # C<$hash{warn}>, which has a quite different meaning. Currently
2654     # B::Deparse will always quote strings, even if the string was a
2655     # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
2656     # for constant strings.) So we can cheat slightly here - if we see
2657     # a bareword, we know that it is supposed to be a function call.
2658     #
2659     $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
2660
2661     return "\$" . $array . $left . $idx . $right;
2662 }
2663
2664 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
2665 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
2666
2667 sub pp_gelem {
2668     my $self = shift;
2669     my($op, $cx) = @_;
2670     my($glob, $part) = ($op->first, $op->last);
2671     $glob = $glob->first; # skip rv2gv
2672     $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
2673     my $scope = is_scope($glob);
2674     $glob = $self->deparse($glob, 0);
2675     $part = $self->deparse($part, 1);
2676     return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
2677 }
2678
2679 sub slice {
2680     my $self = shift;
2681     my ($op, $cx, $left, $right, $regname, $padname) = @_;
2682     my $last;
2683     my(@elems, $kid, $array, $list);
2684     if (class($op) eq "LISTOP") {
2685         $last = $op->last;
2686     } else { # ex-hslice inside delete()
2687         for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
2688         $last = $kid;
2689     }
2690     $array = $last;
2691     $array = $array->first
2692         if $array->name eq $regname or $array->name eq "null";
2693     if (is_scope($array)) {
2694         $array = "{" . $self->deparse($array, 0) . "}";
2695     } elsif ($array->name eq $padname) {
2696         $array = $self->padany($array);
2697     } else {
2698         $array = $self->deparse($array, 24);
2699     }
2700     $kid = $op->first->sibling; # skip pushmark
2701     if ($kid->name eq "list") {
2702         $kid = $kid->first->sibling; # skip list, pushmark
2703         for (; !null $kid; $kid = $kid->sibling) {
2704             push @elems, $self->deparse($kid, 6);
2705         }
2706         $list = join(", ", @elems);
2707     } else {
2708         $list = $self->deparse($kid, 1);
2709     }
2710     return "\@" . $array . $left . $list . $right;
2711 }
2712
2713 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
2714 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
2715
2716 sub pp_lslice {
2717     my $self = shift;
2718     my($op, $cx) = @_;
2719     my $idx = $op->first;
2720     my $list = $op->last;
2721     my(@elems, $kid);
2722     $list = $self->deparse($list, 1);
2723     $idx = $self->deparse($idx, 1);
2724     return "($list)" . "[$idx]";
2725 }
2726
2727 sub want_scalar {
2728     my $op = shift;
2729     return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
2730 }
2731
2732 sub want_list {
2733     my $op = shift;
2734     return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
2735 }
2736
2737 sub method {
2738     my $self = shift;
2739     my($op, $cx) = @_;
2740     my $kid = $op->first->sibling; # skip pushmark
2741     my($meth, $obj, @exprs);
2742     if ($kid->name eq "list" and want_list $kid) {
2743         # When an indirect object isn't a bareword but the args are in
2744         # parens, the parens aren't part of the method syntax (the LLAFR
2745         # doesn't apply), but they make a list with OPf_PARENS set that
2746         # doesn't get flattened by the append_elem that adds the method,
2747         # making a (object, arg1, arg2, ...) list where the object
2748         # usually is. This can be distinguished from 
2749         # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
2750         # object) because in the later the list is in scalar context
2751         # as the left side of -> always is, while in the former
2752         # the list is in list context as method arguments always are.
2753         # (Good thing there aren't method prototypes!)
2754         $meth = $kid->sibling;
2755         $kid = $kid->first->sibling; # skip pushmark
2756         $obj = $kid;
2757         $kid = $kid->sibling;
2758         for (; not null $kid; $kid = $kid->sibling) {
2759             push @exprs, $self->deparse($kid, 6);
2760         }
2761     } else {
2762         $obj = $kid;
2763         $kid = $kid->sibling;
2764         for (; !null ($kid->sibling) && $kid->name ne "method_named";
2765               $kid = $kid->sibling) {
2766             push @exprs, $self->deparse($kid, 6);
2767         }
2768         $meth = $kid;
2769     }
2770     $obj = $self->deparse($obj, 24);
2771     if ($meth->name eq "method_named") {
2772         $meth = $self->const_sv($meth)->PV;
2773     } else {
2774         $meth = $meth->first;
2775         if ($meth->name eq "const") {
2776             # As of 5.005_58, this case is probably obsoleted by the
2777             # method_named case above
2778             $meth = $self->const_sv($meth)->PV; # needs to be bare
2779         } else {
2780             $meth = $self->deparse($meth, 1);
2781         }
2782     }
2783     my $args = join(", ", @exprs);      
2784     $kid = $obj . "->" . $meth;
2785     if (length $args) {
2786         return $kid . "(" . $args . ")"; # parens mandatory
2787     } else {
2788         return $kid;
2789     }
2790 }
2791
2792 # returns "&" if the prototype doesn't match the args,
2793 # or ("", $args_after_prototype_demunging) if it does.
2794 sub check_proto {
2795     my $self = shift;
2796     return "&" if $self->{'noproto'};
2797     my($proto, @args) = @_;
2798     my($arg, $real);
2799     my $doneok = 0;
2800     my @reals;
2801     # An unbackslashed @ or % gobbles up the rest of the args
2802     1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
2803     while ($proto) {
2804         $proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|;)//;
2805         my $chr = $1;
2806         if ($chr eq "") {
2807             return "&" if @args;
2808         } elsif ($chr eq ";") {
2809             $doneok = 1;
2810         } elsif ($chr eq "@" or $chr eq "%") {
2811             push @reals, map($self->deparse($_, 6), @args);
2812             @args = ();
2813         } else {
2814             $arg = shift @args;
2815             last unless $arg;
2816             if ($chr eq "\$") {
2817                 if (want_scalar $arg) {
2818                     push @reals, $self->deparse($arg, 6);
2819                 } else {
2820                     return "&";
2821                 }
2822             } elsif ($chr eq "&") {
2823                 if ($arg->name =~ /^(s?refgen|undef)$/) {
2824                     push @reals, $self->deparse($arg, 6);
2825                 } else {
2826                     return "&";
2827                 }
2828             } elsif ($chr eq "*") {
2829                 if ($arg->name =~ /^s?refgen$/
2830                     and $arg->first->first->name eq "rv2gv")
2831                   {
2832                       $real = $arg->first->first; # skip refgen, null
2833                       if ($real->first->name eq "gv") {
2834                           push @reals, $self->deparse($real, 6);
2835                       } else {
2836                           push @reals, $self->deparse($real->first, 6);
2837                       }
2838                   } else {
2839                       return "&";
2840                   }
2841             } elsif (substr($chr, 0, 1) eq "\\") {
2842                 $chr =~ tr/\\[]//d;
2843                 if ($arg->name =~ /^s?refgen$/ and
2844                     !null($real = $arg->first) and
2845                     ($chr =~ /\$/ && is_scalar($real->first)
2846                      or ($chr =~ /@/
2847                          && class($real->first->sibling) ne 'NULL'
2848                          && $real->first->sibling->name
2849                          =~ /^(rv2|pad)av$/)
2850                      or ($chr =~ /%/
2851                          && class($real->first->sibling) ne 'NULL'
2852                          && $real->first->sibling->name
2853                          =~ /^(rv2|pad)hv$/)
2854                      #or ($chr =~ /&/ # This doesn't work
2855                      #   && $real->first->name eq "rv2cv")
2856                      or ($chr =~ /\*/
2857                          && $real->first->name eq "rv2gv")))
2858                   {
2859                       push @reals, $self->deparse($real, 6);
2860                   } else {
2861                       return "&";
2862                   }
2863             }
2864        }
2865     }
2866     return "&" if $proto and !$doneok; # too few args and no `;'
2867     return "&" if @args;               # too many args
2868     return ("", join ", ", @reals);
2869 }
2870
2871 sub pp_entersub {
2872     my $self = shift;
2873     my($op, $cx) = @_;
2874     return $self->method($op, $cx) unless null $op->first->sibling;
2875     my $prefix = "";
2876     my $amper = "";
2877     my($kid, @exprs);
2878     if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
2879         $prefix = "do ";
2880     } elsif ($op->private & OPpENTERSUB_AMPER) {
2881         $amper = "&";
2882     }
2883     $kid = $op->first;
2884     $kid = $kid->first->sibling; # skip ex-list, pushmark
2885     for (; not null $kid->sibling; $kid = $kid->sibling) {
2886         push @exprs, $kid;
2887     }
2888     my $simple = 0;
2889     my $proto = undef;
2890     if (is_scope($kid)) {
2891         $amper = "&";
2892         $kid = "{" . $self->deparse($kid, 0) . "}";
2893     } elsif ($kid->first->name eq "gv") {
2894         my $gv = $self->gv_or_padgv($kid->first);
2895         if (class($gv->CV) ne "SPECIAL") {
2896             $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
2897         }
2898         $simple = 1; # only calls of named functions can be prototyped
2899         $kid = $self->deparse($kid, 24);
2900     } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
2901         $amper = "&";
2902         $kid = $self->deparse($kid, 24);
2903     } else {
2904         $prefix = "";
2905         my $arrow = is_subscriptable($kid->first) ? "" : "->";
2906         $kid = $self->deparse($kid, 24) . $arrow;
2907     }
2908
2909     # Doesn't matter how many prototypes there are, if
2910     # they haven't happened yet!
2911     my $declared;
2912     {
2913         no strict 'refs';
2914         no warnings 'uninitialized';
2915         $declared = exists $self->{'subs_declared'}{$kid}
2916             || ( 
2917                  defined &{ %{$self->{'curstash'}."::"}->{$kid} }
2918                  && !exists
2919                      $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
2920                  && defined prototype $self->{'curstash'}."::".$kid
2921                );
2922         if (!$declared && defined($proto)) {
2923             # Avoid "too early to check prototype" warning
2924             ($amper, $proto) = ('&');
2925         }
2926     }
2927
2928     my $args;
2929     if ($declared and defined $proto and not $amper) {
2930         ($amper, $args) = $self->check_proto($proto, @exprs);
2931         if ($amper eq "&") {
2932             $args = join(", ", map($self->deparse($_, 6), @exprs));
2933         }
2934     } else {
2935         $args = join(", ", map($self->deparse($_, 6), @exprs));
2936     }
2937     if ($prefix or $amper) {
2938         if ($op->flags & OPf_STACKED) {
2939             return $prefix . $amper . $kid . "(" . $args . ")";
2940         } else {
2941             return $prefix . $amper. $kid;
2942         }
2943     } else {
2944         # glob() invocations can be translated into calls of
2945         # CORE::GLOBAL::glob with a second parameter, a number.
2946         # Reverse this.
2947         if ($kid eq "CORE::GLOBAL::glob") {
2948             $kid = "glob";
2949             $args =~ s/\s*,[^,]+$//;
2950         }
2951
2952         # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
2953         # so it must have been translated from a keyword call. Translate
2954         # it back.
2955         $kid =~ s/^CORE::GLOBAL:://;
2956
2957         if (!$declared) {
2958             return "$kid(" . $args . ")";
2959         } elsif (defined $proto and $proto eq "") {
2960             return $kid;
2961         } elsif (defined $proto and $proto eq "\$" and is_scalar($exprs[0])) {
2962             return $self->maybe_parens_func($kid, $args, $cx, 16);
2963         } elsif (defined($proto) && $proto or $simple) {
2964             return $self->maybe_parens_func($kid, $args, $cx, 5);
2965         } else {
2966             return "$kid(" . $args . ")";
2967         }
2968     }
2969 }
2970
2971 sub pp_enterwrite { unop(@_, "write") }
2972
2973 # escape things that cause interpolation in double quotes,
2974 # but not character escapes
2975 sub uninterp {
2976     my($str) = @_;
2977     $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
2978     return $str;
2979 }
2980
2981 {
2982 my $bal;
2983 BEGIN {
2984     use re "eval";
2985     # Matches any string which is balanced with respect to {braces}
2986     $bal = qr(
2987       (?:
2988         [^\\{}]
2989       | \\\\
2990       | \\[{}]
2991       | \{(??{$bal})\}
2992       )*
2993     )x;
2994 }
2995
2996 # the same, but treat $|, $), $( and $ at the end of the string differently
2997 sub re_uninterp {
2998     my($str) = @_;
2999
3000     $str =~ s/
3001           ( ^|\G                  # $1
3002           | [^\\]
3003           )
3004
3005           (                       # $2
3006             (?:\\\\)*
3007           )
3008
3009           (                       # $3
3010             (\(\?\??\{$bal\}\))   # $4
3011           | [\$\@]
3012             (?!\||\)|\(|$)
3013           | \\[uUlLQE]
3014           )
3015
3016         /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3017
3018     return $str;
3019 }
3020
3021 # This is for regular expressions with the /x modifier
3022 # We have to leave comments unmangled.
3023 sub re_uninterp_extended {
3024     my($str) = @_;
3025
3026     $str =~ s/
3027           ( ^|\G                  # $1
3028           | [^\\]
3029           )
3030
3031           (                       # $2
3032             (?:\\\\)*
3033           )
3034
3035           (                       # $3
3036             ( \(\?\??\{$bal\}\)   # $4  (skip over (?{}) and (??{}) blocks)
3037             | \#[^\n]*            #     (skip over comments)
3038             )
3039           | [\$\@]
3040             (?!\||\)|\(|$|\s)
3041           | \\[uUlLQE]
3042           )
3043
3044         /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3045
3046     return $str;
3047 }
3048 }
3049
3050 my %unctrl = # portable to to EBCDIC
3051     (
3052      "\c@" => '\c@',    # unused
3053      "\cA" => '\cA',
3054      "\cB" => '\cB',
3055      "\cC" => '\cC',
3056      "\cD" => '\cD',
3057      "\cE" => '\cE',
3058      "\cF" => '\cF',
3059      "\cG" => '\cG',
3060      "\cH" => '\cH',
3061      "\cI" => '\cI',
3062      "\cJ" => '\cJ',
3063      "\cK" => '\cK',
3064      "\cL" => '\cL',
3065      "\cM" => '\cM',
3066      "\cN" => '\cN',
3067      "\cO" => '\cO',
3068      "\cP" => '\cP',
3069      "\cQ" => '\cQ',
3070      "\cR" => '\cR',
3071      "\cS" => '\cS',
3072      "\cT" => '\cT',
3073      "\cU" => '\cU',
3074      "\cV" => '\cV',
3075      "\cW" => '\cW',
3076      "\cX" => '\cX',
3077      "\cY" => '\cY',
3078      "\cZ" => '\cZ',
3079      "\c[" => '\c[',    # unused
3080      "\c\\" => '\c\\',  # unused
3081      "\c]" => '\c]',    # unused
3082      "\c_" => '\c_',    # unused
3083     );
3084
3085 # character escapes, but not delimiters that might need to be escaped
3086 sub escape_str { # ASCII, UTF8
3087     my($str) = @_;
3088     $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3089     $str =~ s/\a/\\a/g;
3090 #    $str =~ s/\cH/\\b/g; # \b means something different in a regex 
3091     $str =~ s/\t/\\t/g;
3092     $str =~ s/\n/\\n/g;
3093     $str =~ s/\e/\\e/g;
3094     $str =~ s/\f/\\f/g;
3095     $str =~ s/\r/\\r/g;
3096     $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
3097     $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
3098     return $str;
3099 }
3100
3101 # For regexes with the /x modifier.
3102 # Leave whitespace unmangled.
3103 sub escape_extended_re {
3104     my($str) = @_;
3105     $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3106     $str =~ s/([[:^print:]])/
3107         ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
3108     $str =~ s/\n/\n\f/g;
3109     return $str;
3110 }
3111
3112 # Don't do this for regexen
3113 sub unback {
3114     my($str) = @_;
3115     $str =~ s/\\/\\\\/g;
3116     return $str;
3117 }
3118
3119 # Remove backslashes which precede literal control characters,
3120 # to avoid creating ambiguity when we escape the latter.
3121 sub re_unback {
3122     my($str) = @_;
3123
3124     # the insane complexity here is due to the behaviour of "\c\"
3125     $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
3126     return $str;
3127 }
3128
3129 sub balanced_delim {
3130     my($str) = @_;
3131     my @str = split //, $str;
3132     my($ar, $open, $close, $fail, $c, $cnt);
3133     for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3134         ($open, $close) = @$ar;
3135         $fail = 0; $cnt = 0;
3136         for $c (@str) {
3137             if ($c eq $open) {
3138                 $cnt++;
3139             } elsif ($c eq $close) {
3140                 $cnt--;
3141                 if ($cnt < 0) {
3142                     # qq()() isn't ")("
3143                     $fail = 1;
3144                     last;
3145                 }
3146             }
3147         }
3148         $fail = 1 if $cnt != 0;
3149         return ($open, "$open$str$close") if not $fail;
3150     }
3151     return ("", $str);
3152 }
3153
3154 sub single_delim {
3155     my($q, $default, $str) = @_;
3156     return "$default$str$default" if $default and index($str, $default) == -1;
3157     if ($q ne 'qr') {
3158         (my $succeed, $str) = balanced_delim($str);
3159         return "$q$str" if $succeed;
3160     }
3161     for my $delim ('/', '"', '#') {
3162         return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3163     }
3164     if ($default) {
3165         $str =~ s/$default/\\$default/g;
3166         return "$default$str$default";
3167     } else {
3168         $str =~ s[/][\\/]g;
3169         return "$q/$str/";
3170     }
3171 }
3172
3173 sub const {
3174     my $sv = shift;
3175     if (class($sv) eq "SPECIAL") {
3176         return ('undef', '1', '0')[$$sv-1]; # sv_undef, sv_yes, sv_no
3177     } elsif (class($sv) eq "NULL") {
3178        return 'undef';
3179     } elsif ($sv->FLAGS & SVf_IOK) {
3180         return $sv->int_value;
3181     } elsif ($sv->FLAGS & SVf_NOK) {
3182         # try the default stringification
3183         my $r = "".$sv->NV;
3184         if ($r =~ /e/) {
3185             # If it's in scientific notation, we might have lost information
3186             return sprintf("%.20e", $sv->NV);
3187         }
3188         return $r;
3189     } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3190         return "\\(" . const($sv->RV) . ")"; # constant folded
3191     } elsif ($sv->FLAGS & SVf_POK) {
3192         my $str = $sv->PV;
3193         if ($str =~ /[^ -~]/) { # ASCII for non-printing
3194             return single_delim("qq", '"', uninterp escape_str unback $str);
3195         } else {
3196             return single_delim("q", "'", unback $str);
3197         }
3198     } else {
3199         return "undef";
3200     }
3201 }
3202
3203 sub const_sv {
3204     my $self = shift;
3205     my $op = shift;
3206     my $sv = $op->sv;
3207     # the constant could be in the pad (under useithreads)
3208     $sv = $self->padval($op->targ) unless $$sv;
3209     return $sv;
3210 }
3211
3212 sub pp_const {
3213     my $self = shift;
3214     my($op, $cx) = @_;
3215     if ($op->private & OPpCONST_ARYBASE) {
3216         return '$[';
3217     }
3218 #    if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting 
3219 #       return $self->const_sv($op)->PV;
3220 #    }
3221     my $sv = $self->const_sv($op);
3222 #    return const($sv);
3223     my $c = const $sv; 
3224     return $c =~ /^-\d/ ? $self->maybe_parens($c, $cx, 21) : $c;
3225 }
3226
3227 sub dq {
3228     my $self = shift;
3229     my $op = shift;
3230     my $type = $op->name;
3231     if ($type eq "const") {
3232         return '$[' if $op->private & OPpCONST_ARYBASE;
3233         return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3234     } elsif ($type eq "concat") {
3235         my $first = $self->dq($op->first);
3236         my $last  = $self->dq($op->last);
3237
3238         # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3239         ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3240             $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
3241             || ($last =~ /^[{\[\w_]/ &&
3242                 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3243
3244         return $first . $last;
3245     } elsif ($type eq "uc") {
3246         return '\U' . $self->dq($op->first->sibling) . '\E';
3247     } elsif ($type eq "lc") {
3248         return '\L' . $self->dq($op->first->sibling) . '\E';
3249     } elsif ($type eq "ucfirst") {
3250         return '\u' . $self->dq($op->first->sibling);
3251     } elsif ($type eq "lcfirst") {
3252         return '\l' . $self->dq($op->first->sibling);
3253     } elsif ($type eq "quotemeta") {
3254         return '\Q' . $self->dq($op->first->sibling) . '\E';
3255     } elsif ($type eq "join") {
3256         return $self->deparse($op->last, 26); # was join($", @ary)
3257     } else {
3258         return $self->deparse($op, 26);
3259     }
3260 }
3261
3262 sub pp_backtick {
3263     my $self = shift;
3264     my($op, $cx) = @_;
3265     # skip pushmark
3266     return single_delim("qx", '`', $self->dq($op->first->sibling));
3267 }
3268
3269 sub dquote {
3270     my $self = shift;
3271     my($op, $cx) = @_;
3272     my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3273     return $self->deparse($kid, $cx) if $self->{'unquote'};
3274     $self->maybe_targmy($kid, $cx,
3275                         sub {single_delim("qq", '"', $self->dq($_[1]))});
3276 }
3277
3278 # OP_STRINGIFY is a listop, but it only ever has one arg
3279 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3280
3281 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3282 # note that tr(from)/to/ is OK, but not tr/from/(to)
3283 sub double_delim {
3284     my($from, $to) = @_;
3285     my($succeed, $delim);
3286     if ($from !~ m[/] and $to !~ m[/]) {
3287         return "/$from/$to/";
3288     } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3289         if (($succeed, $to) = balanced_delim($to) and $succeed) {
3290             return "$from$to";
3291         } else {
3292             for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3293                 return "$from$delim$to$delim" if index($to, $delim) == -1;
3294             }
3295             $to =~ s[/][\\/]g;
3296             return "$from/$to/";
3297         }
3298     } else {
3299         for $delim ('/', '"', '#') { # note no '
3300             return "$delim$from$delim$to$delim"
3301                 if index($to . $from, $delim) == -1;
3302         }
3303         $from =~ s[/][\\/]g;
3304         $to =~ s[/][\\/]g;
3305         return "/$from/$to/";   
3306     }
3307 }
3308
3309 # Only used by tr///, so backslashes hyphens
3310 sub pchr { # ASCII
3311     my($n) = @_;
3312     if ($n == ord '\\') {
3313         return '\\\\';
3314     } elsif ($n == ord "-") {
3315         return "\\-";
3316     } elsif ($n >= ord(' ') and $n <= ord('~')) {
3317         return chr($n);
3318     } elsif ($n == ord "\a") {
3319         return '\\a';
3320     } elsif ($n == ord "\b") {
3321         return '\\b';
3322     } elsif ($n == ord "\t") {
3323         return '\\t';
3324     } elsif ($n == ord "\n") {
3325         return '\\n';
3326     } elsif ($n == ord "\e") {
3327         return '\\e';
3328     } elsif ($n == ord "\f") {
3329         return '\\f';
3330     } elsif ($n == ord "\r") {
3331         return '\\r';
3332     } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3333         return '\\c' . chr(ord("@") + $n);
3334     } else {
3335 #       return '\x' . sprintf("%02x", $n);
3336         return '\\' . sprintf("%03o", $n);
3337     }
3338 }
3339
3340 sub collapse {
3341     my(@chars) = @_;
3342     my($str, $c, $tr) = ("");
3343     for ($c = 0; $c < @chars; $c++) {
3344         $tr = $chars[$c];
3345         $str .= pchr($tr);
3346         if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3347             $chars[$c + 2] == $tr + 2)
3348         {
3349             for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3350               {}
3351             $str .= "-";
3352             $str .= pchr($chars[$c]);
3353         }
3354     }
3355     return $str;
3356 }
3357
3358 sub tr_decode_byte {
3359     my($table, $flags) = @_;
3360     my(@table) = unpack("s*", $table);
3361     splice @table, 0x100, 1;   # Number of subsequent elements
3362     my($c, $tr, @from, @to, @delfrom, $delhyphen);
3363     if ($table[ord "-"] != -1 and 
3364         $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3365     {
3366         $tr = $table[ord "-"];
3367         $table[ord "-"] = -1;
3368         if ($tr >= 0) {
3369             @from = ord("-");
3370             @to = $tr;
3371         } else { # -2 ==> delete
3372             $delhyphen = 1;
3373         }
3374     }
3375     for ($c = 0; $c < @table; $c++) {
3376         $tr = $table[$c];
3377         if ($tr >= 0) {
3378             push @from, $c; push @to, $tr;
3379         } elsif ($tr == -2) {
3380             push @delfrom, $c;
3381         }
3382     }
3383     @from = (@from, @delfrom);
3384     if ($flags & OPpTRANS_COMPLEMENT) {
3385         my @newfrom = ();
3386         my %from;
3387         @from{@from} = (1) x @from;
3388         for ($c = 0; $c < 256; $c++) {
3389             push @newfrom, $c unless $from{$c};
3390         }
3391         @from = @newfrom;
3392     }
3393     unless ($flags & OPpTRANS_DELETE || !@to) {
3394         pop @to while $#to and $to[$#to] == $to[$#to -1];
3395     }
3396     my($from, $to);
3397     $from = collapse(@from);
3398     $to = collapse(@to);
3399     $from .= "-" if $delhyphen;
3400     return ($from, $to);
3401 }
3402
3403 sub tr_chr {
3404     my $x = shift;
3405     if ($x == ord "-") {
3406         return "\\-";
3407     } elsif ($x == ord "\\") {
3408         return "\\\\";
3409     } else {
3410         return chr $x;
3411     }
3412 }
3413
3414 # XXX This doesn't yet handle all cases correctly either
3415
3416 sub tr_decode_utf8 {
3417     my($swash_hv, $flags) = @_;
3418     my %swash = $swash_hv->ARRAY;
3419     my $final = undef;
3420     $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
3421     my $none = $swash{"NONE"}->IV;
3422     my $extra = $none + 1;
3423     my(@from, @delfrom, @to);
3424     my $line;
3425     foreach $line (split /\n/, $swash{'LIST'}->PV) {
3426         my($min, $max, $result) = split(/\t/, $line);
3427         $min = hex $min;
3428         if (length $max) {
3429             $max = hex $max;
3430         } else {
3431             $max = $min;
3432         }
3433         $result = hex $result;
3434         if ($result == $extra) {
3435             push @delfrom, [$min, $max];            
3436         } else {
3437             push @from, [$min, $max];
3438             push @to, [$result, $result + $max - $min];
3439         }
3440     }
3441     for my $i (0 .. $#from) {
3442         if ($from[$i][0] == ord '-') {
3443             unshift @from, splice(@from, $i, 1);
3444             unshift @to, splice(@to, $i, 1);
3445             last;
3446         } elsif ($from[$i][1] == ord '-') {
3447             $from[$i][1]--;
3448             $to[$i][1]--;
3449             unshift @from, ord '-';
3450             unshift @to, ord '-';
3451             last;
3452         }
3453     }
3454     for my $i (0 .. $#delfrom) {
3455         if ($delfrom[$i][0] == ord '-') {
3456             push @delfrom, splice(@delfrom, $i, 1);
3457             last;
3458         } elsif ($delfrom[$i][1] == ord '-') {
3459             $delfrom[$i][1]--;
3460             push @delfrom, ord '-';
3461             last;
3462         }
3463     }
3464     if (defined $final and $to[$#to][1] != $final) {
3465         push @to, [$final, $final];
3466     }
3467     push @from, @delfrom;
3468     if ($flags & OPpTRANS_COMPLEMENT) {
3469         my @newfrom;
3470         my $next = 0;
3471         for my $i (0 .. $#from) {
3472             push @newfrom, [$next, $from[$i][0] - 1];
3473             $next = $from[$i][1] + 1;
3474         }
3475         @from = ();
3476         for my $range (@newfrom) {
3477             if ($range->[0] <= $range->[1]) {
3478                 push @from, $range;
3479             }
3480         }
3481     }
3482     my($from, $to, $diff);
3483     for my $chunk (@from) {
3484         $diff = $chunk->[1] - $chunk->[0];
3485         if ($diff > 1) {
3486             $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3487         } elsif ($diff == 1) {
3488             $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3489         } else {
3490             $from .= tr_chr($chunk->[0]);
3491         }
3492     }
3493     for my $chunk (@to) {
3494         $diff = $chunk->[1] - $chunk->[0];
3495         if ($diff > 1) {
3496             $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3497         } elsif ($diff == 1) {
3498             $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3499         } else {
3500             $to .= tr_chr($chunk->[0]);
3501         }
3502     }
3503     #$final = sprintf("%04x", $final) if defined $final;
3504     #$none = sprintf("%04x", $none) if defined $none;
3505     #$extra = sprintf("%04x", $extra) if defined $extra;    
3506     #print STDERR "final: $final\n none: $none\nextra: $extra\n";
3507     #print STDERR $swash{'LIST'}->PV;
3508     return (escape_str($from), escape_str($to));
3509 }
3510
3511 sub pp_trans {
3512     my $self = shift;
3513     my($op, $cx) = @_;
3514     my($from, $to);
3515     if (class($op) eq "PVOP") {
3516         ($from, $to) = tr_decode_byte($op->pv, $op->private);
3517     } else { # class($op) eq "SVOP"
3518         ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
3519     }
3520     my $flags = "";
3521     $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
3522     $flags .= "d" if $op->private & OPpTRANS_DELETE;
3523     $to = "" if $from eq $to and $flags eq "";
3524     $flags .= "s" if $op->private & OPpTRANS_SQUASH;
3525     return "tr" . double_delim($from, $to) . $flags;
3526 }
3527
3528 # Like dq(), but different
3529 sub re_dq {
3530     my $self = shift;
3531     my ($op, $extended) = @_;
3532
3533     my $type = $op->name;
3534     if ($type eq "const") {
3535         return '$[' if $op->private & OPpCONST_ARYBASE;
3536         my $unbacked = re_unback($self->const_sv($op)->as_string);
3537         return re_uninterp_extended(escape_extended_re($unbacked))
3538             if $extended;
3539         return re_uninterp(escape_str($unbacked));
3540     } elsif ($type eq "concat") {
3541         my $first = $self->re_dq($op->first, $extended);
3542         my $last  = $self->re_dq($op->last,  $extended);
3543
3544         # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3545         ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3546             $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
3547             || ($last =~ /^[{\[\w_]/ &&
3548                 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3549
3550         return $first . $last;
3551     } elsif ($type eq "uc") {
3552         return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
3553     } elsif ($type eq "lc") {
3554         return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
3555     } elsif ($type eq "ucfirst") {
3556         return '\u' . $self->re_dq($op->first->sibling, $extended);
3557     } elsif ($type eq "lcfirst") {
3558         return '\l' . $self->re_dq($op->first->sibling, $extended);
3559     } elsif ($type eq "quotemeta") {
3560         return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
3561     } elsif ($type eq "join") {
3562         return $self->deparse($op->last, 26); # was join($", @ary)
3563     } else {
3564         return $self->deparse($op, 26);
3565     }
3566 }
3567
3568 sub pure_string {
3569     my ($self, $op) = @_;
3570     my $type = $op->name;
3571
3572     if ($type eq 'const') {
3573         return 1;
3574     }
3575     elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
3576         return $self->pure_string($op->first->sibling);
3577     }
3578     elsif ($type eq 'join') {
3579         my $join_op = $op->first->sibling;  # Skip pushmark
3580         return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
3581
3582         my $gvop = $join_op->first;
3583         return 0 unless $gvop->name eq 'gvsv';
3584         return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
3585
3586         return 0 unless ${$join_op->sibling} eq ${$op->last};
3587         return 0 unless $op->last->name =~ /^(rv2|pad)av$/;
3588     }
3589     elsif ($type eq 'concat') {
3590         return $self->pure_string($op->first)
3591             && $self->pure_string($op->last);
3592     }
3593     elsif (is_scalar($op) || $type =~ /^[ah]elem(fast)?$/) {
3594         return 1;
3595     }
3596     else {
3597         return 0;
3598     }
3599
3600     return 1;
3601 }
3602
3603 sub regcomp {
3604     my $self = shift;
3605     my($op, $cx, $extended) = @_;
3606     my $kid = $op->first;
3607     $kid = $kid->first if $kid->name eq "regcmaybe";
3608     $kid = $kid->first if $kid->name eq "regcreset";
3609     return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
3610     return ($self->deparse($kid, $cx), 0);
3611 }
3612
3613 sub pp_regcomp {
3614     my ($self, $op, $cx) = @_;
3615     return (($self->regcomp($op, $cx, 0))[0]);
3616 }
3617
3618 # osmic acid -- see osmium tetroxide
3619
3620 my %matchwords;
3621 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
3622     'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic', 
3623     'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi'); 
3624
3625 sub matchop {
3626     my $self = shift;
3627     my($op, $cx, $name, $delim) = @_;
3628     my $kid = $op->first;
3629     my ($binop, $var, $re) = ("", "", "");
3630     if ($op->flags & OPf_STACKED) {
3631         $binop = 1;
3632         $var = $self->deparse($kid, 20);
3633         $kid = $kid->sibling;
3634     }
3635     my $quote = 1;
3636     my $extended = ($op->pmflags & PMf_EXTENDED);
3637     if (null $kid) {
3638         my $unbacked = re_unback($op->precomp);
3639         if ($extended) {
3640             $re = re_uninterp_extended(escape_extended_re($unbacked));
3641         } else {
3642             $re = re_uninterp(escape_str(re_unback($op->precomp)));
3643         }
3644     } elsif ($kid->name ne 'regcomp') {
3645         carp("found ".$kid->name." where regcomp expected");
3646     } else {
3647         ($re, $quote) = $self->regcomp($kid, 1, $extended);
3648     }
3649     my $flags = "";
3650     $flags .= "c" if $op->pmflags & PMf_CONTINUE;
3651     $flags .= "g" if $op->pmflags & PMf_GLOBAL;
3652     $flags .= "i" if $op->pmflags & PMf_FOLD;
3653     $flags .= "m" if $op->pmflags & PMf_MULTILINE;
3654     $flags .= "o" if $op->pmflags & PMf_KEEP;
3655     $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
3656     $flags .= "x" if $op->pmflags & PMf_EXTENDED;
3657     $flags = $matchwords{$flags} if $matchwords{$flags};
3658     if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
3659         $re =~ s/\?/\\?/g;
3660         $re = "?$re?";
3661     } elsif ($quote) {
3662         $re = single_delim($name, $delim, $re);
3663     }
3664     $re = $re . $flags if $quote;
3665     if ($binop) {
3666         return $self->maybe_parens("$var =~ $re", $cx, 20);
3667     } else {
3668         return $re;
3669     }
3670 }
3671
3672 sub pp_match { matchop(@_, "m", "/") }
3673 sub pp_pushre { matchop(@_, "m", "/") }
3674 sub pp_qr { matchop(@_, "qr", "") }
3675
3676 sub pp_split {
3677     my $self = shift;
3678     my($op, $cx) = @_;
3679     my($kid, @exprs, $ary, $expr);
3680     $kid = $op->first;
3681     # under ithreads pmreplroot is an integer, not an SV
3682     my $replroot = $kid->pmreplroot;
3683     if ( ( ref($replroot) && $$replroot ) ||
3684          ( !ref($replroot) && $replroot ) ) {
3685         $ary = $self->stash_variable('@', $self->gv_name($kid->pmreplroot));
3686     }
3687     for (; !null($kid); $kid = $kid->sibling) {
3688         push @exprs, $self->deparse($kid, 6);
3689     }
3690
3691     # handle special case of split(), and split(" ") that compiles to /\s+/
3692     $kid = $op->first;
3693     if ($kid->flags & OPf_SPECIAL
3694         && $exprs[0] eq '/\\s+/'
3695         && $kid->pmflags & PMf_SKIPWHITE ) {
3696             $exprs[0] = '" "';
3697     }
3698
3699     $expr = "split(" . join(", ", @exprs) . ")";
3700     if ($ary) {
3701         return $self->maybe_parens("$ary = $expr", $cx, 7);
3702     } else {
3703         return $expr;
3704     }
3705 }
3706
3707 # oxime -- any of various compounds obtained chiefly by the action of
3708 # hydroxylamine on aldehydes and ketones and characterized by the
3709 # bivalent grouping C=NOH [Webster's Tenth]
3710
3711 my %substwords;
3712 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
3713     'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
3714     'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
3715     'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
3716
3717 sub pp_subst {
3718     my $self = shift;
3719     my($op, $cx) = @_;
3720     my $kid = $op->first;
3721     my($binop, $var, $re, $repl) = ("", "", "", "");
3722     if ($op->flags & OPf_STACKED) {
3723         $binop = 1;
3724         $var = $self->deparse($kid, 20);
3725         $kid = $kid->sibling;
3726     }
3727     my $flags = "";    
3728     if (null($op->pmreplroot)) {
3729         $repl = $self->dq($kid);
3730         $kid = $kid->sibling;
3731     } else {
3732         $repl = $op->pmreplroot->first; # skip substcont
3733         while ($repl->name eq "entereval") {
3734             $repl = $repl->first;
3735             $flags .= "e";
3736         }
3737         if ($op->pmflags & PMf_EVAL) {
3738             $repl = $self->deparse($repl, 0);
3739         } else {
3740             $repl = $self->dq($repl);   
3741         }
3742     }
3743     my $extended = ($op->pmflags & PMf_EXTENDED);
3744     if (null $kid) {
3745         my $unbacked = re_unback($op->precomp);
3746         if ($extended) {
3747             $re = re_uninterp_extended(escape_extended_re($unbacked));
3748         }
3749         else {
3750             $re = re_uninterp(escape_str($unbacked));
3751         }
3752     } else {
3753         ($re) = $self->regcomp($kid, 1, $extended);
3754     }
3755     $flags .= "e" if $op->pmflags & PMf_EVAL;
3756     $flags .= "g" if $op->pmflags & PMf_GLOBAL;
3757     $flags .= "i" if $op->pmflags & PMf_FOLD;
3758     $flags .= "m" if $op->pmflags & PMf_MULTILINE;
3759     $flags .= "o" if $op->pmflags & PMf_KEEP;
3760     $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
3761     $flags .= "x" if $extended;
3762     $flags = $substwords{$flags} if $substwords{$flags};
3763     if ($binop) {
3764         return $self->maybe_parens("$var =~ s"
3765                                    . double_delim($re, $repl) . $flags,
3766                                    $cx, 20);
3767     } else {
3768         return "s". double_delim($re, $repl) . $flags;  
3769     }
3770 }
3771
3772 1;
3773 __END__
3774
3775 =head1 NAME
3776
3777 B::Deparse - Perl compiler backend to produce perl code
3778
3779 =head1 SYNOPSIS
3780
3781 B<perl> B<-MO=Deparse>[B<,-u>I<PACKAGE>][B<,-p>][B<,-q>][B<,-l>]
3782         [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
3783
3784 =head1 DESCRIPTION
3785
3786 B::Deparse is a backend module for the Perl compiler that generates
3787 perl source code, based on the internal compiled structure that perl
3788 itself creates after parsing a program. The output of B::Deparse won't
3789 be exactly the same as the original source, since perl doesn't keep
3790 track of comments or whitespace, and there isn't a one-to-one
3791 correspondence between perl's syntactical constructions and their
3792 compiled form, but it will often be close. When you use the B<-p>
3793 option, the output also includes parentheses even when they are not
3794 required by precedence, which can make it easy to see if perl is
3795 parsing your expressions the way you intended.
3796
3797 Please note that this module is mainly new and untested code and is
3798 still under development, so it may change in the future.
3799
3800 =head1 OPTIONS
3801
3802 As with all compiler backend options, these must follow directly after
3803 the '-MO=Deparse', separated by a comma but not any white space.
3804
3805 =over 4
3806
3807 =item B<-l>
3808
3809 Add '#line' declarations to the output based on the line and file
3810 locations of the original code.
3811
3812 =item B<-p>
3813
3814 Print extra parentheses. Without this option, B::Deparse includes
3815 parentheses in its output only when they are needed, based on the
3816 structure of your program. With B<-p>, it uses parentheses (almost)
3817 whenever they would be legal. This can be useful if you are used to
3818 LISP, or if you want to see how perl parses your input. If you say
3819
3820     if ($var & 0x7f == 65) {print "Gimme an A!"} 
3821     print ($which ? $a : $b), "\n";
3822     $name = $ENV{USER} or "Bob";
3823
3824 C<B::Deparse,-p> will print
3825
3826     if (($var & 0)) {
3827         print('Gimme an A!')
3828     };
3829     (print(($which ? $a : $b)), '???');
3830     (($name = $ENV{'USER'}) or '???')
3831
3832 which probably isn't what you intended (the C<'???'> is a sign that
3833 perl optimized away a constant value).
3834
3835 =item B<-P>
3836
3837 Disable prototype checking. With this option, all function calls are
3838 deparsed as if no prototype was defined for them. In other words,
3839
3840     perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
3841
3842 will print
3843
3844     sub foo (\@) {
3845         1;
3846     }
3847     &foo(\@x);
3848
3849 making clear how the parameters are actually passed to C<foo>.
3850
3851 =item B<-q>
3852
3853 Expand double-quoted strings into the corresponding combinations of
3854 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
3855 instance, print
3856
3857     print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
3858
3859 as
3860
3861     print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
3862           . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
3863
3864 Note that the expanded form represents the way perl handles such
3865 constructions internally -- this option actually turns off the reverse
3866 translation that B::Deparse usually does. On the other hand, note that
3867 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
3868 of $y into a string before doing the assignment.
3869
3870 =item B<-f>I<FILE>
3871
3872 Normally, B::Deparse deparses the main code of a program, and all the subs
3873 defined in the same file. To include subs defined in other files, pass the
3874 B<-f> option with the filename. You can pass the B<-f> option several times, to
3875 include more than one secondary file.  (Most of the time you don't want to
3876 use it at all.)  You can also use this option to include subs which are
3877 defined in the scope of a B<#line> directive with two parameters.
3878
3879 =item B<-s>I<LETTERS>
3880
3881 Tweak the style of B::Deparse's output. The letters should follow
3882 directly after the 's', with no space or punctuation. The following
3883 options are available:
3884
3885 =over 4
3886
3887 =item B<C>
3888
3889 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
3890
3891     if (...) {
3892          ...
3893     } else {
3894          ...
3895     }
3896
3897 instead of
3898
3899     if (...) {
3900          ...
3901     }
3902     else {
3903          ...
3904     }
3905
3906 The default is not to cuddle.
3907
3908 =item B<i>I<NUMBER>
3909
3910 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
3911
3912 =item B<T>
3913
3914 Use tabs for each 8 columns of indent. The default is to use only spaces.
3915 For instance, if the style options are B<-si4T>, a line that's indented
3916 3 times will be preceded by one tab and four spaces; if the options were
3917 B<-si8T>, the same line would be preceded by three tabs.
3918
3919 =item B<v>I<STRING>B<.>
3920
3921 Print I<STRING> for the value of a constant that can't be determined
3922 because it was optimized away (mnemonic: this happens when a constant
3923 is used in B<v>oid context). The end of the string is marked by a period.
3924 The string should be a valid perl expression, generally a constant.
3925 Note that unless it's a number, it probably needs to be quoted, and on
3926 a command line quotes need to be protected from the shell. Some
3927 conventional values include 0, 1, 42, '', 'foo', and
3928 'Useless use of constant omitted' (which may need to be
3929 B<-sv"'Useless use of constant omitted'.">
3930 or something similar depending on your shell). The default is '???'.
3931 If you're using B::Deparse on a module or other file that's require'd,
3932 you shouldn't use a value that evaluates to false, since the customary
3933 true constant at the end of a module will be in void context when the
3934 file is compiled as a main program.
3935
3936 =back
3937
3938 =item B<-x>I<LEVEL>
3939
3940 Expand conventional syntax constructions into equivalent ones that expose
3941 their internal operation. I<LEVEL> should be a digit, with higher values
3942 meaning more expansion. As with B<-q>, this actually involves turning off
3943 special cases in B::Deparse's normal operations.
3944
3945 If I<LEVEL> is at least 3, for loops will be translated into equivalent
3946 while loops with continue blocks; for instance
3947
3948     for ($i = 0; $i < 10; ++$i) {
3949         print $i;
3950     }
3951
3952 turns into
3953
3954     $i = 0;
3955     while ($i < 10) {
3956         print $i;
3957     } continue {
3958         ++$i
3959     }
3960
3961 Note that in a few cases this translation can't be perfectly carried back
3962 into the source code -- if the loop's initializer declares a my variable,
3963 for instance, it won't have the correct scope outside of the loop.
3964
3965 If I<LEVEL> is at least 7, if statements will be translated into equivalent
3966 expressions using C<&&>, C<?:> and C<do {}>; for instance
3967
3968     print 'hi' if $nice;
3969     if ($nice) {
3970         print 'hi';
3971     }
3972     if ($nice) {
3973         print 'hi';
3974     } else {
3975         print 'bye';
3976     }
3977
3978 turns into
3979
3980     $nice and print 'hi';
3981     $nice and do { print 'hi' };
3982     $nice ? do { print 'hi' } : do { print 'bye' };
3983
3984 Long sequences of elsifs will turn into nested ternary operators, which
3985 B::Deparse doesn't know how to indent nicely.
3986
3987 =back
3988
3989 =head1 USING B::Deparse AS A MODULE
3990
3991 =head2 Synopsis
3992
3993     use B::Deparse;
3994     $deparse = B::Deparse->new("-p", "-sC");
3995     $body = $deparse->coderef2text(\&func);
3996     eval "sub func $body"; # the inverse operation
3997
3998 =head2 Description
3999
4000 B::Deparse can also be used on a sub-by-sub basis from other perl
4001 programs.
4002
4003 =head2 new
4004
4005     $deparse = B::Deparse->new(OPTIONS)
4006
4007 Create an object to store the state of a deparsing operation and any
4008 options. The options are the same as those that can be given on the
4009 command line (see L</OPTIONS>); options that are separated by commas
4010 after B<-MO=Deparse> should be given as separate strings. Some
4011 options, like B<-u>, don't make sense for a single subroutine, so
4012 don't pass them.
4013
4014 =head2 ambient_pragmas
4015
4016     $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
4017
4018 The compilation of a subroutine can be affected by a few compiler
4019 directives, B<pragmas>. These are:
4020
4021 =over 4
4022
4023 =item *
4024
4025 use strict;
4026
4027 =item *
4028
4029 use warnings;
4030
4031 =item *
4032
4033 Assigning to the special variable $[
4034
4035 =item *
4036
4037 use integer;
4038
4039 =item *
4040
4041 use bytes;
4042
4043 =item *
4044
4045 use utf8;
4046
4047 =item *
4048
4049 use re;
4050
4051 =back
4052
4053 Ordinarily, if you use B::Deparse on a subroutine which has
4054 been compiled in the presence of one or more of these pragmas,
4055 the output will include statements to turn on the appropriate
4056 directives. So if you then compile the code returned by coderef2text, 
4057 it will behave the same way as the subroutine which you deparsed.
4058
4059 However, you may know that you intend to use the results in a
4060 particular context, where some pragmas are already in scope. In
4061 this case, you use the B<ambient_pragmas> method to describe the
4062 assumptions you wish to make.
4063
4064 Not all of the options currently have any useful effect. See
4065 L</BUGS> for more details.
4066
4067 The parameters it accepts are:
4068
4069 =over 4
4070
4071 =item strict
4072
4073 Takes a string, possibly containing several values separated
4074 by whitespace. The special values "all" and "none" mean what you'd
4075 expect.
4076
4077     $deparse->ambient_pragmas(strict => 'subs refs');
4078
4079 =item $[
4080
4081 Takes a number, the value of the array base $[.
4082
4083 =item bytes
4084
4085 =item utf8
4086
4087 =item integer
4088
4089 If the value is true, then the appropriate pragma is assumed to
4090 be in the ambient scope, otherwise not.
4091
4092 =item re
4093
4094 Takes a string, possibly containing a whitespace-separated list of
4095 values. The values "all" and "none" are special. It's also permissible
4096 to pass an array reference here.
4097
4098     $deparser->ambient_pragmas(re => 'eval');
4099
4100
4101 =item warnings
4102
4103 Takes a string, possibly containing a whitespace-separated list of
4104 values. The values "all" and "none" are special, again. It's also
4105 permissible to pass an array reference here.
4106
4107     $deparser->ambient_pragmas(warnings => [qw[void io]]);
4108
4109 If one of the values is the string "FATAL", then all the warnings
4110 in that list will be considered fatal, just as with the B<warnings>
4111 pragma itself. Should you need to specify that some warnings are
4112 fatal, and others are merely enabled, you can pass the B<warnings>
4113 parameter twice:
4114
4115     $deparser->ambient_pragmas(
4116         warnings => 'all',
4117         warnings => [FATAL => qw/void io/],
4118     );
4119
4120 See L<perllexwarn> for more information about lexical warnings. 
4121
4122 =item hint_bits
4123
4124 =item warning_bits
4125
4126 These two parameters are used to specify the ambient pragmas in
4127 the format used by the special variables $^H and ${^WARNING_BITS}.
4128
4129 They exist principally so that you can write code like:
4130
4131     { my ($hint_bits, $warning_bits);
4132     BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
4133     $deparser->ambient_pragmas (
4134         hint_bits    => $hint_bits,
4135         warning_bits => $warning_bits,
4136         '$['         => 0 + $[
4137     ); }
4138
4139 which specifies that the ambient pragmas are exactly those which
4140 are in scope at the point of calling.
4141
4142 =back
4143
4144 =head2 coderef2text
4145
4146     $body = $deparse->coderef2text(\&func)
4147     $body = $deparse->coderef2text(sub ($$) { ... })
4148
4149 Return source code for the body of a subroutine (a block, optionally
4150 preceded by a prototype in parens), given a reference to the
4151 sub. Because a subroutine can have no names, or more than one name,
4152 this method doesn't return a complete subroutine definition -- if you
4153 want to eval the result, you should prepend "sub subname ", or "sub "
4154 for an anonymous function constructor. Unless the sub was defined in
4155 the main:: package, the code will include a package declaration.
4156
4157 =head1 BUGS
4158
4159 =over 4
4160
4161 =item *
4162
4163 The only pragmas to be completely supported are: C<use warnings>,
4164 C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
4165 behaves like a pragma, is also supported.)
4166
4167 Excepting those listed above, we're currently unable to guarantee that
4168 B::Deparse will produce a pragma at the correct point in the program.
4169 Since the effects of pragmas are often lexically scoped, this can mean
4170 that the pragma holds sway over a different portion of the program
4171 than in the input file.
4172
4173 =item *
4174
4175 In fact, the above is a specific instance of a more general problem:
4176 we can't guarantee to produce BEGIN blocks or C<use> declarations in
4177 exactly the right place. So if you use a module which affects compilation
4178 (such as by over-riding keywords, overloading constants or whatever)
4179 then the output code might not work as intended.
4180
4181 This is the most serious outstanding problem, and will be very hard
4182 to fix.
4183
4184 =item *
4185
4186 If a keyword is over-ridden, and your program explicitly calls
4187 the built-in version by using CORE::keyword, the output of B::Deparse
4188 will not reflect this. If you run the resulting code, it will call
4189 the over-ridden version rather than the built-in one. (Maybe there
4190 should be an option to B<always> print keyword calls as C<CORE::name>.)
4191
4192 =item *
4193
4194 C<sort foo (1, 2, 3)> comes out as C<sort (foo 1, 2, 3)>, which
4195 causes perl to issue a warning.
4196
4197 The obvious fix doesn't work, because these are different:
4198
4199     print (FOO 1, 2, 3), 4, 5, 6;
4200     print FOO (1, 2, 3), 4, 5, 6;
4201
4202 =item *
4203
4204 Constants (other than simple strings or numbers) don't work properly.
4205 Pathological examples that fail (and probably always will) include:
4206
4207     use constant E2BIG => ($!=7);
4208     use constant x=>\$x; print x
4209
4210 The following could (and should) be made to work:
4211
4212     use constant regex => qr/blah/;
4213     print regex;
4214
4215 =item *
4216
4217 An input file that uses source filtering probably won't be deparsed into
4218 runnable code, because it will still include the B<use> declaration
4219 for the source filtering module, even though the code that is
4220 produced is already ordinary Perl which shouldn't be filtered again.
4221
4222 =item *
4223
4224 There are probably many more bugs on non-ASCII platforms (EBCDIC).
4225
4226 =back
4227
4228 =head1 AUTHOR
4229
4230 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier
4231 version by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with
4232 contributions from Gisle Aas, James Duncan, Albert Dvornik, Robin
4233 Houston, Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons,
4234 and Rafael Garcia-Suarez.
4235
4236 =cut