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