3bfd0ce8013cd9a26490f15767048afbb9328598
[p5sagit/p5-mst-13.2.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, $cv) = @_;
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 = shift;
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     return $pre . join(", ", @exprs) . $post;
1770 }
1771
1772 sub pp_anonlist {
1773     my ($self, $op) = @_;
1774     if ($op->flags & OPf_SPECIAL) {
1775         return $self->anon_hash_or_list($op);
1776     }
1777     warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
1778     return 'XXX';
1779 }
1780
1781 *pp_anonhash = \&pp_anonlist;
1782
1783 sub pp_refgen {
1784     my $self = shift;   
1785     my($op, $cx) = @_;
1786     my $kid = $op->first;
1787     if ($kid->name eq "null") {
1788         $kid = $kid->first;
1789         if ($kid->name eq "anonlist" || $kid->name eq "anonhash") {
1790             return $self->anon_hash_or_list($op);
1791         } elsif (!null($kid->sibling) and
1792                  $kid->sibling->name eq "anoncode") {
1793             return "sub " .
1794                 $self->deparse_sub($self->padval($kid->sibling->targ));
1795         } elsif ($kid->name eq "pushmark") {
1796             my $sib_name = $kid->sibling->name;
1797             if ($sib_name =~ /^(pad|rv2)[ah]v$/
1798                 and not $kid->sibling->flags & OPf_REF)
1799             {
1800                 # The @a in \(@a) isn't in ref context, but only when the
1801                 # parens are there.
1802                 return "\\(" . $self->pp_list($op->first) . ")";
1803             } elsif ($sib_name eq 'entersub') {
1804                 my $text = $self->deparse($kid->sibling, 1);
1805                 # Always show parens for \(&func()), but only with -p otherwise
1806                 $text = "($text)" if $self->{'parens'}
1807                                  or $kid->sibling->private & OPpENTERSUB_AMPER;
1808                 return "\\$text";
1809             }
1810         }
1811     }
1812     $self->pfixop($op, $cx, "\\", 20);
1813 }
1814
1815 sub pp_srefgen { pp_refgen(@_) }
1816
1817 sub pp_readline {
1818     my $self = shift;
1819     my($op, $cx) = @_;
1820     my $kid = $op->first;
1821     $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
1822     return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid);
1823     return $self->unop($op, $cx, "readline");
1824 }
1825
1826 sub pp_rcatline {
1827     my $self = shift;
1828     my($op) = @_;
1829     return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
1830 }
1831
1832 # Unary operators that can occur as pseudo-listops inside double quotes
1833 sub dq_unop {
1834     my $self = shift;
1835     my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
1836     my $kid;
1837     if ($op->flags & OPf_KIDS) {
1838        $kid = $op->first;
1839        # If there's more than one kid, the first is an ex-pushmark.
1840        $kid = $kid->sibling if not null $kid->sibling;
1841        return $self->maybe_parens_unop($name, $kid, $cx);
1842     } else {
1843        return $name .  ($op->flags & OPf_SPECIAL ? "()" : "");
1844     }
1845 }
1846
1847 sub pp_ucfirst { dq_unop(@_, "ucfirst") }
1848 sub pp_lcfirst { dq_unop(@_, "lcfirst") }
1849 sub pp_uc { dq_unop(@_, "uc") }
1850 sub pp_lc { dq_unop(@_, "lc") }
1851 sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
1852
1853 sub loopex {
1854     my $self = shift;
1855     my ($op, $cx, $name) = @_;
1856     if (class($op) eq "PVOP") {
1857         return "$name " . $op->pv;
1858     } elsif (class($op) eq "OP") {
1859         return $name;
1860     } elsif (class($op) eq "UNOP") {
1861         # Note -- loop exits are actually exempt from the
1862         # looks-like-a-func rule, but a few extra parens won't hurt
1863         return $self->maybe_parens_unop($name, $op->first, $cx);
1864     }
1865 }
1866
1867 sub pp_last { loopex(@_, "last") }
1868 sub pp_next { loopex(@_, "next") }
1869 sub pp_redo { loopex(@_, "redo") }
1870 sub pp_goto { loopex(@_, "goto") }
1871 sub pp_dump { loopex(@_, "dump") }
1872
1873 sub ftst {
1874     my $self = shift;
1875     my($op, $cx, $name) = @_;
1876     if (class($op) eq "UNOP") {
1877         # Genuine `-X' filetests are exempt from the LLAFR, but not
1878         # l?stat(); for the sake of clarity, give'em all parens
1879         return $self->maybe_parens_unop($name, $op->first, $cx);
1880     } elsif (class($op) =~ /^(SV|PAD)OP$/) {
1881         return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
1882     } else { # I don't think baseop filetests ever survive ck_ftst, but...
1883         return $name;
1884     }
1885 }
1886
1887 sub pp_lstat    { ftst(@_, "lstat") }
1888 sub pp_stat     { ftst(@_, "stat") }
1889 sub pp_ftrread  { ftst(@_, "-R") }
1890 sub pp_ftrwrite { ftst(@_, "-W") }
1891 sub pp_ftrexec  { ftst(@_, "-X") }
1892 sub pp_fteread  { ftst(@_, "-r") }
1893 sub pp_ftewrite { ftst(@_, "-w") }
1894 sub pp_fteexec  { ftst(@_, "-x") }
1895 sub pp_ftis     { ftst(@_, "-e") }
1896 sub pp_fteowned { ftst(@_, "-O") }
1897 sub pp_ftrowned { ftst(@_, "-o") }
1898 sub pp_ftzero   { ftst(@_, "-z") }
1899 sub pp_ftsize   { ftst(@_, "-s") }
1900 sub pp_ftmtime  { ftst(@_, "-M") }
1901 sub pp_ftatime  { ftst(@_, "-A") }
1902 sub pp_ftctime  { ftst(@_, "-C") }
1903 sub pp_ftsock   { ftst(@_, "-S") }
1904 sub pp_ftchr    { ftst(@_, "-c") }
1905 sub pp_ftblk    { ftst(@_, "-b") }
1906 sub pp_ftfile   { ftst(@_, "-f") }
1907 sub pp_ftdir    { ftst(@_, "-d") }
1908 sub pp_ftpipe   { ftst(@_, "-p") }
1909 sub pp_ftlink   { ftst(@_, "-l") }
1910 sub pp_ftsuid   { ftst(@_, "-u") }
1911 sub pp_ftsgid   { ftst(@_, "-g") }
1912 sub pp_ftsvtx   { ftst(@_, "-k") }
1913 sub pp_fttty    { ftst(@_, "-t") }
1914 sub pp_fttext   { ftst(@_, "-T") }
1915 sub pp_ftbinary { ftst(@_, "-B") }
1916
1917 sub SWAP_CHILDREN () { 1 }
1918 sub ASSIGN () { 2 } # has OP= variant
1919 sub LIST_CONTEXT () { 4 } # Assignment is in list context
1920
1921 my(%left, %right);
1922
1923 sub assoc_class {
1924     my $op = shift;
1925     my $name = $op->name;
1926     if ($name eq "concat" and $op->first->name eq "concat") {
1927         # avoid spurious `=' -- see comment in pp_concat
1928         return "concat";
1929     }
1930     if ($name eq "null" and class($op) eq "UNOP"
1931         and $op->first->name =~ /^(and|x?or)$/
1932         and null $op->first->sibling)
1933     {
1934         # Like all conditional constructs, OP_ANDs and OP_ORs are topped
1935         # with a null that's used as the common end point of the two
1936         # flows of control. For precedence purposes, ignore it.
1937         # (COND_EXPRs have these too, but we don't bother with
1938         # their associativity).
1939         return assoc_class($op->first);
1940     }
1941     return $name . ($op->flags & OPf_STACKED ? "=" : "");
1942 }
1943
1944 # Left associative operators, like `+', for which
1945 # $a + $b + $c is equivalent to ($a + $b) + $c
1946
1947 BEGIN {
1948     %left = ('multiply' => 19, 'i_multiply' => 19,
1949              'divide' => 19, 'i_divide' => 19,
1950              'modulo' => 19, 'i_modulo' => 19,
1951              'repeat' => 19,
1952              'add' => 18, 'i_add' => 18,
1953              'subtract' => 18, 'i_subtract' => 18,
1954              'concat' => 18,
1955              'left_shift' => 17, 'right_shift' => 17,
1956              'bit_and' => 13,
1957              'bit_or' => 12, 'bit_xor' => 12,
1958              'and' => 3,
1959              'or' => 2, 'xor' => 2,
1960             );
1961 }
1962
1963 sub deparse_binop_left {
1964     my $self = shift;
1965     my($op, $left, $prec) = @_;
1966     if ($left{assoc_class($op)} && $left{assoc_class($left)}
1967         and $left{assoc_class($op)} == $left{assoc_class($left)})
1968     {
1969         return $self->deparse($left, $prec - .00001);
1970     } else {
1971         return $self->deparse($left, $prec);    
1972     }
1973 }
1974
1975 # Right associative operators, like `=', for which
1976 # $a = $b = $c is equivalent to $a = ($b = $c)
1977
1978 BEGIN {
1979     %right = ('pow' => 22,
1980               'sassign=' => 7, 'aassign=' => 7,
1981               'multiply=' => 7, 'i_multiply=' => 7,
1982               'divide=' => 7, 'i_divide=' => 7,
1983               'modulo=' => 7, 'i_modulo=' => 7,
1984               'repeat=' => 7,
1985               'add=' => 7, 'i_add=' => 7,
1986               'subtract=' => 7, 'i_subtract=' => 7,
1987               'concat=' => 7,
1988               'left_shift=' => 7, 'right_shift=' => 7,
1989               'bit_and=' => 7,
1990               'bit_or=' => 7, 'bit_xor=' => 7,
1991               'andassign' => 7,
1992               'orassign' => 7,
1993              );
1994 }
1995
1996 sub deparse_binop_right {
1997     my $self = shift;
1998     my($op, $right, $prec) = @_;
1999     if ($right{assoc_class($op)} && $right{assoc_class($right)}
2000         and $right{assoc_class($op)} == $right{assoc_class($right)})
2001     {
2002         return $self->deparse($right, $prec - .00001);
2003     } else {
2004         return $self->deparse($right, $prec);   
2005     }
2006 }
2007
2008 sub binop {
2009     my $self = shift;
2010     my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
2011     my $left = $op->first;
2012     my $right = $op->last;
2013     my $eq = "";
2014     if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
2015         $eq = "=";
2016         $prec = 7;
2017     }
2018     if ($flags & SWAP_CHILDREN) {
2019         ($left, $right) = ($right, $left);
2020     }
2021     $left = $self->deparse_binop_left($op, $left, $prec);
2022     $left = "($left)" if $flags & LIST_CONTEXT
2023                 && $left !~ /^(my|our|local|)[\@\(]/;
2024     $right = $self->deparse_binop_right($op, $right, $prec);
2025     return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
2026 }
2027
2028 sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2029 sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2030 sub pp_subtract { maybe_targmy(@_, \&binop, "-",18,  ASSIGN) }
2031 sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2032 sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2033 sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2034 sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2035 sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
2036 sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2037 sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2038 sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
2039
2040 sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
2041 sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
2042 sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
2043 sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
2044 sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
2045
2046 sub pp_eq { binop(@_, "==", 14) }
2047 sub pp_ne { binop(@_, "!=", 14) }
2048 sub pp_lt { binop(@_, "<", 15) }
2049 sub pp_gt { binop(@_, ">", 15) }
2050 sub pp_ge { binop(@_, ">=", 15) }
2051 sub pp_le { binop(@_, "<=", 15) }
2052 sub pp_ncmp { binop(@_, "<=>", 14) }
2053 sub pp_i_eq { binop(@_, "==", 14) }
2054 sub pp_i_ne { binop(@_, "!=", 14) }
2055 sub pp_i_lt { binop(@_, "<", 15) }
2056 sub pp_i_gt { binop(@_, ">", 15) }
2057 sub pp_i_ge { binop(@_, ">=", 15) }
2058 sub pp_i_le { binop(@_, "<=", 15) }
2059 sub pp_i_ncmp { binop(@_, "<=>", 14) }
2060
2061 sub pp_seq { binop(@_, "eq", 14) }
2062 sub pp_sne { binop(@_, "ne", 14) }
2063 sub pp_slt { binop(@_, "lt", 15) }
2064 sub pp_sgt { binop(@_, "gt", 15) }
2065 sub pp_sge { binop(@_, "ge", 15) }
2066 sub pp_sle { binop(@_, "le", 15) }
2067 sub pp_scmp { binop(@_, "cmp", 14) }
2068
2069 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
2070 sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
2071
2072 sub pp_smartmatch {
2073     my ($self, $op, $cx) = @_;
2074     if ($op->flags & OPf_SPECIAL) {
2075         return $self->deparse($op->first, $cx);
2076     }
2077     else {
2078         binop(@_, "~~", 14);
2079     }
2080 }
2081
2082 # `.' is special because concats-of-concats are optimized to save copying
2083 # by making all but the first concat stacked. The effect is as if the
2084 # programmer had written `($a . $b) .= $c', except legal.
2085 sub pp_concat { maybe_targmy(@_, \&real_concat) }
2086 sub real_concat {
2087     my $self = shift;
2088     my($op, $cx) = @_;
2089     my $left = $op->first;
2090     my $right = $op->last;
2091     my $eq = "";
2092     my $prec = 18;
2093     if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
2094         $eq = "=";
2095         $prec = 7;
2096     }
2097     $left = $self->deparse_binop_left($op, $left, $prec);
2098     $right = $self->deparse_binop_right($op, $right, $prec);
2099     return $self->maybe_parens("$left .$eq $right", $cx, $prec);
2100 }
2101
2102 # `x' is weird when the left arg is a list
2103 sub pp_repeat {
2104     my $self = shift;
2105     my($op, $cx) = @_;
2106     my $left = $op->first;
2107     my $right = $op->last;
2108     my $eq = "";
2109     my $prec = 19;
2110     if ($op->flags & OPf_STACKED) {
2111         $eq = "=";
2112         $prec = 7;
2113     }
2114     if (null($right)) { # list repeat; count is inside left-side ex-list
2115         my $kid = $left->first->sibling; # skip pushmark
2116         my @exprs;
2117         for (; !null($kid->sibling); $kid = $kid->sibling) {
2118             push @exprs, $self->deparse($kid, 6);
2119         }
2120         $right = $kid;
2121         $left = "(" . join(", ", @exprs). ")";
2122     } else {
2123         $left = $self->deparse_binop_left($op, $left, $prec);
2124     }
2125     $right = $self->deparse_binop_right($op, $right, $prec);
2126     return $self->maybe_parens("$left x$eq $right", $cx, $prec);
2127 }
2128
2129 sub range {
2130     my $self = shift;
2131     my ($op, $cx, $type) = @_;
2132     my $left = $op->first;
2133     my $right = $left->sibling;
2134     $left = $self->deparse($left, 9);
2135     $right = $self->deparse($right, 9);
2136     return $self->maybe_parens("$left $type $right", $cx, 9);
2137 }
2138
2139 sub pp_flop {
2140     my $self = shift;
2141     my($op, $cx) = @_;
2142     my $flip = $op->first;
2143     my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
2144     return $self->range($flip->first, $cx, $type);
2145 }
2146
2147 # one-line while/until is handled in pp_leave
2148
2149 sub logop {
2150     my $self = shift;
2151     my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
2152     my $left = $op->first;
2153     my $right = $op->first->sibling;
2154     if ($cx < 1 and is_scope($right) and $blockname
2155         and $self->{'expand'} < 7)
2156     { # if ($a) {$b}
2157         $left = $self->deparse($left, 1);
2158         $right = $self->deparse($right, 0);
2159         return "$blockname ($left) {\n\t$right\n\b}\cK";
2160     } elsif ($cx < 1 and $blockname and not $self->{'parens'}
2161              and $self->{'expand'} < 7) { # $b if $a
2162         $right = $self->deparse($right, 1);
2163         $left = $self->deparse($left, 1);
2164         return "$right $blockname $left";
2165     } elsif ($cx > $lowprec and $highop) { # $a && $b
2166         $left = $self->deparse_binop_left($op, $left, $highprec);
2167         $right = $self->deparse_binop_right($op, $right, $highprec);
2168         return $self->maybe_parens("$left $highop $right", $cx, $highprec);
2169     } else { # $a and $b
2170         $left = $self->deparse_binop_left($op, $left, $lowprec);
2171         $right = $self->deparse_binop_right($op, $right, $lowprec);
2172         return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
2173     }
2174 }
2175
2176 sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
2177 sub pp_or  { logop(@_, "or",  2, "||", 10, "unless") }
2178 sub pp_dor { logop(@_, "err", 2, "//", 10, "") }
2179
2180 # xor is syntactically a logop, but it's really a binop (contrary to
2181 # old versions of opcode.pl). Syntax is what matters here.
2182 sub pp_xor { logop(@_, "xor", 2, "",   0,  "") }
2183
2184 sub logassignop {
2185     my $self = shift;
2186     my ($op, $cx, $opname) = @_;
2187     my $left = $op->first;
2188     my $right = $op->first->sibling->first; # skip sassign
2189     $left = $self->deparse($left, 7);
2190     $right = $self->deparse($right, 7);
2191     return $self->maybe_parens("$left $opname $right", $cx, 7);
2192 }
2193
2194 sub pp_andassign { logassignop(@_, "&&=") }
2195 sub pp_orassign  { logassignop(@_, "||=") }
2196 sub pp_dorassign { logassignop(@_, "//=") }
2197
2198 sub listop {
2199     my $self = shift;
2200     my($op, $cx, $name) = @_;
2201     my(@exprs);
2202     my $parens = ($cx >= 5) || $self->{'parens'};
2203     my $kid = $op->first->sibling;
2204     return $name if null $kid;
2205     my $first;
2206     $name = "socketpair" if $name eq "sockpair";
2207     my $proto = prototype("CORE::$name");
2208     if (defined $proto
2209         && $proto =~ /^;?\*/
2210         && $kid->name eq "rv2gv") {
2211         $first = $self->deparse($kid->first, 6);
2212     }
2213     else {
2214         $first = $self->deparse($kid, 6);
2215     }
2216     if ($name eq "chmod" && $first =~ /^\d+$/) {
2217         $first = sprintf("%#o", $first);
2218     }
2219     $first = "+$first" if not $parens and substr($first, 0, 1) eq "(";
2220     push @exprs, $first;
2221     $kid = $kid->sibling;
2222     if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv") {
2223         push @exprs, $self->deparse($kid->first, 6);
2224         $kid = $kid->sibling;
2225     }
2226     for (; !null($kid); $kid = $kid->sibling) {
2227         push @exprs, $self->deparse($kid, 6);
2228     }
2229     if ($parens) {
2230         return "$name(" . join(", ", @exprs) . ")";
2231     } else {
2232         return "$name " . join(", ", @exprs);
2233     }
2234 }
2235
2236 sub pp_bless { listop(@_, "bless") }
2237 sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
2238 sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
2239 sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
2240 sub pp_index { maybe_targmy(@_, \&listop, "index") }
2241 sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
2242 sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
2243 sub pp_formline { listop(@_, "formline") } # see also deparse_format
2244 sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
2245 sub pp_unpack { listop(@_, "unpack") }
2246 sub pp_pack { listop(@_, "pack") }
2247 sub pp_join { maybe_targmy(@_, \&listop, "join") }
2248 sub pp_splice { listop(@_, "splice") }
2249 sub pp_push { maybe_targmy(@_, \&listop, "push") }
2250 sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
2251 sub pp_reverse { listop(@_, "reverse") }
2252 sub pp_warn { listop(@_, "warn") }
2253 sub pp_die { listop(@_, "die") }
2254 # Actually, return is exempt from the LLAFR (see examples in this very
2255 # module!), but for consistency's sake, ignore that fact
2256 sub pp_return { listop(@_, "return") }
2257 sub pp_open { listop(@_, "open") }
2258 sub pp_pipe_op { listop(@_, "pipe") }
2259 sub pp_tie { listop(@_, "tie") }
2260 sub pp_binmode { listop(@_, "binmode") }
2261 sub pp_dbmopen { listop(@_, "dbmopen") }
2262 sub pp_sselect { listop(@_, "select") }
2263 sub pp_select { listop(@_, "select") }
2264 sub pp_read { listop(@_, "read") }
2265 sub pp_sysopen { listop(@_, "sysopen") }
2266 sub pp_sysseek { listop(@_, "sysseek") }
2267 sub pp_sysread { listop(@_, "sysread") }
2268 sub pp_syswrite { listop(@_, "syswrite") }
2269 sub pp_send { listop(@_, "send") }
2270 sub pp_recv { listop(@_, "recv") }
2271 sub pp_seek { listop(@_, "seek") }
2272 sub pp_fcntl { listop(@_, "fcntl") }
2273 sub pp_ioctl { listop(@_, "ioctl") }
2274 sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
2275 sub pp_socket { listop(@_, "socket") }
2276 sub pp_sockpair { listop(@_, "sockpair") }
2277 sub pp_bind { listop(@_, "bind") }
2278 sub pp_connect { listop(@_, "connect") }
2279 sub pp_listen { listop(@_, "listen") }
2280 sub pp_accept { listop(@_, "accept") }
2281 sub pp_shutdown { listop(@_, "shutdown") }
2282 sub pp_gsockopt { listop(@_, "getsockopt") }
2283 sub pp_ssockopt { listop(@_, "setsockopt") }
2284 sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
2285 sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
2286 sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
2287 sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
2288 sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
2289 sub pp_link { maybe_targmy(@_, \&listop, "link") }
2290 sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
2291 sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
2292 sub pp_open_dir { listop(@_, "opendir") }
2293 sub pp_seekdir { listop(@_, "seekdir") }
2294 sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
2295 sub pp_system { maybe_targmy(@_, \&listop, "system") }
2296 sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
2297 sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
2298 sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
2299 sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
2300 sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
2301 sub pp_shmget { listop(@_, "shmget") }
2302 sub pp_shmctl { listop(@_, "shmctl") }
2303 sub pp_shmread { listop(@_, "shmread") }
2304 sub pp_shmwrite { listop(@_, "shmwrite") }
2305 sub pp_msgget { listop(@_, "msgget") }
2306 sub pp_msgctl { listop(@_, "msgctl") }
2307 sub pp_msgsnd { listop(@_, "msgsnd") }
2308 sub pp_msgrcv { listop(@_, "msgrcv") }
2309 sub pp_semget { listop(@_, "semget") }
2310 sub pp_semctl { listop(@_, "semctl") }
2311 sub pp_semop { listop(@_, "semop") }
2312 sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
2313 sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
2314 sub pp_gpbynumber { listop(@_, "getprotobynumber") }
2315 sub pp_gsbyname { listop(@_, "getservbyname") }
2316 sub pp_gsbyport { listop(@_, "getservbyport") }
2317 sub pp_syscall { listop(@_, "syscall") }
2318
2319 sub pp_glob {
2320     my $self = shift;
2321     my($op, $cx) = @_;
2322     my $text = $self->dq($op->first->sibling);  # skip pushmark
2323     if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline
2324         or $text =~ /[<>]/) {
2325         return 'glob(' . single_delim('qq', '"', $text) . ')';
2326     } else {
2327         return '<' . $text . '>';
2328     }
2329 }
2330
2331 # Truncate is special because OPf_SPECIAL makes a bareword first arg
2332 # be a filehandle. This could probably be better fixed in the core
2333 # by moving the GV lookup into ck_truc.
2334
2335 sub pp_truncate {
2336     my $self = shift;
2337     my($op, $cx) = @_;
2338     my(@exprs);
2339     my $parens = ($cx >= 5) || $self->{'parens'};
2340     my $kid = $op->first->sibling;
2341     my $fh;
2342     if ($op->flags & OPf_SPECIAL) {
2343         # $kid is an OP_CONST
2344         $fh = $self->const_sv($kid)->PV;
2345     } else {
2346         $fh = $self->deparse($kid, 6);
2347         $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
2348     }
2349     my $len = $self->deparse($kid->sibling, 6);
2350     if ($parens) {
2351         return "truncate($fh, $len)";
2352     } else {
2353         return "truncate $fh, $len";
2354     }
2355 }
2356
2357 sub indirop {
2358     my $self = shift;
2359     my($op, $cx, $name) = @_;
2360     my($expr, @exprs);
2361     my $kid = $op->first->sibling;
2362     my $indir = "";
2363     if ($op->flags & OPf_STACKED) {
2364         $indir = $kid;
2365         $indir = $indir->first; # skip rv2gv
2366         if (is_scope($indir)) {
2367             $indir = "{" . $self->deparse($indir, 0) . "}";
2368             $indir = "{;}" if $indir eq "{}";
2369         } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
2370             $indir = $self->const_sv($indir)->PV;
2371         } else {
2372             $indir = $self->deparse($indir, 24);
2373         }
2374         $indir = $indir . " ";
2375         $kid = $kid->sibling;
2376     }
2377     if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
2378         $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
2379                                                   : '{$a <=> $b} ';
2380     }
2381     elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
2382         $indir = '{$b cmp $a} ';
2383     }
2384     for (; !null($kid); $kid = $kid->sibling) {
2385         $expr = $self->deparse($kid, 6);
2386         push @exprs, $expr;
2387     }
2388     my $name2 = $name;
2389     if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
2390         $name2 = 'reverse sort';
2391     }
2392     if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
2393         return "$exprs[0] = $name2 $indir $exprs[0]";
2394     }
2395
2396     my $args = $indir . join(", ", @exprs);
2397     if ($indir ne "" and $name eq "sort") {
2398         # We don't want to say "sort(f 1, 2, 3)", since perl -w will
2399         # give bareword warnings in that case. Therefore if context
2400         # requires, we'll put parens around the outside "(sort f 1, 2,
2401         # 3)". Unfortunately, we'll currently think the parens are
2402         # necessary more often that they really are, because we don't
2403         # distinguish which side of an assignment we're on.
2404         if ($cx >= 5) {
2405             return "($name2 $args)";
2406         } else {
2407             return "$name2 $args";
2408         }
2409     } else {
2410         return $self->maybe_parens_func($name2, $args, $cx, 5);
2411     }
2412
2413 }
2414
2415 sub pp_prtf { indirop(@_, "printf") }
2416 sub pp_print { indirop(@_, "print") }
2417 sub pp_sort { indirop(@_, "sort") }
2418
2419 sub mapop {
2420     my $self = shift;
2421     my($op, $cx, $name) = @_;
2422     my($expr, @exprs);
2423     my $kid = $op->first; # this is the (map|grep)start
2424     $kid = $kid->first->sibling; # skip a pushmark
2425     my $code = $kid->first; # skip a null
2426     if (is_scope $code) {
2427         $code = "{" . $self->deparse($code, 0) . "} ";
2428     } else {
2429         $code = $self->deparse($code, 24) . ", ";
2430     }
2431     $kid = $kid->sibling;
2432     for (; !null($kid); $kid = $kid->sibling) {
2433         $expr = $self->deparse($kid, 6);
2434         push @exprs, $expr if defined $expr;
2435     }
2436     return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5);
2437 }
2438
2439 sub pp_mapwhile { mapop(@_, "map") }
2440 sub pp_grepwhile { mapop(@_, "grep") }
2441 sub pp_mapstart { baseop(@_, "map") }
2442 sub pp_grepstart { baseop(@_, "grep") }
2443
2444 sub pp_list {
2445     my $self = shift;
2446     my($op, $cx) = @_;
2447     my($expr, @exprs);
2448     my $kid = $op->first->sibling; # skip pushmark
2449     my $lop;
2450     my $local = "either"; # could be local(...), my(...), state(...) or our(...)
2451     for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
2452         # This assumes that no other private flags equal 128, and that
2453         # OPs that store things other than flags in their op_private,
2454         # like OP_AELEMFAST, won't be immediate children of a list.
2455         #
2456         # OP_ENTERSUB can break this logic, so check for it.
2457         # I suspect that open and exit can too.
2458
2459         if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO)
2460                 or $lop->name eq "undef")
2461             or $lop->name eq "entersub"
2462             or $lop->name eq "exit"
2463             or $lop->name eq "open")
2464         {
2465             $local = ""; # or not
2466             last;
2467         }
2468         if ($lop->name =~ /^pad[ash]v$/) {
2469             if ($lop->private & OPpPAD_STATE) { # state()
2470                 ($local = "", last) if $local =~ /^(?:local|our|my)$/;
2471                 $local = "state";
2472             } else { # my()
2473                 ($local = "", last) if $local =~ /^(?:local|our|state)$/;
2474                 $local = "my";
2475             }
2476         } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/
2477                         && $lop->private & OPpOUR_INTRO
2478                 or $lop->name eq "null" && $lop->first->name eq "gvsv"
2479                         && $lop->first->private & OPpOUR_INTRO) { # our()
2480             ($local = "", last) if $local =~ /^(?:my|local|state)$/;
2481             $local = "our";
2482         } elsif ($lop->name ne "undef"
2483                 # specifically avoid the "reverse sort" optimisation,
2484                 # where "reverse" is nullified
2485                 && !($lop->name eq 'sort' && ($lop->flags & OPpSORT_REVERSE)))
2486         {
2487             # local()
2488             ($local = "", last) if $local =~ /^(?:my|our|state)$/;
2489             $local = "local";
2490         }
2491     }
2492     $local = "" if $local eq "either"; # no point if it's all undefs
2493     return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
2494     for (; !null($kid); $kid = $kid->sibling) {
2495         if ($local) {
2496             if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
2497                 $lop = $kid->first;
2498             } else {
2499                 $lop = $kid;
2500             }
2501             $self->{'avoid_local'}{$$lop}++;
2502             $expr = $self->deparse($kid, 6);
2503             delete $self->{'avoid_local'}{$$lop};
2504         } else {
2505             $expr = $self->deparse($kid, 6);
2506         }
2507         push @exprs, $expr;
2508     }
2509     if ($local) {
2510         return "$local(" . join(", ", @exprs) . ")";
2511     } else {
2512         return $self->maybe_parens( join(", ", @exprs), $cx, 6);        
2513     }
2514 }
2515
2516 sub is_ifelse_cont {
2517     my $op = shift;
2518     return ($op->name eq "null" and class($op) eq "UNOP"
2519             and $op->first->name =~ /^(and|cond_expr)$/
2520             and is_scope($op->first->first->sibling));
2521 }
2522
2523 sub pp_cond_expr {
2524     my $self = shift;
2525     my($op, $cx) = @_;
2526     my $cond = $op->first;
2527     my $true = $cond->sibling;
2528     my $false = $true->sibling;
2529     my $cuddle = $self->{'cuddle'};
2530     unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
2531             (is_scope($false) || is_ifelse_cont($false))
2532             and $self->{'expand'} < 7) {
2533         $cond = $self->deparse($cond, 8);
2534         $true = $self->deparse($true, 6);
2535         $false = $self->deparse($false, 8);
2536         return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
2537     }
2538
2539     $cond = $self->deparse($cond, 1);
2540     $true = $self->deparse($true, 0);
2541     my $head = "if ($cond) {\n\t$true\n\b}";
2542     my @elsifs;
2543     while (!null($false) and is_ifelse_cont($false)) {
2544         my $newop = $false->first;
2545         my $newcond = $newop->first;
2546         my $newtrue = $newcond->sibling;
2547         $false = $newtrue->sibling; # last in chain is OP_AND => no else
2548         $newcond = $self->deparse($newcond, 1);
2549         $newtrue = $self->deparse($newtrue, 0);
2550         push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
2551     }
2552     if (!null($false)) {
2553         $false = $cuddle . "else {\n\t" .
2554           $self->deparse($false, 0) . "\n\b}\cK";
2555     } else {
2556         $false = "\cK";
2557     }
2558     return $head . join($cuddle, "", @elsifs) . $false;
2559 }
2560
2561 sub loop_common {
2562     my $self = shift;
2563     my($op, $cx, $init) = @_;
2564     my $enter = $op->first;
2565     my $kid = $enter->sibling;
2566     local(@$self{qw'curstash warnings hints'})
2567                 = @$self{qw'curstash warnings hints'};
2568     my $head = "";
2569     my $bare = 0;
2570     my $body;
2571     my $cond = undef;
2572     if ($kid->name eq "lineseq") { # bare or infinite loop
2573         if ($kid->last->name eq "unstack") { # infinite
2574             $head = "while (1) "; # Can't use for(;;) if there's a continue
2575             $cond = "";
2576         } else {
2577             $bare = 1;
2578         }
2579         $body = $kid;
2580     } elsif ($enter->name eq "enteriter") { # foreach
2581         my $ary = $enter->first->sibling; # first was pushmark
2582         my $var = $ary->sibling;
2583         if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
2584             # "reverse" was optimised away
2585             $ary = listop($self, $ary->first->sibling, 1, 'reverse');
2586         } elsif ($enter->flags & OPf_STACKED
2587             and not null $ary->first->sibling->sibling)
2588         {
2589             $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
2590               $self->deparse($ary->first->sibling->sibling, 9);
2591         } else {
2592             $ary = $self->deparse($ary, 1);
2593         }
2594         if (null $var) {
2595             if ($enter->flags & OPf_SPECIAL) { # thread special var
2596                 $var = $self->pp_threadsv($enter, 1);
2597             } else { # regular my() variable
2598                 $var = $self->pp_padsv($enter, 1);
2599             }
2600         } elsif ($var->name eq "rv2gv") {
2601             $var = $self->pp_rv2sv($var, 1);
2602             if ($enter->private & OPpOUR_INTRO) {
2603                 # our declarations don't have package names
2604                 $var =~ s/^(.).*::/$1/;
2605                 $var = "our $var";
2606             }
2607         } elsif ($var->name eq "gv") {
2608             $var = "\$" . $self->deparse($var, 1);
2609         }
2610         $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
2611         if (!is_state $body->first and $body->first->name ne "stub") {
2612             confess unless $var eq '$_';
2613             $body = $body->first;
2614             return $self->deparse($body, 2) . " foreach ($ary)";
2615         }
2616         $head = "foreach $var ($ary) ";
2617     } elsif ($kid->name eq "null") { # while/until
2618         $kid = $kid->first;
2619         my $name = {"and" => "while", "or" => "until"}->{$kid->name};
2620         $cond = $self->deparse($kid->first, 1);
2621         $head = "$name ($cond) ";
2622         $body = $kid->first->sibling;
2623     } elsif ($kid->name eq "stub") { # bare and empty
2624         return "{;}"; # {} could be a hashref
2625     }
2626     # If there isn't a continue block, then the next pointer for the loop
2627     # will point to the unstack, which is kid's last child, except
2628     # in a bare loop, when it will point to the leaveloop. When neither of
2629     # these conditions hold, then the second-to-last child is the continue
2630     # block (or the last in a bare loop).
2631     my $cont_start = $enter->nextop;
2632     my $cont;
2633     if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
2634         if ($bare) {
2635             $cont = $body->last;
2636         } else {
2637             $cont = $body->first;
2638             while (!null($cont->sibling->sibling)) {
2639                 $cont = $cont->sibling;
2640             }
2641         }
2642         my $state = $body->first;
2643         my $cuddle = $self->{'cuddle'};
2644         my @states;
2645         for (; $$state != $$cont; $state = $state->sibling) {
2646             push @states, $state;
2647         }
2648         $body = $self->lineseq(undef, @states);
2649         if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
2650             $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
2651             $cont = "\cK";
2652         } else {
2653             $cont = $cuddle . "continue {\n\t" .
2654               $self->deparse($cont, 0) . "\n\b}\cK";
2655         }
2656     } else {
2657         return "" if !defined $body;
2658         if (length $init) {
2659             $head = "for ($init; $cond;) ";
2660         }
2661         $cont = "\cK";
2662         $body = $self->deparse($body, 0);
2663     }
2664     $body =~ s/;?$/;\n/;
2665
2666     return $head . "{\n\t" . $body . "\b}" . $cont;
2667 }
2668
2669 sub pp_leaveloop { loop_common(@_, "") }
2670
2671 sub for_loop {
2672     my $self = shift;
2673     my($op, $cx) = @_;
2674     my $init = $self->deparse($op, 1);
2675     return $self->loop_common($op->sibling->first->sibling, $cx, $init);
2676 }
2677
2678 sub pp_leavetry {
2679     my $self = shift;
2680     return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
2681 }
2682
2683 BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
2684 BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
2685 BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" }
2686 BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" }
2687
2688 sub pp_null {
2689     my $self = shift;
2690     my($op, $cx) = @_;
2691     if (class($op) eq "OP") {
2692         # old value is lost
2693         return $self->{'ex_const'} if $op->targ == OP_CONST;
2694     } elsif ($op->first->name eq "pushmark") {
2695         return $self->pp_list($op, $cx);
2696     } elsif ($op->first->name eq "enter") {
2697         return $self->pp_leave($op, $cx);
2698     } elsif ($op->first->name eq "leave") {
2699         return $self->pp_leave($op->first, $cx);
2700     } elsif ($op->first->name eq "scope") {
2701         return $self->pp_scope($op->first, $cx);
2702     } elsif ($op->targ == OP_STRINGIFY) {
2703         return $self->dquote($op, $cx);
2704     } elsif (!null($op->first->sibling) and
2705              $op->first->sibling->name eq "readline" and
2706              $op->first->sibling->flags & OPf_STACKED) {
2707         return $self->maybe_parens($self->deparse($op->first, 7) . " = "
2708                                    . $self->deparse($op->first->sibling, 7),
2709                                    $cx, 7);
2710     } elsif (!null($op->first->sibling) and
2711              $op->first->sibling->name eq "trans" and
2712              $op->first->sibling->flags & OPf_STACKED) {
2713         return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
2714                                    . $self->deparse($op->first->sibling, 20),
2715                                    $cx, 20);
2716     } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
2717         return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
2718     } elsif (!null($op->first->sibling) and
2719              $op->first->sibling->name eq "null" and
2720              class($op->first->sibling) eq "UNOP" and
2721              $op->first->sibling->first->flags & OPf_STACKED and
2722              $op->first->sibling->first->name eq "rcatline") {
2723         return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
2724                                    . $self->deparse($op->first->sibling, 18),
2725                                    $cx, 18);
2726     } else {
2727         return $self->deparse($op->first, $cx);
2728     }
2729 }
2730
2731 sub padname {
2732     my $self = shift;
2733     my $targ = shift;
2734     return $self->padname_sv($targ)->PVX;
2735 }
2736
2737 sub padany {
2738     my $self = shift;
2739     my $op = shift;
2740     return substr($self->padname($op->targ), 1); # skip $/@/%
2741 }
2742
2743 sub pp_padsv {
2744     my $self = shift;
2745     my($op, $cx) = @_;
2746     return $self->maybe_my($op, $cx, $self->padname($op->targ));
2747 }
2748
2749 sub pp_padav { pp_padsv(@_) }
2750 sub pp_padhv { pp_padsv(@_) }
2751
2752 my @threadsv_names;
2753
2754 BEGIN {
2755     @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9",
2756                        "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";",
2757                        "^", "-", "%", "=", "|", "~", ":", "^A", "^E",
2758                        "!", "@");
2759 }
2760
2761 sub pp_threadsv {
2762     my $self = shift;
2763     my($op, $cx) = @_;
2764     return $self->maybe_local($op, $cx, "\$" .  $threadsv_names[$op->targ]);
2765 }
2766
2767 sub gv_or_padgv {
2768     my $self = shift;
2769     my $op = shift;
2770     if (class($op) eq "PADOP") {
2771         return $self->padval($op->padix);
2772     } else { # class($op) eq "SVOP"
2773         return $op->gv;
2774     }
2775 }
2776
2777 sub pp_gvsv {
2778     my $self = shift;
2779     my($op, $cx) = @_;
2780     my $gv = $self->gv_or_padgv($op);
2781     return $self->maybe_local($op, $cx, $self->stash_variable("\$",
2782                                  $self->gv_name($gv)));
2783 }
2784
2785 sub pp_gv {
2786     my $self = shift;
2787     my($op, $cx) = @_;
2788     my $gv = $self->gv_or_padgv($op);
2789     return $self->gv_name($gv);
2790 }
2791
2792 sub pp_aelemfast {
2793     my $self = shift;
2794     my($op, $cx) = @_;
2795     my $name;
2796     if ($op->flags & OPf_SPECIAL) { # optimised PADAV
2797         $name = $self->padname($op->targ);
2798         $name =~ s/^@/\$/;
2799     }
2800     else {
2801         my $gv = $self->gv_or_padgv($op);
2802         $name = $self->gv_name($gv);
2803         $name = $self->{'curstash'}."::$name"
2804             if $name !~ /::/ && $self->lex_in_scope('@'.$name);
2805         $name = '$' . $name;
2806     }
2807
2808     return $name . "[" .  ($op->private + $self->{'arybase'}) . "]";
2809 }
2810
2811 sub rv2x {
2812     my $self = shift;
2813     my($op, $cx, $type) = @_;
2814
2815     if (class($op) eq 'NULL' || !$op->can("first")) {
2816         carp("Unexpected op in pp_rv2x");
2817         return 'XXX';
2818     }
2819     my $kid = $op->first;
2820     if ($kid->name eq "gv") {
2821         return $self->stash_variable($type, $self->deparse($kid, 0));
2822     } elsif (is_scalar $kid) {
2823         my $str = $self->deparse($kid, 0);
2824         if ($str =~ /^\$([^\w\d])\z/) {
2825             # "$$+" isn't a legal way to write the scalar dereference
2826             # of $+, since the lexer can't tell you aren't trying to
2827             # do something like "$$ + 1" to get one more than your
2828             # PID. Either "${$+}" or "$${+}" are workable
2829             # disambiguations, but if the programmer did the former,
2830             # they'd be in the "else" clause below rather than here.
2831             # It's not clear if this should somehow be unified with
2832             # the code in dq and re_dq that also adds lexer
2833             # disambiguation braces.
2834             $str = '$' . "{$1}"; #'
2835         }
2836         return $type . $str;
2837     } else {
2838         return $type . "{" . $self->deparse($kid, 0) . "}";
2839     }
2840 }
2841
2842 sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
2843 sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
2844 sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
2845
2846 # skip rv2av
2847 sub pp_av2arylen {
2848     my $self = shift;
2849     my($op, $cx) = @_;
2850     if ($op->first->name eq "padav") {
2851         return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
2852     } else {
2853         return $self->maybe_local($op, $cx,
2854                                   $self->rv2x($op->first, $cx, '$#'));
2855     }
2856 }
2857
2858 # skip down to the old, ex-rv2cv
2859 sub pp_rv2cv {
2860     my ($self, $op, $cx) = @_;
2861     if (!null($op->first) && $op->first->name eq 'null' &&
2862         $op->first->targ eq OP_LIST)
2863     {
2864         return $self->rv2x($op->first->first->sibling, $cx, "&")
2865     }
2866     else {
2867         return $self->rv2x($op, $cx, "")
2868     }
2869 }
2870
2871 sub list_const {
2872     my $self = shift;
2873     my($cx, @list) = @_;
2874     my @a = map $self->const($_, 6), @list;
2875     if (@a == 0) {
2876         return "()";
2877     } elsif (@a == 1) {
2878         return $a[0];
2879     } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
2880         # collapse (-1,0,1,2) into (-1..2)
2881         my ($s, $e) = @a[0,-1];
2882         my $i = $s;
2883         return $self->maybe_parens("$s..$e", $cx, 9)
2884           unless grep $i++ != $_, @a;
2885     }
2886     return $self->maybe_parens(join(", ", @a), $cx, 6);
2887 }
2888
2889 sub pp_rv2av {
2890     my $self = shift;
2891     my($op, $cx) = @_;
2892     my $kid = $op->first;
2893     if ($kid->name eq "const") { # constant list
2894         my $av = $self->const_sv($kid);
2895         return $self->list_const($cx, $av->ARRAY);
2896     } else {
2897         return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
2898     }
2899  }
2900
2901 sub is_subscriptable {
2902     my $op = shift;
2903     if ($op->name =~ /^[ahg]elem/) {
2904         return 1;
2905     } elsif ($op->name eq "entersub") {
2906         my $kid = $op->first;
2907         return 0 unless null $kid->sibling;
2908         $kid = $kid->first;
2909         $kid = $kid->sibling until null $kid->sibling;
2910         return 0 if is_scope($kid);
2911         $kid = $kid->first;
2912         return 0 if $kid->name eq "gv";
2913         return 0 if is_scalar($kid);
2914         return is_subscriptable($kid);  
2915     } else {
2916         return 0;
2917     }
2918 }
2919
2920 sub elem {
2921     my $self = shift;
2922     my ($op, $cx, $left, $right, $padname) = @_;
2923     my($array, $idx) = ($op->first, $op->first->sibling);
2924     unless ($array->name eq $padname) { # Maybe this has been fixed     
2925         $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
2926     }
2927     if ($array->name eq $padname) {
2928         $array = $self->padany($array);
2929     } elsif (is_scope($array)) { # ${expr}[0]
2930         $array = "{" . $self->deparse($array, 0) . "}";
2931     } elsif ($array->name eq "gv") {
2932         $array = $self->gv_name($self->gv_or_padgv($array));
2933         if ($array !~ /::/) {
2934             my $prefix = ($left eq '[' ? '@' : '%');
2935             $array = $self->{curstash}.'::'.$array
2936                 if $self->lex_in_scope($prefix . $array);
2937         }
2938     } elsif (is_scalar $array) { # $x[0], $$x[0], ...
2939         $array = $self->deparse($array, 24);
2940     } else {
2941         # $x[20][3]{hi} or expr->[20]
2942         my $arrow = is_subscriptable($array) ? "" : "->";
2943         return $self->deparse($array, 24) . $arrow .
2944             $left . $self->deparse($idx, 1) . $right;
2945     }
2946     $idx = $self->deparse($idx, 1);
2947
2948     # Outer parens in an array index will confuse perl
2949     # if we're interpolating in a regular expression, i.e.
2950     # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
2951     #
2952     # If $self->{parens}, then an initial '(' will
2953     # definitely be paired with a final ')'. If
2954     # !$self->{parens}, the misleading parens won't
2955     # have been added in the first place.
2956     #
2957     # [You might think that we could get "(...)...(...)"
2958     # where the initial and final parens do not match
2959     # each other. But we can't, because the above would
2960     # only happen if there's an infix binop between the
2961     # two pairs of parens, and *that* means that the whole
2962     # expression would be parenthesized as well.]
2963     #
2964     $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
2965
2966     # Hash-element braces will autoquote a bareword inside themselves.
2967     # We need to make sure that C<$hash{warn()}> doesn't come out as
2968     # C<$hash{warn}>, which has a quite different meaning. Currently
2969     # B::Deparse will always quote strings, even if the string was a
2970     # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
2971     # for constant strings.) So we can cheat slightly here - if we see
2972     # a bareword, we know that it is supposed to be a function call.
2973     #
2974     $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
2975
2976     return "\$" . $array . $left . $idx . $right;
2977 }
2978
2979 sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
2980 sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
2981
2982 sub pp_gelem {
2983     my $self = shift;
2984     my($op, $cx) = @_;
2985     my($glob, $part) = ($op->first, $op->last);
2986     $glob = $glob->first; # skip rv2gv
2987     $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
2988     my $scope = is_scope($glob);
2989     $glob = $self->deparse($glob, 0);
2990     $part = $self->deparse($part, 1);
2991     return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
2992 }
2993
2994 sub slice {
2995     my $self = shift;
2996     my ($op, $cx, $left, $right, $regname, $padname) = @_;
2997     my $last;
2998     my(@elems, $kid, $array, $list);
2999     if (class($op) eq "LISTOP") {
3000         $last = $op->last;
3001     } else { # ex-hslice inside delete()
3002         for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
3003         $last = $kid;
3004     }
3005     $array = $last;
3006     $array = $array->first
3007         if $array->name eq $regname or $array->name eq "null";
3008     if (is_scope($array)) {
3009         $array = "{" . $self->deparse($array, 0) . "}";
3010     } elsif ($array->name eq $padname) {
3011         $array = $self->padany($array);
3012     } else {
3013         $array = $self->deparse($array, 24);
3014     }
3015     $kid = $op->first->sibling; # skip pushmark
3016     if ($kid->name eq "list") {
3017         $kid = $kid->first->sibling; # skip list, pushmark
3018         for (; !null $kid; $kid = $kid->sibling) {
3019             push @elems, $self->deparse($kid, 6);
3020         }
3021         $list = join(", ", @elems);
3022     } else {
3023         $list = $self->deparse($kid, 1);
3024     }
3025     return "\@" . $array . $left . $list . $right;
3026 }
3027
3028 sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
3029 sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
3030
3031 sub pp_lslice {
3032     my $self = shift;
3033     my($op, $cx) = @_;
3034     my $idx = $op->first;
3035     my $list = $op->last;
3036     my(@elems, $kid);
3037     $list = $self->deparse($list, 1);
3038     $idx = $self->deparse($idx, 1);
3039     return "($list)" . "[$idx]";
3040 }
3041
3042 sub want_scalar {
3043     my $op = shift;
3044     return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
3045 }
3046
3047 sub want_list {
3048     my $op = shift;
3049     return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
3050 }
3051
3052 sub method {
3053     my $self = shift;
3054     my($op, $cx) = @_;
3055     my $kid = $op->first->sibling; # skip pushmark
3056     my($meth, $obj, @exprs);
3057     if ($kid->name eq "list" and want_list $kid) {
3058         # When an indirect object isn't a bareword but the args are in
3059         # parens, the parens aren't part of the method syntax (the LLAFR
3060         # doesn't apply), but they make a list with OPf_PARENS set that
3061         # doesn't get flattened by the append_elem that adds the method,
3062         # making a (object, arg1, arg2, ...) list where the object
3063         # usually is. This can be distinguished from
3064         # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
3065         # object) because in the later the list is in scalar context
3066         # as the left side of -> always is, while in the former
3067         # the list is in list context as method arguments always are.
3068         # (Good thing there aren't method prototypes!)
3069         $meth = $kid->sibling;
3070         $kid = $kid->first->sibling; # skip pushmark
3071         $obj = $kid;
3072         $kid = $kid->sibling;
3073         for (; not null $kid; $kid = $kid->sibling) {
3074             push @exprs, $self->deparse($kid, 6);
3075         }
3076     } else {
3077         $obj = $kid;
3078         $kid = $kid->sibling;
3079         for (; !null ($kid->sibling) && $kid->name ne "method_named";
3080               $kid = $kid->sibling) {
3081             push @exprs, $self->deparse($kid, 6);
3082         }
3083         $meth = $kid;
3084     }
3085     $obj = $self->deparse($obj, 24);
3086     if ($meth->name eq "method_named") {
3087         $meth = $self->const_sv($meth)->PV;
3088     } else {
3089         $meth = $meth->first;
3090         if ($meth->name eq "const") {
3091             # As of 5.005_58, this case is probably obsoleted by the
3092             # method_named case above
3093             $meth = $self->const_sv($meth)->PV; # needs to be bare
3094         } else {
3095             $meth = $self->deparse($meth, 1);
3096         }
3097     }
3098     my $args = join(", ", @exprs);      
3099     $kid = $obj . "->" . $meth;
3100     if (length $args) {
3101         return $kid . "(" . $args . ")"; # parens mandatory
3102     } else {
3103         return $kid;
3104     }
3105 }
3106
3107 # returns "&" if the prototype doesn't match the args,
3108 # or ("", $args_after_prototype_demunging) if it does.
3109 sub check_proto {
3110     my $self = shift;
3111     return "&" if $self->{'noproto'};
3112     my($proto, @args) = @_;
3113     my($arg, $real);
3114     my $doneok = 0;
3115     my @reals;
3116     # An unbackslashed @ or % gobbles up the rest of the args
3117     1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
3118     while ($proto) {
3119         $proto =~ s/^(\\?[\$\@&%*]|\\\[[\$\@&%*]+\]|;)//;
3120         my $chr = $1;
3121         if ($chr eq "") {
3122             return "&" if @args;
3123         } elsif ($chr eq ";") {
3124             $doneok = 1;
3125         } elsif ($chr eq "@" or $chr eq "%") {
3126             push @reals, map($self->deparse($_, 6), @args);
3127             @args = ();
3128         } else {
3129             $arg = shift @args;
3130             last unless $arg;
3131             if ($chr eq "\$") {
3132                 if (want_scalar $arg) {
3133                     push @reals, $self->deparse($arg, 6);
3134                 } else {
3135                     return "&";
3136                 }
3137             } elsif ($chr eq "&") {
3138                 if ($arg->name =~ /^(s?refgen|undef)$/) {
3139                     push @reals, $self->deparse($arg, 6);
3140                 } else {
3141                     return "&";
3142                 }
3143             } elsif ($chr eq "*") {
3144                 if ($arg->name =~ /^s?refgen$/
3145                     and $arg->first->first->name eq "rv2gv")
3146                   {
3147                       $real = $arg->first->first; # skip refgen, null
3148                       if ($real->first->name eq "gv") {
3149                           push @reals, $self->deparse($real, 6);
3150                       } else {
3151                           push @reals, $self->deparse($real->first, 6);
3152                       }
3153                   } else {
3154                       return "&";
3155                   }
3156             } elsif (substr($chr, 0, 1) eq "\\") {
3157                 $chr =~ tr/\\[]//d;
3158                 if ($arg->name =~ /^s?refgen$/ and
3159                     !null($real = $arg->first) and
3160                     ($chr =~ /\$/ && is_scalar($real->first)
3161                      or ($chr =~ /@/
3162                          && class($real->first->sibling) ne 'NULL'
3163                          && $real->first->sibling->name
3164                          =~ /^(rv2|pad)av$/)
3165                      or ($chr =~ /%/
3166                          && class($real->first->sibling) ne 'NULL'
3167                          && $real->first->sibling->name
3168                          =~ /^(rv2|pad)hv$/)
3169                      #or ($chr =~ /&/ # This doesn't work
3170                      #   && $real->first->name eq "rv2cv")
3171                      or ($chr =~ /\*/
3172                          && $real->first->name eq "rv2gv")))
3173                   {
3174                       push @reals, $self->deparse($real, 6);
3175                   } else {
3176                       return "&";
3177                   }
3178             }
3179        }
3180     }
3181     return "&" if $proto and !$doneok; # too few args and no `;'
3182     return "&" if @args;               # too many args
3183     return ("", join ", ", @reals);
3184 }
3185
3186 sub pp_entersub {
3187     my $self = shift;
3188     my($op, $cx) = @_;
3189     return $self->method($op, $cx) unless null $op->first->sibling;
3190     my $prefix = "";
3191     my $amper = "";
3192     my($kid, @exprs);
3193     if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
3194         $prefix = "do ";
3195     } elsif ($op->private & OPpENTERSUB_AMPER) {
3196         $amper = "&";
3197     }
3198     $kid = $op->first;
3199     $kid = $kid->first->sibling; # skip ex-list, pushmark
3200     for (; not null $kid->sibling; $kid = $kid->sibling) {
3201         push @exprs, $kid;
3202     }
3203     my $simple = 0;
3204     my $proto = undef;
3205     if (is_scope($kid)) {
3206         $amper = "&";
3207         $kid = "{" . $self->deparse($kid, 0) . "}";
3208     } elsif ($kid->first->name eq "gv") {
3209         my $gv = $self->gv_or_padgv($kid->first);
3210         if (class($gv->CV) ne "SPECIAL") {
3211             $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
3212         }
3213         $simple = 1; # only calls of named functions can be prototyped
3214         $kid = $self->deparse($kid, 24);
3215     } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
3216         $amper = "&";
3217         $kid = $self->deparse($kid, 24);
3218     } else {
3219         $prefix = "";
3220         my $arrow = is_subscriptable($kid->first) ? "" : "->";
3221         $kid = $self->deparse($kid, 24) . $arrow;
3222     }
3223
3224     # Doesn't matter how many prototypes there are, if
3225     # they haven't happened yet!
3226     my $declared;
3227     {
3228         no strict 'refs';
3229         no warnings 'uninitialized';
3230         $declared = exists $self->{'subs_declared'}{$kid}
3231             || (
3232                  defined &{ ${$self->{'curstash'}."::"}{$kid} }
3233                  && !exists
3234                      $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
3235                  && defined prototype $self->{'curstash'}."::".$kid
3236                );
3237         if (!$declared && defined($proto)) {
3238             # Avoid "too early to check prototype" warning
3239             ($amper, $proto) = ('&');
3240         }
3241     }
3242
3243     my $args;
3244     if ($declared and defined $proto and not $amper) {
3245         ($amper, $args) = $self->check_proto($proto, @exprs);
3246         if ($amper eq "&") {
3247             $args = join(", ", map($self->deparse($_, 6), @exprs));
3248         }
3249     } else {
3250         $args = join(", ", map($self->deparse($_, 6), @exprs));
3251     }
3252     if ($prefix or $amper) {
3253         if ($op->flags & OPf_STACKED) {
3254             return $prefix . $amper . $kid . "(" . $args . ")";
3255         } else {
3256             return $prefix . $amper. $kid;
3257         }
3258     } else {
3259         # glob() invocations can be translated into calls of
3260         # CORE::GLOBAL::glob with a second parameter, a number.
3261         # Reverse this.
3262         if ($kid eq "CORE::GLOBAL::glob") {
3263             $kid = "glob";
3264             $args =~ s/\s*,[^,]+$//;
3265         }
3266
3267         # It's a syntax error to call CORE::GLOBAL::foo without a prefix,
3268         # so it must have been translated from a keyword call. Translate
3269         # it back.
3270         $kid =~ s/^CORE::GLOBAL:://;
3271
3272         my $dproto = defined($proto) ? $proto : "undefined";
3273         if (!$declared) {
3274             return "$kid(" . $args . ")";
3275         } elsif ($dproto eq "") {
3276             return $kid;
3277         } elsif ($dproto eq "\$" and is_scalar($exprs[0])) {
3278             # is_scalar is an excessively conservative test here:
3279             # really, we should be comparing to the precedence of the
3280             # top operator of $exprs[0] (ala unop()), but that would
3281             # take some major code restructuring to do right.
3282             return $self->maybe_parens_func($kid, $args, $cx, 16);
3283         } elsif ($dproto ne '$' and defined($proto) || $simple) { #'
3284             return $self->maybe_parens_func($kid, $args, $cx, 5);
3285         } else {
3286             return "$kid(" . $args . ")";
3287         }
3288     }
3289 }
3290
3291 sub pp_enterwrite { unop(@_, "write") }
3292
3293 # escape things that cause interpolation in double quotes,
3294 # but not character escapes
3295 sub uninterp {
3296     my($str) = @_;
3297     $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
3298     return $str;
3299 }
3300
3301 {
3302 my $bal;
3303 BEGIN {
3304     use re "eval";
3305     # Matches any string which is balanced with respect to {braces}
3306     $bal = qr(
3307       (?:
3308         [^\\{}]
3309       | \\\\
3310       | \\[{}]
3311       | \{(??{$bal})\}
3312       )*
3313     )x;
3314 }
3315
3316 # the same, but treat $|, $), $( and $ at the end of the string differently
3317 sub re_uninterp {
3318     my($str) = @_;
3319
3320     $str =~ s/
3321           ( ^|\G                  # $1
3322           | [^\\]
3323           )
3324
3325           (                       # $2
3326             (?:\\\\)*
3327           )
3328
3329           (                       # $3
3330             (\(\?\??\{$bal\}\))   # $4
3331           | [\$\@]
3332             (?!\||\)|\(|$)
3333           | \\[uUlLQE]
3334           )
3335
3336         /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3337
3338     return $str;
3339 }
3340
3341 # This is for regular expressions with the /x modifier
3342 # We have to leave comments unmangled.
3343 sub re_uninterp_extended {
3344     my($str) = @_;
3345
3346     $str =~ s/
3347           ( ^|\G                  # $1
3348           | [^\\]
3349           )
3350
3351           (                       # $2
3352             (?:\\\\)*
3353           )
3354
3355           (                       # $3
3356             ( \(\?\??\{$bal\}\)   # $4  (skip over (?{}) and (??{}) blocks)
3357             | \#[^\n]*            #     (skip over comments)
3358             )
3359           | [\$\@]
3360             (?!\||\)|\(|$|\s)
3361           | \\[uUlLQE]
3362           )
3363
3364         /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
3365
3366     return $str;
3367 }
3368 }
3369
3370 my %unctrl = # portable to to EBCDIC
3371     (
3372      "\c@" => '\c@',    # unused
3373      "\cA" => '\cA',
3374      "\cB" => '\cB',
3375      "\cC" => '\cC',
3376      "\cD" => '\cD',
3377      "\cE" => '\cE',
3378      "\cF" => '\cF',
3379      "\cG" => '\cG',
3380      "\cH" => '\cH',
3381      "\cI" => '\cI',
3382      "\cJ" => '\cJ',
3383      "\cK" => '\cK',
3384      "\cL" => '\cL',
3385      "\cM" => '\cM',
3386      "\cN" => '\cN',
3387      "\cO" => '\cO',
3388      "\cP" => '\cP',
3389      "\cQ" => '\cQ',
3390      "\cR" => '\cR',
3391      "\cS" => '\cS',
3392      "\cT" => '\cT',
3393      "\cU" => '\cU',
3394      "\cV" => '\cV',
3395      "\cW" => '\cW',
3396      "\cX" => '\cX',
3397      "\cY" => '\cY',
3398      "\cZ" => '\cZ',
3399      "\c[" => '\c[',    # unused
3400      "\c\\" => '\c\\',  # unused
3401      "\c]" => '\c]',    # unused
3402      "\c_" => '\c_',    # unused
3403     );
3404
3405 # character escapes, but not delimiters that might need to be escaped
3406 sub escape_str { # ASCII, UTF8
3407     my($str) = @_;
3408     $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3409     $str =~ s/\a/\\a/g;
3410 #    $str =~ s/\cH/\\b/g; # \b means something different in a regex
3411     $str =~ s/\t/\\t/g;
3412     $str =~ s/\n/\\n/g;
3413     $str =~ s/\e/\\e/g;
3414     $str =~ s/\f/\\f/g;
3415     $str =~ s/\r/\\r/g;
3416     $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge;
3417     $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge;
3418     return $str;
3419 }
3420
3421 # For regexes with the /x modifier.
3422 # Leave whitespace unmangled.
3423 sub escape_extended_re {
3424     my($str) = @_;
3425     $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
3426     $str =~ s/([[:^print:]])/
3427         ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge;
3428     $str =~ s/\n/\n\f/g;
3429     return $str;
3430 }
3431
3432 # Don't do this for regexen
3433 sub unback {
3434     my($str) = @_;
3435     $str =~ s/\\/\\\\/g;
3436     return $str;
3437 }
3438
3439 # Remove backslashes which precede literal control characters,
3440 # to avoid creating ambiguity when we escape the latter.
3441 sub re_unback {
3442     my($str) = @_;
3443
3444     # the insane complexity here is due to the behaviour of "\c\"
3445     $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
3446     return $str;
3447 }
3448
3449 sub balanced_delim {
3450     my($str) = @_;
3451     my @str = split //, $str;
3452     my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
3453     for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
3454         ($open, $close) = @$ar;
3455         $fail = 0; $cnt = 0; $last_bs = 0;
3456         for $c (@str) {
3457             if ($c eq $open) {
3458                 $fail = 1 if $last_bs;
3459                 $cnt++;
3460             } elsif ($c eq $close) {
3461                 $fail = 1 if $last_bs;
3462                 $cnt--;
3463                 if ($cnt < 0) {
3464                     # qq()() isn't ")("
3465                     $fail = 1;
3466                     last;
3467                 }
3468             }
3469             $last_bs = $c eq '\\';
3470         }
3471         $fail = 1 if $cnt != 0;
3472         return ($open, "$open$str$close") if not $fail;
3473     }
3474     return ("", $str);
3475 }
3476
3477 sub single_delim {
3478     my($q, $default, $str) = @_;
3479     return "$default$str$default" if $default and index($str, $default) == -1;
3480     if ($q ne 'qr') {
3481         (my $succeed, $str) = balanced_delim($str);
3482         return "$q$str" if $succeed;
3483     }
3484     for my $delim ('/', '"', '#') {
3485         return "$q$delim" . $str . $delim if index($str, $delim) == -1;
3486     }
3487     if ($default) {
3488         $str =~ s/$default/\\$default/g;
3489         return "$default$str$default";
3490     } else {
3491         $str =~ s[/][\\/]g;
3492         return "$q/$str/";
3493     }
3494 }
3495
3496 my $max_prec;
3497 BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
3498
3499 # Split a floating point number into an integer mantissa and a binary
3500 # exponent. Assumes you've already made sure the number isn't zero or
3501 # some weird infinity or NaN.
3502 sub split_float {
3503     my($f) = @_;
3504     my $exponent = 0;
3505     if ($f == int($f)) {
3506         while ($f % 2 == 0) {
3507             $f /= 2;
3508             $exponent++;
3509         }
3510     } else {
3511         while ($f != int($f)) {
3512             $f *= 2;
3513             $exponent--;
3514         }
3515     }
3516     my $mantissa = sprintf("%.0f", $f);
3517     return ($mantissa, $exponent);
3518 }
3519
3520 sub const {
3521     my $self = shift;
3522     my($sv, $cx) = @_;
3523     if ($self->{'use_dumper'}) {
3524         return $self->const_dumper($sv, $cx);
3525     }
3526     if (class($sv) eq "SPECIAL") {
3527         # sv_undef, sv_yes, sv_no
3528         return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1];
3529     } elsif (class($sv) eq "NULL") {
3530        return 'undef';
3531     }
3532     # convert a version object into the "v1.2.3" string in its V magic
3533     if ($sv->FLAGS & SVs_RMG) {
3534         for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3535             return $mg->PTR if $mg->TYPE eq 'V';
3536         }
3537     }
3538
3539     if ($sv->FLAGS & SVf_IOK) {
3540         my $str = $sv->int_value;
3541         $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
3542         return $str;
3543     } elsif ($sv->FLAGS & SVf_NOK) {
3544         my $nv = $sv->NV;
3545         if ($nv == 0) {
3546             if (pack("F", $nv) eq pack("F", 0)) {
3547                 # positive zero
3548                 return "0";
3549             } else {
3550                 # negative zero
3551                 return $self->maybe_parens("-.0", $cx, 21);
3552             }
3553         } elsif (1/$nv == 0) {
3554             if ($nv > 0) {
3555                 # positive infinity
3556                 return $self->maybe_parens("9**9**9", $cx, 22);
3557             } else {
3558                 # negative infinity
3559                 return $self->maybe_parens("-9**9**9", $cx, 21);
3560             }
3561         } elsif ($nv != $nv) {
3562             # NaN
3563             if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
3564                 # the normal kind
3565                 return "sin(9**9**9)";
3566             } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
3567                 # the inverted kind
3568                 return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
3569             } else {
3570                 # some other kind
3571                 my $hex = unpack("h*", pack("F", $nv));
3572                 return qq'unpack("F", pack("h*", "$hex"))';
3573             }
3574         }
3575         # first, try the default stringification
3576         my $str = "$nv";
3577         if ($str != $nv) {
3578             # failing that, try using more precision
3579             $str = sprintf("%.${max_prec}g", $nv);
3580 #           if (pack("F", $str) ne pack("F", $nv)) {
3581             if ($str != $nv) {
3582                 # not representable in decimal with whatever sprintf()
3583                 # and atof() Perl is using here.
3584                 my($mant, $exp) = split_float($nv);
3585                 return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
3586             }
3587         }
3588         $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
3589         return $str;
3590     } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
3591         my $ref = $sv->RV;
3592         if (class($ref) eq "AV") {
3593             return "[" . $self->list_const(2, $ref->ARRAY) . "]";
3594         } elsif (class($ref) eq "HV") {
3595             my %hash = $ref->ARRAY;
3596             my @elts;
3597             for my $k (sort keys %hash) {
3598                 push @elts, "$k => " . $self->const($hash{$k}, 6);
3599             }
3600             return "{" . join(", ", @elts) . "}";
3601         } elsif (class($ref) eq "CV") {
3602             return "sub " . $self->deparse_sub($ref);
3603         }
3604         if ($ref->FLAGS & SVs_SMG) {
3605             for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
3606                 if ($mg->TYPE eq 'r') {
3607                     my $re = re_uninterp(escape_str(re_unback($mg->precomp)));
3608                     return single_delim("qr", "", $re);
3609                 }
3610             }
3611         }
3612         
3613         return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20);
3614     } elsif ($sv->FLAGS & SVf_POK) {
3615         my $str = $sv->PV;
3616         if ($str =~ /[[:^print:]]/) {
3617             return single_delim("qq", '"', uninterp escape_str unback $str);
3618         } else {
3619             return single_delim("q", "'", unback $str);
3620         }
3621     } else {
3622         return "undef";
3623     }
3624 }
3625
3626 sub const_dumper {
3627     my $self = shift;
3628     my($sv, $cx) = @_;
3629     my $ref = $sv->object_2svref();
3630     my $dumper = Data::Dumper->new([$$ref], ['$v']);
3631     $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
3632     my $str = $dumper->Dump();
3633     if ($str =~ /^\$v/) {
3634         return '${my ' . $str . ' \$v}';
3635     } else {
3636         return $str;
3637     }
3638 }
3639
3640 sub const_sv {
3641     my $self = shift;
3642     my $op = shift;
3643     my $sv = $op->sv;
3644     # the constant could be in the pad (under useithreads)
3645     $sv = $self->padval($op->targ) unless $$sv;
3646     return $sv;
3647 }
3648
3649 sub pp_const {
3650     my $self = shift;
3651     my($op, $cx) = @_;
3652     if ($op->private & OPpCONST_ARYBASE) {
3653         return '$[';
3654     }
3655 #    if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
3656 #       return $self->const_sv($op)->PV;
3657 #    }
3658     my $sv = $self->const_sv($op);
3659     return $self->const($sv, $cx);
3660 }
3661
3662 sub dq {
3663     my $self = shift;
3664     my $op = shift;
3665     my $type = $op->name;
3666     if ($type eq "const") {
3667         return '$[' if $op->private & OPpCONST_ARYBASE;
3668         return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3669     } elsif ($type eq "concat") {
3670         my $first = $self->dq($op->first);
3671         my $last  = $self->dq($op->last);
3672
3673         # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
3674         ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3675             $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
3676             || ($last =~ /^[:'{\[\w_]/ && #'
3677                 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3678
3679         return $first . $last;
3680     } elsif ($type eq "uc") {
3681         return '\U' . $self->dq($op->first->sibling) . '\E';
3682     } elsif ($type eq "lc") {
3683         return '\L' . $self->dq($op->first->sibling) . '\E';
3684     } elsif ($type eq "ucfirst") {
3685         return '\u' . $self->dq($op->first->sibling);
3686     } elsif ($type eq "lcfirst") {
3687         return '\l' . $self->dq($op->first->sibling);
3688     } elsif ($type eq "quotemeta") {
3689         return '\Q' . $self->dq($op->first->sibling) . '\E';
3690     } elsif ($type eq "join") {
3691         return $self->deparse($op->last, 26); # was join($", @ary)
3692     } else {
3693         return $self->deparse($op, 26);
3694     }
3695 }
3696
3697 sub pp_backtick {
3698     my $self = shift;
3699     my($op, $cx) = @_;
3700     # skip pushmark
3701     return single_delim("qx", '`', $self->dq($op->first->sibling));
3702 }
3703
3704 sub dquote {
3705     my $self = shift;
3706     my($op, $cx) = @_;
3707     my $kid = $op->first->sibling; # skip ex-stringify, pushmark
3708     return $self->deparse($kid, $cx) if $self->{'unquote'};
3709     $self->maybe_targmy($kid, $cx,
3710                         sub {single_delim("qq", '"', $self->dq($_[1]))});
3711 }
3712
3713 # OP_STRINGIFY is a listop, but it only ever has one arg
3714 sub pp_stringify { maybe_targmy(@_, \&dquote) }
3715
3716 # tr/// and s/// (and tr[][], tr[]//, tr###, etc)
3717 # note that tr(from)/to/ is OK, but not tr/from/(to)
3718 sub double_delim {
3719     my($from, $to) = @_;
3720     my($succeed, $delim);
3721     if ($from !~ m[/] and $to !~ m[/]) {
3722         return "/$from/$to/";
3723     } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
3724         if (($succeed, $to) = balanced_delim($to) and $succeed) {
3725             return "$from$to";
3726         } else {
3727             for $delim ('/', '"', '#') { # note no `'' -- s''' is special
3728                 return "$from$delim$to$delim" if index($to, $delim) == -1;
3729             }
3730             $to =~ s[/][\\/]g;
3731             return "$from/$to/";
3732         }
3733     } else {
3734         for $delim ('/', '"', '#') { # note no '
3735             return "$delim$from$delim$to$delim"
3736                 if index($to . $from, $delim) == -1;
3737         }
3738         $from =~ s[/][\\/]g;
3739         $to =~ s[/][\\/]g;
3740         return "/$from/$to/";   
3741     }
3742 }
3743
3744 # Only used by tr///, so backslashes hyphens
3745 sub pchr { # ASCII
3746     my($n) = @_;
3747     if ($n == ord '\\') {
3748         return '\\\\';
3749     } elsif ($n == ord "-") {
3750         return "\\-";
3751     } elsif ($n >= ord(' ') and $n <= ord('~')) {
3752         return chr($n);
3753     } elsif ($n == ord "\a") {
3754         return '\\a';
3755     } elsif ($n == ord "\b") {
3756         return '\\b';
3757     } elsif ($n == ord "\t") {
3758         return '\\t';
3759     } elsif ($n == ord "\n") {
3760         return '\\n';
3761     } elsif ($n == ord "\e") {
3762         return '\\e';
3763     } elsif ($n == ord "\f") {
3764         return '\\f';
3765     } elsif ($n == ord "\r") {
3766         return '\\r';
3767     } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
3768         return '\\c' . chr(ord("@") + $n);
3769     } else {
3770 #       return '\x' . sprintf("%02x", $n);
3771         return '\\' . sprintf("%03o", $n);
3772     }
3773 }
3774
3775 sub collapse {
3776     my(@chars) = @_;
3777     my($str, $c, $tr) = ("");
3778     for ($c = 0; $c < @chars; $c++) {
3779         $tr = $chars[$c];
3780         $str .= pchr($tr);
3781         if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
3782             $chars[$c + 2] == $tr + 2)
3783         {
3784             for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
3785               {}
3786             $str .= "-";
3787             $str .= pchr($chars[$c]);
3788         }
3789     }
3790     return $str;
3791 }
3792
3793 sub tr_decode_byte {
3794     my($table, $flags) = @_;
3795     my(@table) = unpack("s*", $table);
3796     splice @table, 0x100, 1;   # Number of subsequent elements
3797     my($c, $tr, @from, @to, @delfrom, $delhyphen);
3798     if ($table[ord "-"] != -1 and
3799         $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
3800     {
3801         $tr = $table[ord "-"];
3802         $table[ord "-"] = -1;
3803         if ($tr >= 0) {
3804             @from = ord("-");
3805             @to = $tr;
3806         } else { # -2 ==> delete
3807             $delhyphen = 1;
3808         }
3809     }
3810     for ($c = 0; $c < @table; $c++) {
3811         $tr = $table[$c];
3812         if ($tr >= 0) {
3813             push @from, $c; push @to, $tr;
3814         } elsif ($tr == -2) {
3815             push @delfrom, $c;
3816         }
3817     }
3818     @from = (@from, @delfrom);
3819     if ($flags & OPpTRANS_COMPLEMENT) {
3820         my @newfrom = ();
3821         my %from;
3822         @from{@from} = (1) x @from;
3823         for ($c = 0; $c < 256; $c++) {
3824             push @newfrom, $c unless $from{$c};
3825         }
3826         @from = @newfrom;
3827     }
3828     unless ($flags & OPpTRANS_DELETE || !@to) {
3829         pop @to while $#to and $to[$#to] == $to[$#to -1];
3830     }
3831     my($from, $to);
3832     $from = collapse(@from);
3833     $to = collapse(@to);
3834     $from .= "-" if $delhyphen;
3835     return ($from, $to);
3836 }
3837
3838 sub tr_chr {
3839     my $x = shift;
3840     if ($x == ord "-") {
3841         return "\\-";
3842     } elsif ($x == ord "\\") {
3843         return "\\\\";
3844     } else {
3845         return chr $x;
3846     }
3847 }
3848
3849 # XXX This doesn't yet handle all cases correctly either
3850
3851 sub tr_decode_utf8 {
3852     my($swash_hv, $flags) = @_;
3853     my %swash = $swash_hv->ARRAY;
3854     my $final = undef;
3855     $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
3856     my $none = $swash{"NONE"}->IV;
3857     my $extra = $none + 1;
3858     my(@from, @delfrom, @to);
3859     my $line;
3860     foreach $line (split /\n/, $swash{'LIST'}->PV) {
3861         my($min, $max, $result) = split(/\t/, $line);
3862         $min = hex $min;
3863         if (length $max) {
3864             $max = hex $max;
3865         } else {
3866             $max = $min;
3867         }
3868         $result = hex $result;
3869         if ($result == $extra) {
3870             push @delfrom, [$min, $max];
3871         } else {
3872             push @from, [$min, $max];
3873             push @to, [$result, $result + $max - $min];
3874         }
3875     }
3876     for my $i (0 .. $#from) {
3877         if ($from[$i][0] == ord '-') {
3878             unshift @from, splice(@from, $i, 1);
3879             unshift @to, splice(@to, $i, 1);
3880             last;
3881         } elsif ($from[$i][1] == ord '-') {
3882             $from[$i][1]--;
3883             $to[$i][1]--;
3884             unshift @from, ord '-';
3885             unshift @to, ord '-';
3886             last;
3887         }
3888     }
3889     for my $i (0 .. $#delfrom) {
3890         if ($delfrom[$i][0] == ord '-') {
3891             push @delfrom, splice(@delfrom, $i, 1);
3892             last;
3893         } elsif ($delfrom[$i][1] == ord '-') {
3894             $delfrom[$i][1]--;
3895             push @delfrom, ord '-';
3896             last;
3897         }
3898     }
3899     if (defined $final and $to[$#to][1] != $final) {
3900         push @to, [$final, $final];
3901     }
3902     push @from, @delfrom;
3903     if ($flags & OPpTRANS_COMPLEMENT) {
3904         my @newfrom;
3905         my $next = 0;
3906         for my $i (0 .. $#from) {
3907             push @newfrom, [$next, $from[$i][0] - 1];
3908             $next = $from[$i][1] + 1;
3909         }
3910         @from = ();
3911         for my $range (@newfrom) {
3912             if ($range->[0] <= $range->[1]) {
3913                 push @from, $range;
3914             }
3915         }
3916     }
3917     my($from, $to, $diff);
3918     for my $chunk (@from) {
3919         $diff = $chunk->[1] - $chunk->[0];
3920         if ($diff > 1) {
3921             $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3922         } elsif ($diff == 1) {
3923             $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3924         } else {
3925             $from .= tr_chr($chunk->[0]);
3926         }
3927     }
3928     for my $chunk (@to) {
3929         $diff = $chunk->[1] - $chunk->[0];
3930         if ($diff > 1) {
3931             $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
3932         } elsif ($diff == 1) {
3933             $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
3934         } else {
3935             $to .= tr_chr($chunk->[0]);
3936         }
3937     }
3938     #$final = sprintf("%04x", $final) if defined $final;
3939     #$none = sprintf("%04x", $none) if defined $none;
3940     #$extra = sprintf("%04x", $extra) if defined $extra;
3941     #print STDERR "final: $final\n none: $none\nextra: $extra\n";
3942     #print STDERR $swash{'LIST'}->PV;
3943     return (escape_str($from), escape_str($to));
3944 }
3945
3946 sub pp_trans {
3947     my $self = shift;
3948     my($op, $cx) = @_;
3949     my($from, $to);
3950     if (class($op) eq "PVOP") {
3951         ($from, $to) = tr_decode_byte($op->pv, $op->private);
3952     } else { # class($op) eq "SVOP"
3953         ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
3954     }
3955     my $flags = "";
3956     $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
3957     $flags .= "d" if $op->private & OPpTRANS_DELETE;
3958     $to = "" if $from eq $to and $flags eq "";
3959     $flags .= "s" if $op->private & OPpTRANS_SQUASH;
3960     return "tr" . double_delim($from, $to) . $flags;
3961 }
3962
3963 # Like dq(), but different
3964 sub re_dq {
3965     my $self = shift;
3966     my ($op, $extended) = @_;
3967
3968     my $type = $op->name;
3969     if ($type eq "const") {
3970         return '$[' if $op->private & OPpCONST_ARYBASE;
3971         my $unbacked = re_unback($self->const_sv($op)->as_string);
3972         return re_uninterp_extended(escape_extended_re($unbacked))
3973             if $extended;
3974         return re_uninterp(escape_str($unbacked));
3975     } elsif ($type eq "concat") {
3976         my $first = $self->re_dq($op->first, $extended);
3977         my $last  = $self->re_dq($op->last,  $extended);
3978
3979         # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
3980         ($last =~ /^[A-Z\\\^\[\]_?]/ &&
3981             $first =~ s/([\$@])\^$/${1}{^}/)  # "${^}W" etc
3982             || ($last =~ /^[{\[\w_]/ &&
3983                 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
3984
3985         return $first . $last;
3986     } elsif ($type eq "uc") {
3987         return '\U' . $self->re_dq($op->first->sibling, $extended) . '\E';
3988     } elsif ($type eq "lc") {
3989         return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E';
3990     } elsif ($type eq "ucfirst") {
3991         return '\u' . $self->re_dq($op->first->sibling, $extended);
3992     } elsif ($type eq "lcfirst") {
3993         return '\l' . $self->re_dq($op->first->sibling, $extended);
3994     } elsif ($type eq "quotemeta") {
3995         return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E';
3996     } elsif ($type eq "join") {
3997         return $self->deparse($op->last, 26); # was join($", @ary)
3998     } else {
3999         return $self->deparse($op, 26);
4000     }
4001 }
4002
4003 sub pure_string {
4004     my ($self, $op) = @_;
4005     return 0 if null $op;
4006     my $type = $op->name;
4007
4008     if ($type eq 'const') {
4009         return 1;
4010     }
4011     elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') {
4012         return $self->pure_string($op->first->sibling);
4013     }
4014     elsif ($type eq 'join') {
4015         my $join_op = $op->first->sibling;  # Skip pushmark
4016         return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV;
4017
4018         my $gvop = $join_op->first;
4019         return 0 unless $gvop->name eq 'gvsv';
4020         return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
4021
4022         return 0 unless ${$join_op->sibling} eq ${$op->last};
4023         return 0 unless $op->last->name =~ /^(rv2|pad)av$/;
4024     }
4025     elsif ($type eq 'concat') {
4026         return $self->pure_string($op->first)
4027             && $self->pure_string($op->last);
4028     }
4029     elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
4030         return 1;
4031     }
4032     elsif ($type eq "null" and $op->can('first') and not null $op->first and
4033            $op->first->name eq "null" and $op->first->can('first')
4034            and not null $op->first->first and
4035            $op->first->first->name eq "aelemfast") {
4036         return 1;
4037     }
4038     else {
4039         return 0;
4040     }
4041
4042     return 1;
4043 }
4044
4045 sub regcomp {
4046     my $self = shift;
4047     my($op, $cx, $extended) = @_;
4048     my $kid = $op->first;
4049     $kid = $kid->first if $kid->name eq "regcmaybe";
4050     $kid = $kid->first if $kid->name eq "regcreset";
4051     if ($kid->name eq "null" and !null($kid->first)
4052         and $kid->first->name eq 'pushmark')
4053     {
4054         my $str = '';
4055         $kid = $kid->first->sibling;
4056         while (!null($kid)) {
4057             $str .= $self->re_dq($kid, $extended);
4058             $kid = $kid->sibling;
4059         }
4060         return $str, 1;
4061     }
4062
4063     return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid);
4064     return ($self->deparse($kid, $cx), 0);
4065 }
4066
4067 sub pp_regcomp {
4068     my ($self, $op, $cx) = @_;
4069     return (($self->regcomp($op, $cx, 0))[0]);
4070 }
4071
4072 # osmic acid -- see osmium tetroxide
4073
4074 my %matchwords;
4075 map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
4076     'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
4077     'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi');
4078
4079 sub matchop {
4080     my $self = shift;
4081     my($op, $cx, $name, $delim) = @_;
4082     my $kid = $op->first;
4083     my ($binop, $var, $re) = ("", "", "");
4084     if ($op->flags & OPf_STACKED) {
4085         $binop = 1;
4086         $var = $self->deparse($kid, 20);
4087         $kid = $kid->sibling;
4088     }
4089     my $quote = 1;
4090     my $extended = ($op->pmflags & PMf_EXTENDED);
4091     if (null $kid) {
4092         my $unbacked = re_unback($op->precomp);
4093         if ($extended) {
4094             $re = re_uninterp_extended(escape_extended_re($unbacked));
4095         } else {
4096             $re = re_uninterp(escape_str(re_unback($op->precomp)));
4097         }
4098     } elsif ($kid->name ne 'regcomp') {
4099         carp("found ".$kid->name." where regcomp expected");
4100     } else {
4101         ($re, $quote) = $self->regcomp($kid, 21, $extended);
4102     }
4103     my $flags = "";
4104     $flags .= "c" if $op->pmflags & PMf_CONTINUE;
4105     $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4106     $flags .= "i" if $op->pmflags & PMf_FOLD;
4107     $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4108     $flags .= "o" if $op->pmflags & PMf_KEEP;
4109     $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4110     $flags .= "x" if $op->pmflags & PMf_EXTENDED;
4111     $flags = $matchwords{$flags} if $matchwords{$flags};
4112     if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here
4113         $re =~ s/\?/\\?/g;
4114         $re = "?$re?";
4115     } elsif ($quote) {
4116         $re = single_delim($name, $delim, $re);
4117     }
4118     $re = $re . $flags if $quote;
4119     if ($binop) {
4120         return $self->maybe_parens("$var =~ $re", $cx, 20);
4121     } else {
4122         return $re;
4123     }
4124 }
4125
4126 sub pp_match { matchop(@_, "m", "/") }
4127 sub pp_pushre { matchop(@_, "m", "/") }
4128 sub pp_qr { matchop(@_, "qr", "") }
4129
4130 sub pp_split {
4131     my $self = shift;
4132     my($op, $cx) = @_;
4133     my($kid, @exprs, $ary, $expr);
4134     $kid = $op->first;
4135
4136     # For our kid (an OP_PUSHRE), pmreplroot is never actually the
4137     # root of a replacement; it's either empty, or abused to point to
4138     # the GV for an array we split into (an optimization to save
4139     # assignment overhead). Depending on whether we're using ithreads,
4140     # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
4141     # figures out for us which it is.
4142     my $replroot = $kid->pmreplroot;
4143     my $gv = 0;
4144     if (ref($replroot) eq "B::GV") {
4145         $gv = $replroot;
4146     } elsif (!ref($replroot) and $replroot > 0) {
4147         $gv = $self->padval($replroot);
4148     }
4149     $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
4150
4151     for (; !null($kid); $kid = $kid->sibling) {
4152         push @exprs, $self->deparse($kid, 6);
4153     }
4154
4155     # handle special case of split(), and split(' ') that compiles to /\s+/
4156     $kid = $op->first;
4157     if ($kid->flags & OPf_SPECIAL and $kid->pmflags & PMf_SKIPWHITE) {
4158         $exprs[0] = "' '";
4159     }
4160
4161     $expr = "split(" . join(", ", @exprs) . ")";
4162     if ($ary) {
4163         return $self->maybe_parens("$ary = $expr", $cx, 7);
4164     } else {
4165         return $expr;
4166     }
4167 }
4168
4169 # oxime -- any of various compounds obtained chiefly by the action of
4170 # hydroxylamine on aldehydes and ketones and characterized by the
4171 # bivalent grouping C=NOH [Webster's Tenth]
4172
4173 my %substwords;
4174 map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
4175     'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
4176     'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
4177     'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi');
4178
4179 sub pp_subst {
4180     my $self = shift;
4181     my($op, $cx) = @_;
4182     my $kid = $op->first;
4183     my($binop, $var, $re, $repl) = ("", "", "", "");
4184     if ($op->flags & OPf_STACKED) {
4185         $binop = 1;
4186         $var = $self->deparse($kid, 20);
4187         $kid = $kid->sibling;
4188     }
4189     my $flags = "";
4190     if (null($op->pmreplroot)) {
4191         $repl = $self->dq($kid);
4192         $kid = $kid->sibling;
4193     } else {
4194         $repl = $op->pmreplroot->first; # skip substcont
4195         while ($repl->name eq "entereval") {
4196             $repl = $repl->first;
4197             $flags .= "e";
4198         }
4199         if ($op->pmflags & PMf_EVAL) {
4200             $repl = $self->deparse($repl->first, 0);
4201         } else {
4202             $repl = $self->dq($repl);   
4203         }
4204     }
4205     my $extended = ($op->pmflags & PMf_EXTENDED);
4206     if (null $kid) {
4207         my $unbacked = re_unback($op->precomp);
4208         if ($extended) {
4209             $re = re_uninterp_extended(escape_extended_re($unbacked));
4210         }
4211         else {
4212             $re = re_uninterp(escape_str($unbacked));
4213         }
4214     } else {
4215         ($re) = $self->regcomp($kid, 1, $extended);
4216     }
4217     $flags .= "e" if $op->pmflags & PMf_EVAL;
4218     $flags .= "g" if $op->pmflags & PMf_GLOBAL;
4219     $flags .= "i" if $op->pmflags & PMf_FOLD;
4220     $flags .= "m" if $op->pmflags & PMf_MULTILINE;
4221     $flags .= "o" if $op->pmflags & PMf_KEEP;
4222     $flags .= "s" if $op->pmflags & PMf_SINGLELINE;
4223     $flags .= "x" if $extended;
4224     $flags = $substwords{$flags} if $substwords{$flags};
4225     if ($binop) {
4226         return $self->maybe_parens("$var =~ s"
4227                                    . double_delim($re, $repl) . $flags,
4228                                    $cx, 20);
4229     } else {
4230         return "s". double_delim($re, $repl) . $flags;  
4231     }
4232 }
4233
4234 1;
4235 __END__
4236
4237 =head1 NAME
4238
4239 B::Deparse - Perl compiler backend to produce perl code
4240
4241 =head1 SYNOPSIS
4242
4243 B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
4244         [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
4245
4246 =head1 DESCRIPTION
4247
4248 B::Deparse is a backend module for the Perl compiler that generates
4249 perl source code, based on the internal compiled structure that perl
4250 itself creates after parsing a program. The output of B::Deparse won't
4251 be exactly the same as the original source, since perl doesn't keep
4252 track of comments or whitespace, and there isn't a one-to-one
4253 correspondence between perl's syntactical constructions and their
4254 compiled form, but it will often be close. When you use the B<-p>
4255 option, the output also includes parentheses even when they are not
4256 required by precedence, which can make it easy to see if perl is
4257 parsing your expressions the way you intended.
4258
4259 While B::Deparse goes to some lengths to try to figure out what your
4260 original program was doing, some parts of the language can still trip
4261 it up; it still fails even on some parts of Perl's own test suite. If
4262 you encounter a failure other than the most common ones described in
4263 the BUGS section below, you can help contribute to B::Deparse's
4264 ongoing development by submitting a bug report with a small
4265 example.
4266
4267 =head1 OPTIONS
4268
4269 As with all compiler backend options, these must follow directly after
4270 the '-MO=Deparse', separated by a comma but not any white space.
4271
4272 =over 4
4273
4274 =item B<-d>
4275
4276 Output data values (when they appear as constants) using Data::Dumper.
4277 Without this option, B::Deparse will use some simple routines of its
4278 own for the same purpose. Currently, Data::Dumper is better for some
4279 kinds of data (such as complex structures with sharing and
4280 self-reference) while the built-in routines are better for others
4281 (such as odd floating-point values).
4282
4283 =item B<-f>I<FILE>
4284
4285 Normally, B::Deparse deparses the main code of a program, and all the subs
4286 defined in the same file. To include subs defined in other files, pass the
4287 B<-f> option with the filename. You can pass the B<-f> option several times, to
4288 include more than one secondary file.  (Most of the time you don't want to
4289 use it at all.)  You can also use this option to include subs which are
4290 defined in the scope of a B<#line> directive with two parameters.
4291
4292 =item B<-l>
4293
4294 Add '#line' declarations to the output based on the line and file
4295 locations of the original code.
4296
4297 =item B<-p>
4298
4299 Print extra parentheses. Without this option, B::Deparse includes
4300 parentheses in its output only when they are needed, based on the
4301 structure of your program. With B<-p>, it uses parentheses (almost)
4302 whenever they would be legal. This can be useful if you are used to
4303 LISP, or if you want to see how perl parses your input. If you say
4304
4305     if ($var & 0x7f == 65) {print "Gimme an A!"}
4306     print ($which ? $a : $b), "\n";
4307     $name = $ENV{USER} or "Bob";
4308
4309 C<B::Deparse,-p> will print
4310
4311     if (($var & 0)) {
4312         print('Gimme an A!')
4313     };
4314     (print(($which ? $a : $b)), '???');
4315     (($name = $ENV{'USER'}) or '???')
4316
4317 which probably isn't what you intended (the C<'???'> is a sign that
4318 perl optimized away a constant value).
4319
4320 =item B<-P>
4321
4322 Disable prototype checking. With this option, all function calls are
4323 deparsed as if no prototype was defined for them. In other words,
4324
4325     perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
4326
4327 will print
4328
4329     sub foo (\@) {
4330         1;
4331     }
4332     &foo(\@x);
4333
4334 making clear how the parameters are actually passed to C<foo>.
4335
4336 =item B<-q>
4337
4338 Expand double-quoted strings into the corresponding combinations of
4339 concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
4340 instance, print
4341
4342     print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
4343
4344 as
4345
4346     print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
4347           . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
4348
4349 Note that the expanded form represents the way perl handles such
4350 constructions internally -- this option actually turns off the reverse
4351 translation that B::Deparse usually does. On the other hand, note that
4352 C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
4353 of $y into a string before doing the assignment.
4354
4355 =item B<-s>I<LETTERS>
4356
4357 Tweak the style of B::Deparse's output. The letters should follow
4358 directly after the 's', with no space or punctuation. The following
4359 options are available:
4360
4361 =over 4
4362
4363 =item B<C>
4364
4365 Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
4366
4367     if (...) {
4368          ...
4369     } else {
4370          ...
4371     }
4372
4373 instead of
4374
4375     if (...) {
4376          ...
4377     }
4378     else {
4379          ...
4380     }
4381
4382 The default is not to cuddle.
4383
4384 =item B<i>I<NUMBER>
4385
4386 Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
4387
4388 =item B<T>
4389
4390 Use tabs for each 8 columns of indent. The default is to use only spaces.
4391 For instance, if the style options are B<-si4T>, a line that's indented
4392 3 times will be preceded by one tab and four spaces; if the options were
4393 B<-si8T>, the same line would be preceded by three tabs.
4394
4395 =item B<v>I<STRING>B<.>
4396
4397 Print I<STRING> for the value of a constant that can't be determined
4398 because it was optimized away (mnemonic: this happens when a constant
4399 is used in B<v>oid context). The end of the string is marked by a period.
4400 The string should be a valid perl expression, generally a constant.
4401 Note that unless it's a number, it probably needs to be quoted, and on
4402 a command line quotes need to be protected from the shell. Some
4403 conventional values include 0, 1, 42, '', 'foo', and
4404 'Useless use of constant omitted' (which may need to be
4405 B<-sv"'Useless use of constant omitted'.">
4406 or something similar depending on your shell). The default is '???'.
4407 If you're using B::Deparse on a module or other file that's require'd,
4408 you shouldn't use a value that evaluates to false, since the customary
4409 true constant at the end of a module will be in void context when the
4410 file is compiled as a main program.
4411
4412 =back
4413
4414 =item B<-x>I<LEVEL>
4415
4416 Expand conventional syntax constructions into equivalent ones that expose
4417 their internal operation. I<LEVEL> should be a digit, with higher values
4418 meaning more expansion. As with B<-q>, this actually involves turning off
4419 special cases in B::Deparse's normal operations.
4420
4421 If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
4422 while loops with continue blocks; for instance
4423
4424     for ($i = 0; $i < 10; ++$i) {
4425         print $i;
4426     }
4427
4428 turns into
4429
4430     $i = 0;
4431     while ($i < 10) {
4432         print $i;
4433     } continue {
4434         ++$i
4435     }
4436
4437 Note that in a few cases this translation can't be perfectly carried back
4438 into the source code -- if the loop's initializer declares a my variable,
4439 for instance, it won't have the correct scope outside of the loop.
4440
4441 If I<LEVEL> is at least 5, C<use> declarations will be translated into
4442 C<BEGIN> blocks containing calls to C<require> and C<import>; for
4443 instance,
4444
4445     use strict 'refs';
4446
4447 turns into
4448
4449     sub BEGIN {
4450         require strict;
4451         do {
4452             'strict'->import('refs')
4453         };
4454     }
4455
4456 If I<LEVEL> is at least 7, C<if> statements will be translated into
4457 equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
4458
4459     print 'hi' if $nice;
4460     if ($nice) {
4461         print 'hi';
4462     }
4463     if ($nice) {
4464         print 'hi';
4465     } else {
4466         print 'bye';
4467     }
4468
4469 turns into
4470
4471     $nice and print 'hi';
4472     $nice and do { print 'hi' };
4473     $nice ? do { print 'hi' } : do { print 'bye' };
4474
4475 Long sequences of elsifs will turn into nested ternary operators, which
4476 B::Deparse doesn't know how to indent nicely.
4477
4478 =back
4479
4480 =head1 USING B::Deparse AS A MODULE
4481
4482 =head2 Synopsis
4483
4484     use B::Deparse;
4485     $deparse = B::Deparse->new("-p", "-sC");
4486     $body = $deparse->coderef2text(\&func);
4487     eval "sub func $body"; # the inverse operation
4488
4489 =head2 Description
4490
4491 B::Deparse can also be used on a sub-by-sub basis from other perl
4492 programs.
4493
4494 =head2 new
4495
4496     $deparse = B::Deparse->new(OPTIONS)
4497
4498 Create an object to store the state of a deparsing operation and any
4499 options. The options are the same as those that can be given on the
4500 command line (see L</OPTIONS>); options that are separated by commas
4501 after B<-MO=Deparse> should be given as separate strings. Some
4502 options, like B<-u>, don't make sense for a single subroutine, so
4503 don't pass them.
4504
4505 =head2 ambient_pragmas
4506
4507     $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
4508
4509 The compilation of a subroutine can be affected by a few compiler
4510 directives, B<pragmas>. These are:
4511
4512 =over 4
4513
4514 =item *
4515
4516 use strict;
4517
4518 =item *
4519
4520 use warnings;
4521
4522 =item *
4523
4524 Assigning to the special variable $[
4525
4526 =item *
4527
4528 use integer;
4529
4530 =item *
4531
4532 use bytes;
4533
4534 =item *
4535
4536 use utf8;
4537
4538 =item *
4539
4540 use re;
4541
4542 =back
4543
4544 Ordinarily, if you use B::Deparse on a subroutine which has
4545 been compiled in the presence of one or more of these pragmas,
4546 the output will include statements to turn on the appropriate
4547 directives. So if you then compile the code returned by coderef2text,
4548 it will behave the same way as the subroutine which you deparsed.
4549
4550 However, you may know that you intend to use the results in a
4551 particular context, where some pragmas are already in scope. In
4552 this case, you use the B<ambient_pragmas> method to describe the
4553 assumptions you wish to make.
4554
4555 Not all of the options currently have any useful effect. See
4556 L</BUGS> for more details.
4557
4558 The parameters it accepts are:
4559
4560 =over 4
4561
4562 =item strict
4563
4564 Takes a string, possibly containing several values separated
4565 by whitespace. The special values "all" and "none" mean what you'd
4566 expect.
4567
4568     $deparse->ambient_pragmas(strict => 'subs refs');
4569
4570 =item $[
4571
4572 Takes a number, the value of the array base $[.
4573
4574 =item bytes
4575
4576 =item utf8
4577
4578 =item integer
4579
4580 If the value is true, then the appropriate pragma is assumed to
4581 be in the ambient scope, otherwise not.
4582
4583 =item re
4584
4585 Takes a string, possibly containing a whitespace-separated list of
4586 values. The values "all" and "none" are special. It's also permissible
4587 to pass an array reference here.
4588
4589     $deparser->ambient_pragmas(re => 'eval');
4590
4591
4592 =item warnings
4593
4594 Takes a string, possibly containing a whitespace-separated list of
4595 values. The values "all" and "none" are special, again. It's also
4596 permissible to pass an array reference here.
4597
4598     $deparser->ambient_pragmas(warnings => [qw[void io]]);
4599
4600 If one of the values is the string "FATAL", then all the warnings
4601 in that list will be considered fatal, just as with the B<warnings>
4602 pragma itself. Should you need to specify that some warnings are
4603 fatal, and others are merely enabled, you can pass the B<warnings>
4604 parameter twice:
4605
4606     $deparser->ambient_pragmas(
4607         warnings => 'all',
4608         warnings => [FATAL => qw/void io/],
4609     );
4610
4611 See L<perllexwarn> for more information about lexical warnings.
4612
4613 =item hint_bits
4614
4615 =item warning_bits
4616
4617 These two parameters are used to specify the ambient pragmas in
4618 the format used by the special variables $^H and ${^WARNING_BITS}.
4619
4620 They exist principally so that you can write code like:
4621
4622     { my ($hint_bits, $warning_bits);
4623     BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
4624     $deparser->ambient_pragmas (
4625         hint_bits    => $hint_bits,
4626         warning_bits => $warning_bits,
4627         '$['         => 0 + $[
4628     ); }
4629
4630 which specifies that the ambient pragmas are exactly those which
4631 are in scope at the point of calling.
4632
4633 =back
4634
4635 =head2 coderef2text
4636
4637     $body = $deparse->coderef2text(\&func)
4638     $body = $deparse->coderef2text(sub ($$) { ... })
4639
4640 Return source code for the body of a subroutine (a block, optionally
4641 preceded by a prototype in parens), given a reference to the
4642 sub. Because a subroutine can have no names, or more than one name,
4643 this method doesn't return a complete subroutine definition -- if you
4644 want to eval the result, you should prepend "sub subname ", or "sub "
4645 for an anonymous function constructor. Unless the sub was defined in
4646 the main:: package, the code will include a package declaration.
4647
4648 =head1 BUGS
4649
4650 =over 4
4651
4652 =item *
4653
4654 The only pragmas to be completely supported are: C<use warnings>,
4655 C<use strict 'refs'>, C<use bytes>, and C<use integer>. (C<$[>, which
4656 behaves like a pragma, is also supported.)
4657
4658 Excepting those listed above, we're currently unable to guarantee that
4659 B::Deparse will produce a pragma at the correct point in the program.
4660 (Specifically, pragmas at the beginning of a block often appear right
4661 before the start of the block instead.)
4662 Since the effects of pragmas are often lexically scoped, this can mean
4663 that the pragma holds sway over a different portion of the program
4664 than in the input file.
4665
4666 =item *
4667
4668 In fact, the above is a specific instance of a more general problem:
4669 we can't guarantee to produce BEGIN blocks or C<use> declarations in
4670 exactly the right place. So if you use a module which affects compilation
4671 (such as by over-riding keywords, overloading constants or whatever)
4672 then the output code might not work as intended.
4673
4674 This is the most serious outstanding problem, and will require some help
4675 from the Perl core to fix.
4676
4677 =item *
4678
4679 If a keyword is over-ridden, and your program explicitly calls
4680 the built-in version by using CORE::keyword, the output of B::Deparse
4681 will not reflect this. If you run the resulting code, it will call
4682 the over-ridden version rather than the built-in one. (Maybe there
4683 should be an option to B<always> print keyword calls as C<CORE::name>.)
4684
4685 =item *
4686
4687 Some constants don't print correctly either with or without B<-d>.
4688 For instance, neither B::Deparse nor Data::Dumper know how to print
4689 dual-valued scalars correctly, as in:
4690
4691     use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
4692
4693 =item *
4694
4695 An input file that uses source filtering probably won't be deparsed into
4696 runnable code, because it will still include the B<use> declaration
4697 for the source filtering module, even though the code that is
4698 produced is already ordinary Perl which shouldn't be filtered again.
4699
4700 =item *
4701
4702 Optimised away statements are rendered as '???'. This includes statements that
4703 have a compile-time side-effect, such as the obscure
4704
4705     my $x if 0;
4706
4707 which is not, consequently, deparsed correctly.
4708
4709 =item *
4710
4711 Lexical (my) variables declared in scopes external to a subroutine
4712 appear in code2ref output text as package variables. This is a tricky
4713 problem, as perl has no native facility for refering to a lexical variable
4714 defined within a different scope, although L<PadWalker> is a good start.
4715
4716 =item *
4717
4718 There are probably many more bugs on non-ASCII platforms (EBCDIC).
4719
4720 =back
4721
4722 =head1 AUTHOR
4723
4724 Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
4725 by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
4726 Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
4727 Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael
4728 Garcia-Suarez.
4729
4730 =cut