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