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