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