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