home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 March / PCWorld_2003-03_cd.bin / Software / Topware / activeperl / ActivePerl / Perl / lib / B / Deparse.pm < prev    next >
Encoding:
Perl POD Document  |  2002-06-19  |  126.3 KB  |  4,234 lines

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