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