source: for-distributions/trunk/bin/windows/perl/lib/B/Deparse.pm@ 14489

Last change on this file since 14489 was 14489, checked in by oranfry, 17 years ago

upgrading to perl 5.8

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