This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #116677] always deparse <> as either glob or readline
[perl5.git] / lib / B / Deparse.pm
CommitLineData
6e90668e 1# B::Deparse.pm
4ca8de37
SM
2# Copyright (c) 1998-2000, 2002, 2003, 2004, 2005, 2006 Stephen McCamant.
3# All rights reserved.
6e90668e
SM
4# This module is free software; you can redistribute and/or modify
5# it under the same terms as Perl itself.
6
7# This is based on the module of the same name by Malcolm Beattie,
8# but essentially none of his code remains.
9
a798dbf2 10package B::Deparse;
ff97752d 11use Carp;
51a5edaf 12use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
bd0865ec 13 OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
c8ec376c 14 OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS
ce4e655d 15 OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
3ed82cfc 16 OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
5e462669 17 OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST
fedf30e1 18 OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE
d989cdac 19 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
03b8f76d 20 SVs_PADTMP SVpad_TYPED
e95ab0c0 21 CVf_METHOD CVf_LVALUE
2be95ceb 22 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
fedf30e1 23 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED PMf_EXTENDED_MORE
bb9bfaa4 24 PADNAMEt_OUTER
fedf30e1
DM
25 MDEREF_reload
26 MDEREF_AV_pop_rv2av_aelem
27 MDEREF_AV_gvsv_vivify_rv2av_aelem
28 MDEREF_AV_padsv_vivify_rv2av_aelem
29 MDEREF_AV_vivify_rv2av_aelem
30 MDEREF_AV_padav_aelem
31 MDEREF_AV_gvav_aelem
32 MDEREF_HV_pop_rv2hv_helem
33 MDEREF_HV_gvsv_vivify_rv2hv_helem
34 MDEREF_HV_padsv_vivify_rv2hv_helem
35 MDEREF_HV_vivify_rv2hv_helem
36 MDEREF_HV_padhv_helem
37 MDEREF_HV_gvhv_helem
38 MDEREF_ACTION_MASK
39 MDEREF_INDEX_none
40 MDEREF_INDEX_const
41 MDEREF_INDEX_padsv
42 MDEREF_INDEX_gvsv
43 MDEREF_INDEX_MASK
44 MDEREF_FLAG_last
45 MDEREF_MASK
46 MDEREF_SHIFT
47 );
48
18371617 49$VERSION = '1.36';
a798dbf2 50use strict;
2ae48fff 51use vars qw/$AUTOLOAD/;
34a48b4b 52use warnings ();
149758b3 53require feature;
a798dbf2 54
aa381260 55BEGIN {
ff0cf12f 56 # List version-specific constants here.
2be95ceb
NC
57 # Easiest way to keep this code portable between version looks to
58 # be to fake up a dummy constant that will never actually be true.
59 foreach (qw(OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED OPpCONST_NOVER
ff0cf12f 60 OPpPAD_STATE PMf_SKIPWHITE RXf_SKIPWHITE
b77472f9 61 RXf_PMf_CHARSET RXf_PMf_KEEPCOPY CVf_ANONCONST
24fcb59f 62 CVf_LOCKED OPpREVERSE_INPLACE OPpSUBSTR_REPL_FIRST
bcff4148 63 PMf_NONDESTRUCT OPpCONST_ARYBASE OPpEVAL_BYTES
9187b6e4
FC
64 OPpLVREF_TYPE OPpLVREF_SV OPpLVREF_AV OPpLVREF_HV
65 OPpLVREF_CV OPpLVREF_ELEM SVpad_STATE)) {
ff0cf12f 66 eval { import B $_ };
2be95ceb
NC
67 no strict 'refs';
68 *{$_} = sub () {0} unless *{$_}{CODE};
69 }
aa381260
NC
70}
71
6e90668e
SM
72# Changes between 0.50 and 0.51:
73# - fixed nulled leave with live enter in sort { }
74# - fixed reference constants (\"str")
75# - handle empty programs gracefully
c4a6f826 76# - handle infinite loops (for (;;) {}, while (1) {})
e38ccfd9 77# - differentiate between 'for my $x ...' and 'my $x; for $x ...'
6e90668e
SM
78# - various minor cleanups
79# - moved globals into an object
e38ccfd9 80# - added '-u', like B::C
6e90668e
SM
81# - package declarations using cop_stash
82# - subs, formats and code sorted by cop_seq
f6f9bdb7 83# Changes between 0.51 and 0.52:
4d1ff10f 84# - added pp_threadsv (special variables under USE_5005THREADS)
f6f9bdb7 85# - added documentation
bd0865ec 86# Changes between 0.52 and 0.53:
9d2c6865 87# - many changes adding precedence contexts and associativity
e38ccfd9 88# - added '-p' and '-s' output style options
9d2c6865 89# - various other minor fixes
bd0865ec 90# Changes between 0.53 and 0.54:
e38ccfd9 91# - added support for new 'for (1..100)' optimization,
d7f5b6da 92# thanks to Gisle Aas
bd0865ec 93# Changes between 0.54 and 0.55:
90be192f
SM
94# - added support for new qr// construct
95# - added support for new pp_regcreset OP
bd0865ec 96# Changes between 0.55 and 0.56:
f5aa8f4e
SM
97# - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
98# - fixed $# on non-lexicals broken in last big rewrite
99# - added temporary fix for change in opcode of OP_STRINGIFY
e38ccfd9 100# - fixed problem in 0.54's for() patch in 'for (@ary)'
f5aa8f4e 101# - fixed precedence in conditional of ?:
e38ccfd9 102# - tweaked list paren elimination in 'my($x) = @_'
f5aa8f4e
SM
103# - made continue-block detection trickier wrt. null ops
104# - fixed various prototype problems in pp_entersub
105# - added support for sub prototypes that never get GVs
106# - added unquoting for special filehandle first arg in truncate
e38ccfd9 107# - print doubled rv2gv (a bug) as '*{*GV}' instead of illegal '**GV'
f5aa8f4e 108# - added semicolons at the ends of blocks
e38ccfd9 109# - added -l '#line' declaration option -- fixes cmd/subval.t 27,28
bd0865ec
GS
110# Changes between 0.56 and 0.561:
111# - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
112# - used new B.pm symbolic constants (done by Nick Ing-Simmons)
113# Changes between 0.561 and 0.57:
114# - stylistic changes to symbolic constant stuff
115# - handled scope in s///e replacement code
116# - added unquote option for expanding "" into concats, etc.
117# - split method and proto parts of pp_entersub into separate functions
118# - various minor cleanups
f4a44678
SM
119# Changes after 0.57:
120# - added parens in \&foo (patch by Albert Dvornik)
121# Changes between 0.57 and 0.58:
e38ccfd9 122# - fixed '0' statements that weren't being printed
f4a44678
SM
123# - added methods for use from other programs
124# (based on patches from James Duncan and Hugo van der Sanden)
125# - added -si and -sT to control indenting (also based on a patch from Hugo)
126# - added -sv to print something else instead of '???'
127# - preliminary version of utf8 tr/// handling
3ed82cfc
GS
128# Changes after 0.58:
129# - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
d989cdac 130# - added support for Hugo's new OP_SETSTATE (like nextstate)
3ed82cfc
GS
131# Changes between 0.58 and 0.59
132# - added support for Chip's OP_METHOD_NAMED
133# - added support for Ilya's OPpTARGET_MY optimization
e38ccfd9 134# - elided arrows before '()' subscripts when possible
58cccf98 135# Changes between 0.59 and 0.60
c4a6f826 136# - support for method attributes was added
58cccf98
SM
137# - some warnings fixed
138# - separate recognition of constant subs
c4a6f826 139# - rewrote continue block handling, now recognizing for loops
58cccf98 140# - added more control of expanding control structures
c7f67cde
RH
141# Changes between 0.60 and 0.61 (mostly by Robin Houston)
142# - many bug-fixes
143# - support for pragmas and 'use'
144# - support for the little-used $[ variable
145# - support for __DATA__ sections
146# - UTF8 support
147# - BEGIN, CHECK, INIT and END blocks
148# - scoping of subroutine declarations fixed
149# - compile-time output from the input program can be suppressed, so that the
150# output is just the deparsed code. (a change to O.pm in fact)
151# - our() declarations
152# - *all* the known bugs are now listed in the BUGS section
153# - comprehensive test mechanism (TEST -deparse)
9a58b761
RGS
154# Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez)
155# - bug-fixes
156# - new switch -P
157# - support for command-line switches (-l, -0, etc.)
d989cdac
SM
158# Changes between 0.63 and 0.64
159# - support for //, CHECK blocks, and assertions
160# - improved handling of foreach loops and lexicals
161# - option to use Data::Dumper for constants
162# - more bug fixes
163# - discovered lots more bugs not yet fixed
0d863452
RH
164#
165# ...
166#
167# Changes between 0.72 and 0.73
168# - support new switch constructs
6e90668e
SM
169
170# Todo:
2a9e2f8a
RH
171# (See also BUGS section at the end of this file)
172#
f4a44678
SM
173# - finish tr/// changes
174# - add option for even more parens (generalize \&foo change)
90be192f 175# - left/right context
58cccf98 176# - copy comments (look at real text with $^P?)
f5aa8f4e 177# - avoid semis in one-statement blocks
9d2c6865 178# - associativity of &&=, ||=, ?:
6e90668e
SM
179# - ',' => '=>' (auto-unquote?)
180# - break long lines ("\r" as discretionary break?)
f4a44678
SM
181# - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
182# - more style options: brace style, hex vs. octal, quotes, ...
183# - print big ints as hex/octal instead of decimal (heuristic?)
e38ccfd9 184# - handle 'my $x if 0'?
6e90668e
SM
185# - version using op_next instead of op_first/sibling?
186# - avoid string copies (pass arrays, one big join?)
9d2c6865 187# - here-docs?
6e90668e 188
d989cdac 189# Current test.deparse failures
d989cdac
SM
190# comp/hints 6 - location of BEGIN blocks wrt. block openings
191# run/switchI 1 - missing -I switches entirely
192# perl -Ifoo -e 'print @INC'
193# op/caller 2 - warning mask propagates backwards before warnings::register
194# 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register'
195# op/getpid 2 - can't assign to shared my() declaration (threads only)
196# 'my $x : shared = 5'
c4a6f826 197# op/override 7 - parens on overridden require change v-string interpretation
d989cdac
SM
198# 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6'
199# c.f. 'BEGIN { *f = sub {0} }; f 2'
200# op/pat 774 - losing Unicode-ness of Latin1-only strings
201# 'use charnames ":short"; $x="\N{latin:a with acute}"'
202# op/recurse 12 - missing parens on recursive call makes it look like method
203# 'sub f { f($x) }'
204# op/subst 90 - inconsistent handling of utf8 under "use utf8"
205# op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open
206# op/tiehandle compile - "use strict" deparsed in the wrong place
207# uni/tr_ several
208# ext/B/t/xref 11 - line numbers when we add newlines to one-line subs
209# ext/Data/Dumper/t/dumper compile
210# ext/DB_file/several
211# ext/Encode/several
212# ext/Ernno/Errno warnings
213# ext/IO/lib/IO/t/io_sel 23
214# ext/PerlIO/t/encoding compile
215# ext/POSIX/t/posix 6
216# ext/Socket/Socket 8
217# ext/Storable/t/croak compile
218# lib/Attribute/Handlers/t/multi compile
219# lib/bignum/ several
220# lib/charnames 35
221# lib/constant 32
222# lib/English 40
223# lib/ExtUtils/t/bytes 4
224# lib/File/DosGlob compile
225# lib/Filter/Simple/t/data 1
226# lib/Math/BigInt/t/constant 1
227# lib/Net/t/config Deparse-warning
228# lib/overload compile
229# lib/Switch/ several
230# lib/Symbol 4
231# lib/Test/Simple several
232# lib/Term/Complete
233# lib/Tie/File/t/29_downcopy 5
234# lib/vars 22
f5aa8f4e 235
fb0be344 236# Object fields:
6e90668e 237#
de4fa237
FC
238# in_coderef2text:
239# True when deparsing via $deparse->coderef2text; false when deparsing the
240# main program.
241#
6e90668e
SM
242# avoid_local:
243# (local($a), local($b)) and local($a, $b) have the same internal
244# representation but the short form looks better. We notice we can
245# use a large-scale local when checking the list, but need to prevent
d989cdac 246# individual locals too. This hash holds the addresses of OPs that
6e90668e
SM
247# have already had their local-ness accounted for. The same thing
248# is done with my().
249#
250# curcv:
251# CV for current sub (or main program) being deparsed
252#
8510e997 253# curcvlex:
415d4c68
FC
254# Cached hash of lexical variables for curcv: keys are
255# names prefixed with "m" or "o" (representing my/our), and
56cd2ef8
FC
256# each value is an array with two elements indicating the cop_seq
257# of scopes in which a var of that name is valid and a third ele-
258# ment referencing the pad name.
8510e997 259#
34a48b4b
RH
260# curcop:
261# COP for statement being deparsed
262#
6e90668e
SM
263# curstash:
264# name of the current package for deparsed code
265#
266# subs_todo:
c310a5ab
FC
267# array of [cop_seq, CV, is_format?, name] for subs and formats we still
268# want to deparse. The fourth element is a pad name thingy for lexical
269# subs or a string for special blocks. For other subs, it is undef. For
270# lexical subs, CV may be undef, indicating a stub declaration.
6e90668e 271#
f5aa8f4e
SM
272# protos_todo:
273# as above, but [name, prototype] for subs that never got a GV
274#
6e90668e
SM
275# subs_done, forms_done:
276# keys are addresses of GVs for subs and formats we've already
277# deparsed (or at least put into subs_todo)
9d2c6865 278#
0ca62a8e
RH
279# subs_declared
280# keys are names of subs for which we've printed declarations.
4a1ac32e
FC
281# That means we can omit parentheses from the arguments. It also means we
282# need to put CORE:: on core functions of the same name.
0ca62a8e 283#
9f125c4a
FC
284# in_subst_repl
285# True when deparsing the replacement part of a substitution.
286#
c8ec376c
FC
287# in_refgen
288# True when deparsing the argument to \.
289#
9d2c6865 290# parens: -p
f5aa8f4e 291# linenums: -l
bd0865ec 292# unquote: -q
e38ccfd9 293# cuddle: ' ' or '\n', depending on -sC
f4a44678
SM
294# indent_size: -si
295# use_tabs: -sT
296# ex_const: -sv
9d2c6865
SM
297
298# A little explanation of how precedence contexts and associativity
299# work:
300#
301# deparse() calls each per-op subroutine with an argument $cx (short
302# for context, but not the same as the cx* in the perl core), which is
303# a number describing the op's parents in terms of precedence, whether
f5aa8f4e 304# they're inside an expression or at statement level, etc. (see
9d2c6865
SM
305# chart below). When ops with children call deparse on them, they pass
306# along their precedence. Fractional values are used to implement
e38ccfd9 307# associativity ('($x + $y) + $z' => '$x + $y + $y') and related
9d2c6865
SM
308# parentheses hacks. The major disadvantage of this scheme is that
309# it doesn't know about right sides and left sides, so say if you
310# assign a listop to a variable, it can't tell it's allowed to leave
311# the parens off the listop.
312
313# Precedences:
314# 26 [TODO] inside interpolation context ("")
315# 25 left terms and list operators (leftward)
316# 24 left ->
317# 23 nonassoc ++ --
318# 22 right **
319# 21 right ! ~ \ and unary + and -
320# 20 left =~ !~
321# 19 left * / % x
322# 18 left + - .
323# 17 left << >>
324# 16 nonassoc named unary operators
325# 15 nonassoc < > <= >= lt gt le ge
326# 14 nonassoc == != <=> eq ne cmp
327# 13 left &
328# 12 left | ^
329# 11 left &&
330# 10 left ||
331# 9 nonassoc .. ...
332# 8 right ?:
333# 7 right = += -= *= etc.
334# 6 left , =>
335# 5 nonassoc list operators (rightward)
336# 4 right not
337# 3 left and
338# 2 left or xor
339# 1 statement modifiers
d989cdac 340# 0.5 statements, but still print scopes as do { ... }
9d2c6865 341# 0 statement level
93a8ff62 342# -1 format body
9d2c6865
SM
343
344# Nonprinting characters with special meaning:
345# \cS - steal parens (see maybe_parens_unop)
346# \n - newline and indent
347# \t - increase indent
e38ccfd9 348# \b - decrease indent ('outdent')
f5aa8f4e 349# \f - flush left (no indent)
9d2c6865 350# \cK - kill following semicolon, if any
6e90668e 351
ddb55548
FC
352# Semicolon handling:
353# - Individual statements are not deparsed with trailing semicolons.
354# (If necessary, \cK is tacked on to the end.)
355# - Whatever code joins statements together or emits them (lineseq,
356# scopeop, deparse_root) is responsible for adding semicolons where
357# necessary.
358# - use statements are deparsed with trailing semicolons because they are
359# immediately concatenated with the following statement.
360# - indent() removes semicolons wherever it sees \cK.
a7fd8ef6
DM
361
362
5e8c3db2 363BEGIN { for (qw[ const stringify rv2sv list glob pushmark null aelem
fedf30e1 364 nextstate dbstate rv2av rv2hv helem custom ]) {
76e14ed3
S
365 eval "sub OP_\U$_ () { " . opnumber($_) . "}"
366}}
a7fd8ef6
DM
367
368# _pessimise_walk(): recursively walk the optree of a sub,
369# possibly undoing optimisations along the way.
370
371sub _pessimise_walk {
372 my ($self, $startop) = @_;
373
374 return unless $$startop;
375 my ($op, $prevop);
376 for ($op = $startop; $$op; $prevop = $op, $op = $op->sibling) {
377 my $ppname = $op->name;
378
379 # pessimisations start here
380
381 if ($ppname eq "padrange") {
382 # remove PADRANGE:
d5524600 383 # the original optimisation either (1) changed this:
a7fd8ef6 384 # pushmark -> (various pad and list and null ops) -> the_rest
d5524600
DM
385 # or (2), for the = @_ case, changed this:
386 # pushmark -> gv[_] -> rv2av -> (pad stuff) -> the_rest
a7fd8ef6
DM
387 # into this:
388 # padrange ----------------------------------------> the_rest
389 # so we just need to convert the padrange back into a
d5524600
DM
390 # pushmark, and in case (1), set its op_next to op_sibling,
391 # which is the head of the original chain of optimised-away
392 # pad ops, or for (2), set it to sibling->first, which is
393 # the original gv[_].
a7fd8ef6
DM
394
395 $B::overlay->{$$op} = {
76e14ed3 396 type => OP_PUSHMARK,
a7fd8ef6
DM
397 name => 'pushmark',
398 private => ($op->private & OPpLVAL_INTRO),
a7fd8ef6
DM
399 };
400 }
401
402 # pessimisations end here
403
404 if (class($op) eq 'PMOP'
405 && ref($op->pmreplroot)
406 && ${$op->pmreplroot}
407 && $op->pmreplroot->isa( 'B::OP' ))
408 {
409 $self-> _pessimise_walk($op->pmreplroot);
410 }
411
412 if ($op->flags & OPf_KIDS) {
413 $self-> _pessimise_walk($op->first);
414 }
415
416 }
417}
418
419
420# _pessimise_walk_exe(): recursively walk the op_next chain of a sub,
421# possibly undoing optimisations along the way.
422
423sub _pessimise_walk_exe {
424 my ($self, $startop, $visited) = @_;
425
426 return unless $$startop;
427 return if $visited->{$$startop};
428 my ($op, $prevop);
429 for ($op = $startop; $$op; $prevop = $op, $op = $op->next) {
430 last if $visited->{$$op};
431 $visited->{$$op} = 1;
432 my $ppname = $op->name;
433 if ($ppname =~
434 /^((and|d?or)(assign)?|(map|grep)while|range|cond_expr|once)$/
435 # entertry is also a logop, but its op_other invariably points
436 # into the same chain as the main execution path, so we skip it
437 ) {
438 $self->_pessimise_walk_exe($op->other, $visited);
439 }
440 elsif ($ppname eq "subst") {
441 $self->_pessimise_walk_exe($op->pmreplstart, $visited);
442 }
443 elsif ($ppname =~ /^(enter(loop|iter))$/) {
444 # redoop and nextop will already be covered by the main block
445 # of the loop
446 $self->_pessimise_walk_exe($op->lastop, $visited);
447 }
448
449 # pessimisations start here
450 }
451}
452
e63cc694 453# Go through an optree and "remove" some optimisations by using an
a7fd8ef6
DM
454# overlay to selectively modify or un-null some ops. Deparsing in the
455# absence of those optimisations is then easier.
456#
457# Note that older optimisations are not removed, as Deparse was already
458# written to recognise them before the pessimise/overlay system was added.
459
460sub pessimise {
461 my ($self, $root, $start) = @_;
462
463 # walk tree in root-to-branch order
464 $self->_pessimise_walk($root);
465
466 my %visited;
467 # walk tree in execution order
468 $self->_pessimise_walk_exe($start, \%visited);
469}
470
471
6e90668e
SM
472sub null {
473 my $op = shift;
474 return class($op) eq "NULL";
475}
476
477sub todo {
478 my $self = shift;
c310a5ab 479 my($cv, $is_form, $name) = @_;
62ae7cfb
FC
480 my $cvfile = $cv->FILE//'';
481 return unless ($cvfile eq $0 || exists $self->{files}{$cvfile});
6e90668e 482 my $seq;
d989cdac
SM
483 if ($cv->OUTSIDE_SEQ) {
484 $seq = $cv->OUTSIDE_SEQ;
485 } elsif (!null($cv->START) and is_state($cv->START)) {
6e90668e
SM
486 $seq = $cv->START->cop_seq;
487 } else {
488 $seq = 0;
489 }
c310a5ab 490 push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form, $name];
6e90668e
SM
491}
492
493sub next_todo {
494 my $self = shift;
495 my $ent = shift @{$self->{'subs_todo'}};
34a48b4b 496 my $cv = $ent->[1];
c310a5ab 497 if (ref $ent->[3]) { # lexical sub
d4f1bfe7
FC
498 my @text;
499
500 # At this point, we may not yet have deparsed the hints that allow
501 # lexical subroutines to be recognized. So adjust the current
502 # hints and deparse them.
503 # When lex subs cease being experimental, we should be able to
504 # remove this code.
505 {
506 local $^H = $self->{'hints'};
507 local %^H = %{ $self->{'hinthash'} || {} };
508 local ${^WARNING_BITS} = $self->{'warnings'};
509 feature->import("lexical_subs");
510 warnings->unimport("experimental::lexical_subs");
511 # Here we depend on the fact that individual features
512 # will always set the feature bundle to ‘custom’
513 # (== $feature::hint_mask). If we had another specific bundle
514 # enabled previously, normalise it.
515 if (($self->{'hints'} & $feature::hint_mask)
516 != $feature::hint_mask)
517 {
518 if ($self->{'hinthash'}) {
519 delete $self->{'hinthash'}{$_}
520 for grep /^feature_/, keys %{$self->{'hinthash'}};
521 }
522 else { $self->{'hinthash'} = {} }
523 $self->{'hinthash'}
524 = _features_from_bundle(@$self{'hints','hinthash'});
525 }
526 push @text, $self->declare_hinthash($self->{'hinthash'}, \%^H,
527 $self->{indent_size}, $^H);
528 push @text, $self->declare_warnings($self->{'warnings'},
529 ${^WARNING_BITS})
530 unless ($self->{'warnings'} // 'u')
531 eq (${^WARNING_BITS } // 'u');
532 $self->{'warnings'} = ${^WARNING_BITS};
533 $self->{'hints'} = $^H;
534 $self->{'hinthash'} = {%^H};
535 }
536
537 # Now emit the sub itself.
538 my $padname = $ent->[3];
539 my $flags = $padname->FLAGS;
540 push @text,
541 !$cv || $ent->[0] <= $padname->COP_SEQ_RANGE_LOW
542 ? $self->keyword($flags & SVpad_OUR
543 ? "our"
544 : $flags & SVpad_STATE
545 ? "state"
546 : "my") . " "
547 : "";
548 # XXX We would do $self->keyword("sub"), but ‘my CORE::sub’
549 # doesn’t work and ‘my sub’ ignores a &sub in scope. I.e.,
550 # we have a core bug here.
551 push @text, "sub " . substr $padname->PVX, 1;
552 if ($cv) {
553 # my sub foo { }
554 push @text, " " . $self->deparse_sub($cv);
555 $text[-1] =~ s/ ;$/;/;
556 }
557 else {
558 # my sub foo;
559 push @text, ";\n";
560 }
561 return join "", @text;
562 }
34a48b4b 563 my $gv = $cv->GV;
c310a5ab 564 my $name = $ent->[3] // $self->gv_name($gv);
6e90668e 565 if ($ent->[2]) {
7741ceed 566 return $self->keyword("format") . " $name =\n"
e31885a0 567 . $self->deparse_format($ent->[1]). "\n";
6e90668e 568 } else {
d98ae4a6 569 my $use_dec;
34a48b4b 570 if ($name eq "BEGIN") {
d98ae4a6 571 $use_dec = $self->begin_is_use($cv);
d989cdac 572 if (defined ($use_dec) and $self->{'expand'} < 5) {
0e7fe0f0 573 return () if 0 == length($use_dec);
7741ceed 574 $use_dec =~ s/^(use|no)\b/$self->keyword($1)/e;
0e7fe0f0 575 }
34a48b4b 576 }
a0035eb8
RH
577 my $l = '';
578 if ($self->{'linenums'}) {
579 my $line = $gv->LINE;
580 my $file = $gv->FILE;
581 $l = "\n\f#line $line \"$file\"\n";
582 }
127212b2 583 my $p = '';
d49c3562 584 my $stash;
127212b2 585 if (class($cv->STASH) ne "SPECIAL") {
d49c3562 586 $stash = $cv->STASH->NAME;
127212b2 587 if ($stash ne $self->{'curstash'}) {
7741ceed 588 $p = $self->keyword("package") . " $stash;\n";
127212b2
DM
589 $name = "$self->{'curstash'}::$name" unless $name =~ /::/;
590 $self->{'curstash'} = $stash;
591 }
127212b2 592 }
d98ae4a6
FC
593 if ($use_dec) {
594 return "$p$l$use_dec";
595 }
d49c3562
FC
596 if ( $name !~ /::/ and $self->lex_in_scope("&$name")
597 || $self->lex_in_scope("&$name", 1) )
598 {
599 $name = "$self->{'curstash'}::$name";
600 } elsif (defined $stash) {
601 $name =~ s/^\Q$stash\E::(?!\z|.*::)//;
602 }
f518ad75 603 my $ret = "${p}${l}" . $self->keyword("sub") . " $name "
7741ceed 604 . $self->deparse_sub($cv);
f518ad75
FC
605 $self->{'subs_declared'}{$name} = 1;
606 return $ret;
34a48b4b
RH
607 }
608}
609
610# Return a "use" declaration for this BEGIN block, if appropriate
611sub begin_is_use {
612 my ($self, $cv) = @_;
613 my $root = $cv->ROOT;
80dc0729 614 local @$self{qw'curcv curcvlex'} = ($cv);
a7fd8ef6
DM
615 local $B::overlay = {};
616 $self->pessimise($root, $cv->START);
34a48b4b
RH
617#require B::Debug;
618#B::walkoptree($cv->ROOT, "debug");
619 my $lineseq = $root->first;
620 return if $lineseq->name ne "lineseq";
621
622 my $req_op = $lineseq->first->sibling;
623 return if $req_op->name ne "require";
624
625 my $module;
626 if ($req_op->first->private & OPpCONST_BARE) {
627 # Actually it should always be a bareword
628 $module = $self->const_sv($req_op->first)->PV;
629 $module =~ s[/][::]g;
630 $module =~ s/.pm$//;
631 }
632 else {
d989cdac 633 $module = $self->const($self->const_sv($req_op->first), 6);
34a48b4b
RH
634 }
635
636 my $version;
637 my $version_op = $req_op->sibling;
638 return if class($version_op) eq "NULL";
639 if ($version_op->name eq "lineseq") {
640 # We have a version parameter; skip nextstate & pushmark
641 my $constop = $version_op->first->next->next;
642
643 return unless $self->const_sv($constop)->PV eq $module;
644 $constop = $constop->sibling;
a58644de 645 $version = $self->const_sv($constop);
d989cdac
SM
646 if (class($version) eq "IV") {
647 $version = $version->int_value;
648 } elsif (class($version) eq "NV") {
649 $version = $version->NV;
650 } elsif (class($version) ne "PVMG") {
651 # Includes PVIV and PVNV
a58644de
RGS
652 $version = $version->PV;
653 } else {
654 # version specified as a v-string
655 $version = 'v'.join '.', map ord, split //, $version->PV;
656 }
34a48b4b
RH
657 $constop = $constop->sibling;
658 return if $constop->name ne "method_named";
b46e009d 659 return if $self->meth_sv($constop)->PV ne "VERSION";
34a48b4b
RH
660 }
661
662 $lineseq = $version_op->sibling;
663 return if $lineseq->name ne "lineseq";
664 my $entersub = $lineseq->first->sibling;
665 if ($entersub->name eq "stub") {
666 return "use $module $version ();\n" if defined $version;
667 return "use $module ();\n";
668 }
669 return if $entersub->name ne "entersub";
670
671 # See if there are import arguments
672 my $args = '';
673
6ec152c3
RH
674 my $svop = $entersub->first->sibling; # Skip over pushmark
675 return unless $self->const_sv($svop)->PV eq $module;
34a48b4b
RH
676
677 # Pull out the arguments
7d6c333c 678 for ($svop=$svop->sibling; index($svop->name, "method_") != 0;
6ec152c3 679 $svop = $svop->sibling) {
34a48b4b 680 $args .= ", " if length($args);
6ec152c3 681 $args .= $self->deparse($svop, 6);
34a48b4b
RH
682 }
683
684 my $use = 'use';
6ec152c3 685 my $method_named = $svop;
34a48b4b 686 return if $method_named->name ne "method_named";
b46e009d 687 my $method_name = $self->meth_sv($method_named)->PV;
34a48b4b
RH
688
689 if ($method_name eq "unimport") {
690 $use = 'no';
691 }
692
693 # Certain pragmas are dealt with using hint bits,
694 # so we ignore them here
695 if ($module eq 'strict' || $module eq 'integer'
0ced6c29
RGS
696 || $module eq 'bytes' || $module eq 'warnings'
697 || $module eq 'feature') {
34a48b4b
RH
698 return "";
699 }
700
701 if (defined $version && length $args) {
702 return "$use $module $version ($args);\n";
703 } elsif (defined $version) {
704 return "$use $module $version;\n";
705 } elsif (length $args) {
706 return "$use $module ($args);\n";
707 } else {
708 return "$use $module;\n";
6e90668e
SM
709 }
710}
711
6e90668e 712sub stash_subs {
894e98ac 713 my ($self, $pack, $seen) = @_;
34a48b4b
RH
714 my (@ret, $stash);
715 if (!defined $pack) {
716 $pack = '';
717 $stash = \%::;
f5aa8f4e 718 }
34a48b4b
RH
719 else {
720 $pack =~ s/(::)?$/::/;
721 no strict 'refs';
d1dc589d 722 $stash = \%{"main::$pack"};
34a48b4b 723 }
894e98ac
FC
724 return
725 if ($seen ||= {})->{
726 $INC{"overload.pm"} ? overload::StrVal($stash) : $stash
727 }++;
34a48b4b
RH
728 my %stash = svref_2object($stash)->ARRAY;
729 while (my ($key, $val) = each %stash) {
de001ba0
FC
730 my $flags = $val->FLAGS;
731 if ($flags & SVf_ROK) {
03b8f76d
FC
732 # A reference. Dump this if it is a reference to a CV. If it
733 # is a constant acting as a proxy for a full subroutine, then
734 # we may or may not have to dump it. If some form of perl-
735 # space visible code must have created it, be it a use
67359f08 736 # statement, or some direct symbol-table manipulation code that
03b8f76d
FC
737 # we will deparse, then we don’t want to dump it. If it is the
738 # result of a declaration like sub f () { 42 } then we *do*
739 # want to dump it. The only way to distinguish these seems
740 # to be the SVs_PADTMP flag on the constant, which is admit-
741 # tedly a hack.
742 my $class = class(my $referent = $val->RV);
743 if ($class eq "CV") {
744 $self->todo($referent, 0);
745 } elsif (
5e965771 746 $class !~ /^(AV|HV|CV|FM|IO|SPECIAL)\z/
03b8f76d
FC
747 # A more robust way to write that would be this, but B does
748 # not provide the SVt_ constants:
749 # ($referent->FLAGS & B::SVTYPEMASK) < B::SVt_PVAV
750 and $referent->FLAGS & SVs_PADTMP
751 ) {
752 push @{$self->{'protos_todo'}}, [$pack . $key, $val];
67359f08 753 }
de001ba0 754 } elsif ($flags & (SVf_POK|SVf_IOK)) {
a0035eb8
RH
755 # Just a prototype. As an ugly but fairly effective way
756 # to find out if it belongs here is to see if the AUTOLOAD
757 # (if any) for the stash was defined in one of our files.
758 my $A = $stash{"AUTOLOAD"};
759 if (defined ($A) && class($A) eq "GV" && defined($A->CV)
760 && class($A->CV) eq "CV") {
761 my $AF = $A->FILE;
762 next unless $AF eq $0 || exists $self->{'files'}{$AF};
763 }
de001ba0
FC
764 push @{$self->{'protos_todo'}},
765 [$pack . $key, $flags & SVf_POK ? $val->PV: undef];
766 } elsif (class($val) eq "GV") {
34a48b4b 767 if (class(my $cv = $val->CV) ne "SPECIAL") {
f5aa8f4e 768 next if $self->{'subs_done'}{$$val}++;
e31885a0 769 next if $$val != ${$cv->GV}; # Ignore imposters
8510e997 770 $self->todo($cv, 0);
f5aa8f4e 771 }
e31885a0 772 if (class(my $cv = $val->FORM) ne "SPECIAL") {
f5aa8f4e 773 next if $self->{'forms_done'}{$$val}++;
e31885a0
RH
774 next if $$val != ${$cv->GV}; # Ignore imposters
775 $self->todo($cv, 1);
f5aa8f4e 776 }
34a48b4b 777 if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) {
74cd21ba 778 $self->stash_subs($pack . $key, $seen);
34a48b4b 779 }
6e90668e
SM
780 }
781 }
782}
a798dbf2 783
f5aa8f4e
SM
784sub print_protos {
785 my $self = shift;
786 my $ar;
787 my @ret;
788 foreach $ar (@{$self->{'protos_todo'}}) {
03b8f76d
FC
789 my $body = defined $ar->[1]
790 ? ref $ar->[1]
791 ? " () {\n " . $self->const($ar->[1]->RV,0) . ";\n}"
792 : " (". $ar->[1] . ");"
793 : ";";
794 push @ret, "sub " . $ar->[0] . "$body\n";
f5aa8f4e
SM
795 }
796 delete $self->{'protos_todo'};
797 return @ret;
798}
799
9d2c6865
SM
800sub style_opts {
801 my $self = shift;
802 my $opts = shift;
803 my $opt;
804 while (length($opt = substr($opts, 0, 1))) {
805 if ($opt eq "C") {
806 $self->{'cuddle'} = " ";
f4a44678
SM
807 $opts = substr($opts, 1);
808 } elsif ($opt eq "i") {
809 $opts =~ s/^i(\d+)//;
810 $self->{'indent_size'} = $1;
811 } elsif ($opt eq "T") {
812 $self->{'use_tabs'} = 1;
813 $opts = substr($opts, 1);
814 } elsif ($opt eq "v") {
815 $opts =~ s/^v([^.]*)(.|$)//;
816 $self->{'ex_const'} = $1;
9d2c6865 817 }
9d2c6865
SM
818 }
819}
820
f4a44678
SM
821sub new {
822 my $class = shift;
823 my $self = bless {}, $class;
f4a44678 824 $self->{'cuddle'} = "\n";
d989cdac
SM
825 $self->{'curcop'} = undef;
826 $self->{'curstash'} = "main";
827 $self->{'ex_const'} = "'???'";
793e2a70 828 $self->{'expand'} = 0;
d989cdac
SM
829 $self->{'files'} = {};
830 $self->{'indent_size'} = 4;
793e2a70
RH
831 $self->{'linenums'} = 0;
832 $self->{'parens'} = 0;
d989cdac
SM
833 $self->{'subs_todo'} = [];
834 $self->{'unquote'} = 0;
835 $self->{'use_dumper'} = 0;
836 $self->{'use_tabs'} = 0;
08c6f5ec 837
bc6b2ef6 838 $self->{'ambient_arybase'} = 0;
e31885a0 839 $self->{'ambient_warnings'} = undef; # Assume no lexical warnings
a0405c92 840 $self->{'ambient_hints'} = 0;
0ced6c29 841 $self->{'ambient_hinthash'} = undef;
08c6f5ec
RH
842 $self->init();
843
f4a44678 844 while (my $arg = shift @_) {
d989cdac
SM
845 if ($arg eq "-d") {
846 $self->{'use_dumper'} = 1;
847 require Data::Dumper;
848 } elsif ($arg =~ /^-f(.*)/) {
34a48b4b 849 $self->{'files'}{$1} = 1;
d989cdac
SM
850 } elsif ($arg eq "-l") {
851 $self->{'linenums'} = 1;
f4a44678
SM
852 } elsif ($arg eq "-p") {
853 $self->{'parens'} = 1;
acaaef34
RGS
854 } elsif ($arg eq "-P") {
855 $self->{'noproto'} = 1;
f4a44678
SM
856 } elsif ($arg eq "-q") {
857 $self->{'unquote'} = 1;
858 } elsif (substr($arg, 0, 2) eq "-s") {
859 $self->style_opts(substr $arg, 2);
58cccf98
SM
860 } elsif ($arg =~ /^-x(\d)$/) {
861 $self->{'expand'} = $1;
f4a44678
SM
862 }
863 }
864 return $self;
865}
866
810aef70
RH
867{
868 # Mask out the bits that L<warnings::register> uses
869 my $WARN_MASK;
870 BEGIN {
871 $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all};
872 }
873 sub WARN_MASK () {
874 return $WARN_MASK;
875 }
34a48b4b
RH
876}
877
08c6f5ec
RH
878# Initialise the contextual information, either from
879# defaults provided with the ambient_pragmas method,
880# or from perl's own defaults otherwise.
881sub init {
882 my $self = shift;
883
bc6b2ef6 884 $self->{'arybase'} = $self->{'ambient_arybase'};
e31885a0
RH
885 $self->{'warnings'} = defined ($self->{'ambient_warnings'})
886 ? $self->{'ambient_warnings'} & WARN_MASK
887 : undef;
d5ec2987 888 $self->{'hints'} = $self->{'ambient_hints'};
e412117e 889 $self->{'hints'} &= 0xFF if $] < 5.009;
0ced6c29 890 $self->{'hinthash'} = $self->{'ambient_hinthash'};
217aba5d
RH
891
892 # also a convenient place to clear out subs_declared
893 delete $self->{'subs_declared'};
08c6f5ec
RH
894}
895
a798dbf2 896sub compile {
6e90668e 897 my(@args) = @_;
d989cdac 898 return sub {
f4a44678 899 my $self = B::Deparse->new(@args);
d2bc402e
RGS
900 # First deparse command-line args
901 if (defined $^I) { # deparse -i
51a5edaf 902 print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n);
d2bc402e
RGS
903 }
904 if ($^W) { # deparse -w
905 print qq(BEGIN { \$^W = $^W; }\n);
906 }
907 if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0
51a5edaf
RGS
908 my $fs = perlstring($/) || 'undef';
909 my $bs = perlstring($O::savebackslash) || 'undef';
d2bc402e
RGS
910 print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n);
911 }
34a48b4b 912 my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : ();
676456c2
AG
913 my @UNITCHECKs = B::unitcheck_av->isa("B::AV")
914 ? B::unitcheck_av->ARRAY
915 : ();
ece599bd 916 my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : ();
34a48b4b
RH
917 my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : ();
918 my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : ();
c310a5ab
FC
919 my @names = qw(BEGIN UNITCHECK CHECK INIT END);
920 my @blocks = \(@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs);
921 while (@names) {
922 my ($name, $blocks) = (shift @names, shift @blocks);
923 for my $block (@$blocks) {
924 $self->todo($block, 0, $name);
925 }
34a48b4b
RH
926 }
927 $self->stash_subs();
d989cdac
SM
928 local($SIG{"__DIE__"}) =
929 sub {
930 if ($self->{'curcop'}) {
931 my $cop = $self->{'curcop'};
932 my($line, $file) = ($cop->line, $cop->file);
933 print STDERR "While deparsing $file near line $line,\n";
934 }
935 };
6e90668e 936 $self->{'curcv'} = main_cv;
8510e997 937 $self->{'curcvlex'} = undef;
f5aa8f4e 938 print $self->print_protos;
6e90668e 939 @{$self->{'subs_todo'}} =
f4a44678 940 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
a7fd8ef6
DM
941 my $root = main_root;
942 local $B::overlay = {};
943 unless (null $root) {
d4f1bfe7 944 $self->pad_subs($self->{'curcv'});
6436970c
FC
945 # Check for a stub-followed-by-ex-cop, resulting from a program
946 # consisting solely of sub declarations. For backward-compati-
947 # bility (and sane output) we don’t want to emit the stub.
948 # leave
949 # enter
950 # stub
951 # ex-nextstate (or ex-dbstate)
952 my $kid;
953 if ( $root->name eq 'leave'
954 and ($kid = $root->first)->name eq 'enter'
955 and !null($kid = $kid->sibling) and $kid->name eq 'stub'
956 and !null($kid = $kid->sibling) and $kid->name eq 'null'
957 and class($kid) eq 'COP' and null $kid->sibling )
958 {
959 # ignore
960 } else {
961 $self->pessimise($root, main_start);
962 print $self->indent($self->deparse_root($root)), "\n";
963 }
a7fd8ef6 964 }
6e90668e
SM
965 my @text;
966 while (scalar(@{$self->{'subs_todo'}})) {
967 push @text, $self->next_todo;
968 }
6f611a1a 969 print $self->indent(join("", @text)), "\n" if @text;
e31885a0
RH
970
971 # Print __DATA__ section, if necessary
972 no strict 'refs';
96c57f7e
RGS
973 my $laststash = defined $self->{'curcop'}
974 ? $self->{'curcop'}->stash->NAME : $self->{'curstash'};
975 if (defined *{$laststash."::DATA"}{IO}) {
7741ceed 976 print $self->keyword("package") . " $laststash;\n"
127212b2 977 unless $laststash eq $self->{'curstash'};
7741ceed 978 print $self->keyword("__DATA__") . "\n";
96c57f7e 979 print readline(*{$laststash."::DATA"});
e31885a0 980 }
a798dbf2 981 }
a798dbf2
MB
982}
983
f4a44678
SM
984sub coderef2text {
985 my $self = shift;
986 my $sub = shift;
0853f172 987 croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE");
08c6f5ec
RH
988
989 $self->init();
de4fa237 990 local $self->{in_coderef2text} = 1;
f4a44678
SM
991 return $self->indent($self->deparse_sub(svref_2object($sub)));
992}
993
415d4c68 994my %strict_bits = do {
d1718a7c 995 local $^H;
415d4c68
FC
996 map +($_ => strict::bits($_)), qw/refs subs vars/
997};
998
08c6f5ec
RH
999sub ambient_pragmas {
1000 my $self = shift;
bc6b2ef6 1001 my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0);
08c6f5ec
RH
1002
1003 while (@_ > 1) {
1004 my $name = shift();
1005 my $val = shift();
1006
1007 if ($name eq 'strict') {
1008 require strict;
1009
1010 if ($val eq 'none') {
415d4c68 1011 $hint_bits &= $strict_bits{$_} for qw/refs subs vars/;
08c6f5ec
RH
1012 next();
1013 }
1014
1015 my @names;
1016 if ($val eq "all") {
1017 @names = qw/refs subs vars/;
1018 }
1019 elsif (ref $val) {
1020 @names = @$val;
1021 }
1022 else {
a0405c92 1023 @names = split' ', $val;
08c6f5ec 1024 }
415d4c68 1025 $hint_bits |= $strict_bits{$_} for @names;
08c6f5ec
RH
1026 }
1027
bc6b2ef6
Z
1028 elsif ($name eq '$[') {
1029 if (OPpCONST_ARYBASE) {
1030 $arybase = $val;
1031 } else {
1032 croak "\$[ can't be non-zero on this perl" unless $val == 0;
1033 }
1034 }
1035
a0405c92
RH
1036 elsif ($name eq 'integer'
1037 || $name eq 'bytes'
1038 || $name eq 'utf8') {
1039 require "$name.pm";
08c6f5ec 1040 if ($val) {
a0405c92
RH
1041 $hint_bits |= ${$::{"${name}::"}{"hint_bits"}};
1042 }
1043 else {
1044 $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}};
1045 }
1046 }
1047
1048 elsif ($name eq 're') {
1049 require re;
1050 if ($val eq 'none') {
2570cdf1 1051 $hint_bits &= ~re::bits(qw/taint eval/);
a0405c92
RH
1052 next();
1053 }
1054
1055 my @names;
1056 if ($val eq 'all') {
2570cdf1 1057 @names = qw/taint eval/;
a0405c92
RH
1058 }
1059 elsif (ref $val) {
1060 @names = @$val;
08c6f5ec
RH
1061 }
1062 else {
a0405c92 1063 @names = split' ',$val;
08c6f5ec 1064 }
a0405c92 1065 $hint_bits |= re::bits(@names);
08c6f5ec
RH
1066 }
1067
1068 elsif ($name eq 'warnings') {
08c6f5ec 1069 if ($val eq 'none') {
810aef70 1070 $warning_bits = $warnings::NONE;
08c6f5ec
RH
1071 next();
1072 }
1073
1074 my @names;
1075 if (ref $val) {
1076 @names = @$val;
1077 }
1078 else {
1079 @names = split/\s+/, $val;
1080 }
1081
810aef70 1082 $warning_bits = $warnings::NONE if !defined ($warning_bits);
08c6f5ec
RH
1083 $warning_bits |= warnings::bits(@names);
1084 }
1085
1086 elsif ($name eq 'warning_bits') {
1087 $warning_bits = $val;
1088 }
1089
1090 elsif ($name eq 'hint_bits') {
1091 $hint_bits = $val;
1092 }
1093
0ced6c29
RGS
1094 elsif ($name eq '%^H') {
1095 $hinthash = $val;
1096 }
1097
08c6f5ec
RH
1098 else {
1099 croak "Unknown pragma type: $name";
1100 }
1101 }
1102 if (@_) {
1103 croak "The ambient_pragmas method expects an even number of args";
1104 }
1105
bc6b2ef6 1106 $self->{'ambient_arybase'} = $arybase;
08c6f5ec 1107 $self->{'ambient_warnings'} = $warning_bits;
a0405c92 1108 $self->{'ambient_hints'} = $hint_bits;
0ced6c29 1109 $self->{'ambient_hinthash'} = $hinthash;
08c6f5ec
RH
1110}
1111
d989cdac 1112# This method is the inner loop, so try to keep it simple
6e90668e
SM
1113sub deparse {
1114 my $self = shift;
d989cdac 1115 my($op, $cx) = @_;
34a48b4b
RH
1116
1117 Carp::confess("Null op in deparse") if !defined($op)
1118 || class($op) eq "NULL";
3f872cb9 1119 my $meth = "pp_" . $op->name;
9d2c6865 1120 return $self->$meth($op, $cx);
a798dbf2
MB
1121}
1122
6e90668e 1123sub indent {
f4a44678 1124 my $self = shift;
6e90668e 1125 my $txt = shift;
5e617af5
FC
1126 # \cK also swallows a preceding line break when followed by a
1127 # semicolon.
1128 $txt =~ s/\n\cK;//g;
6e90668e
SM
1129 my @lines = split(/\n/, $txt);
1130 my $leader = "";
f4a44678 1131 my $level = 0;
6e90668e
SM
1132 my $line;
1133 for $line (@lines) {
f4a44678
SM
1134 my $cmd = substr($line, 0, 1);
1135 if ($cmd eq "\t" or $cmd eq "\b") {
1136 $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
1137 if ($self->{'use_tabs'}) {
1138 $leader = "\t" x ($level / 8) . " " x ($level % 8);
1139 } else {
1140 $leader = " " x $level;
1141 }
6e90668e
SM
1142 $line = substr($line, 1);
1143 }
f2734596
HE
1144 if (index($line, "\f") > 0) {
1145 $line =~ s/\f/\n/;
1146 }
f5aa8f4e
SM
1147 if (substr($line, 0, 1) eq "\f") {
1148 $line = substr($line, 1); # no indent
1149 } else {
1150 $line = $leader . $line;
1151 }
9d2c6865 1152 $line =~ s/\cK;?//g;
6e90668e
SM
1153 }
1154 return join("\n", @lines);
1155}
1156
d4f1bfe7
FC
1157sub pad_subs {
1158 my ($self, $cv) = @_;
1159 my $padlist = $cv->PADLIST;
1160 my @names = $padlist->ARRAYelt(0)->ARRAY;
1161 my @values = $padlist->ARRAYelt(1)->ARRAY;
1162 my @todo;
2c5ddcd3 1163 PADENTRY:
d4f1bfe7
FC
1164 for my $ix (0.. $#names) { for $_ ($names[$ix]) {
1165 next if class($_) eq "SPECIAL";
1166 my $name = $_->PVX;
679f2252 1167 if (defined $name && $name =~ /^&./) {
d4f1bfe7
FC
1168 my $low = $_->COP_SEQ_RANGE_LOW;
1169 my $flags = $_->FLAGS;
494a4b9c 1170 my $outer = $flags & PADNAMEt_OUTER;
d4f1bfe7 1171 if ($flags & SVpad_OUR) {
bb9bfaa4 1172 push @todo, [$low, undef, 0, $_]
d4f1bfe7 1173 # [seq, no cv, not format, padname]
494a4b9c 1174 unless $outer;
d4f1bfe7
FC
1175 next;
1176 }
1177 my $protocv = $flags & SVpad_STATE
1178 ? $values[$ix]
97d78f94 1179 : $_->PROTOCV;
2c5ddcd3
FC
1180 if (class ($protocv) ne 'CV') {
1181 my $flags = $flags;
1182 my $cv = $cv;
1183 my $name = $_;
1184 while ($flags & PADNAMEt_OUTER && class ($protocv) ne 'CV')
1185 {
1186 $cv = $cv->OUTSIDE;
1187 next PADENTRY if class($cv) eq 'SPECIAL'; # XXX freed?
1188 my $padlist = $cv->PADLIST;
1189 my $ix = $name->PARENT_PAD_INDEX;
1190 $name = $padlist->NAMES->ARRAYelt($ix);
1191 $flags = $name->FLAGS;
1192 $protocv = $flags & SVpad_STATE
1193 ? $padlist->ARRAYelt(1)->ARRAYelt($ix)
1194 : $name->PROTOCV;
1195 }
1196 }
494a4b9c
FC
1197 my $defined_in_this_sub = ${$protocv->OUTSIDE} == $$cv || do {
1198 my $other = $protocv->PADLIST;
1199 $$other && $other->outid == $padlist->id;
1200 };
bb9bfaa4 1201 if ($flags & PADNAMEt_OUTER) {
494a4b9c 1202 next unless $defined_in_this_sub;
bb9bfaa4
FC
1203 push @todo, [$protocv->OUTSIDE_SEQ, $protocv, 0, $_];
1204 next;
1205 }
d4f1bfe7
FC
1206 my $outseq = $protocv->OUTSIDE_SEQ;
1207 if ($outseq <= $low) {
1208 # defined before its name is visible, so it’s gotta be
1209 # declared and defined at once: my sub foo { ... }
1210 push @todo, [$low, $protocv, 0, $_];
1211 }
1212 else {
1213 # declared and defined separately: my sub f; sub f { ... }
494a4b9c
FC
1214 push @todo, [$low, undef, 0, $_];
1215 push @todo, [$outseq, $protocv, 0, $_]
1216 if $defined_in_this_sub;
d4f1bfe7
FC
1217 }
1218 }
1219 }}
1220 @{$self->{'subs_todo'}} =
1221 sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}}, @todo
1222}
1223
6e90668e
SM
1224sub deparse_sub {
1225 my $self = shift;
1226 my $cv = shift;
1227 my $proto = "";
ce4e655d 1228Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL");
34a48b4b
RH
1229Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL");
1230 local $self->{'curcop'} = $self->{'curcop'};
6e90668e
SM
1231 if ($cv->FLAGS & SVf_POK) {
1232 $proto = "(". $cv->PV . ") ";
1233 }
b77472f9 1234 if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) {
6aaf4108
SC
1235 $proto .= ": ";
1236 $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
aa381260 1237 $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
6aaf4108 1238 $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
b77472f9 1239 $proto .= "const " if $cv->CvFLAGS & CVf_ANONCONST;
6aaf4108
SC
1240 }
1241
6e90668e 1242 local($self->{'curcv'}) = $cv;
8510e997 1243 local($self->{'curcvlex'});
0ced6c29
RGS
1244 local(@$self{qw'curstash warnings hints hinthash'})
1245 = @$self{qw'curstash warnings hints hinthash'};
ce4e655d 1246 my $body;
a7fd8ef6
DM
1247 my $root = $cv->ROOT;
1248 local $B::overlay = {};
1249 if (not null $root) {
d4f1bfe7 1250 $self->pad_subs($cv);
a7fd8ef6
DM
1251 $self->pessimise($root, $cv->START);
1252 my $lineseq = $root->first;
ce4e655d
RH
1253 if ($lineseq->name eq "lineseq") {
1254 my @ops;
1255 for(my$o=$lineseq->first; $$o; $o=$o->sibling) {
1256 push @ops, $o;
1257 }
93a8ff62 1258 $body = $self->lineseq(undef, 0, @ops).";";
ce4e655d
RH
1259 my $scope_en = $self->find_scope_en($lineseq);
1260 if (defined $scope_en) {
1261 my $subs = join"", $self->seq_subs($scope_en);
1262 $body .= ";\n$subs" if length($subs);
1263 }
1264 }
1265 else {
a7fd8ef6 1266 $body = $self->deparse($root->first, 0);
ce4e655d 1267 }
de3f1649 1268 }
ce4e655d
RH
1269 else {
1270 my $sv = $cv->const_sv;
1271 if ($$sv) {
1272 # uh-oh. inlinable sub... format it differently
d989cdac 1273 return $proto . "{ " . $self->const($sv, 0) . " }\n";
ce4e655d
RH
1274 } else { # XSUB? (or just a declaration)
1275 return "$proto;\n";
1276 }
6e90668e 1277 }
ce4e655d 1278 return $proto ."{\n\t$body\n\b}" ."\n";
6e90668e
SM
1279}
1280
1281sub deparse_format {
1282 my $self = shift;
1283 my $form = shift;
1284 my @text;
1285 local($self->{'curcv'}) = $form;
8510e997 1286 local($self->{'curcvlex'});
67fc2416 1287 local($self->{'in_format'}) = 1;
0ced6c29
RGS
1288 local(@$self{qw'curstash warnings hints hinthash'})
1289 = @$self{qw'curstash warnings hints hinthash'};
6e90668e 1290 my $op = $form->ROOT;
a7fd8ef6
DM
1291 local $B::overlay = {};
1292 $self->pessimise($op, $form->START);
6e90668e 1293 my $kid;
fb725297
RGS
1294 return "\f." if $op->first->name eq 'stub'
1295 || $op->first->name eq 'nextstate';
6e90668e
SM
1296 $op = $op->first->first; # skip leavewrite, lineseq
1297 while (not null $op) {
1298 $op = $op->sibling; # skip nextstate
1299 my @exprs;
1300 $kid = $op->first->sibling; # skip pushmark
a5b0cd91 1301 push @text, "\f".$self->const_sv($kid)->PV;
6e90668e
SM
1302 $kid = $kid->sibling;
1303 for (; not null $kid; $kid = $kid->sibling) {
93a8ff62 1304 push @exprs, $self->deparse($kid, -1);
31c26a0a 1305 $exprs[-1] =~ s/;\z//;
6e90668e 1306 }
a5b0cd91 1307 push @text, "\f".join(", ", @exprs)."\n" if @exprs;
6e90668e
SM
1308 $op = $op->sibling;
1309 }
a5b0cd91 1310 return join("", @text) . "\f.";
6e90668e
SM
1311}
1312
6e90668e 1313sub is_scope {
a798dbf2 1314 my $op = shift;
3f872cb9
GS
1315 return $op->name eq "leave" || $op->name eq "scope"
1316 || $op->name eq "lineseq"
d989cdac 1317 || ($op->name eq "null" && class($op) eq "UNOP"
3f872cb9 1318 && (is_scope($op->first) || $op->first->name eq "enter"));
6e90668e
SM
1319}
1320
1321sub is_state {
3f872cb9
GS
1322 my $name = $_[0]->name;
1323 return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
6e90668e
SM
1324}
1325
e38ccfd9 1326sub is_miniwhile { # check for one-line loop ('foo() while $y--')
6e90668e 1327 my $op = shift;
d989cdac 1328 return (!null($op) and null($op->sibling)
3f872cb9
GS
1329 and $op->name eq "null" and class($op) eq "UNOP"
1330 and (($op->first->name =~ /^(and|or)$/
1331 and $op->first->first->sibling->name eq "lineseq")
1332 or ($op->first->name eq "lineseq"
6e90668e 1333 and not null $op->first->first->sibling
3f872cb9 1334 and $op->first->first->sibling->name eq "unstack")
6e90668e
SM
1335 ));
1336}
1337
d989cdac
SM
1338# Check if the op and its sibling are the initialization and the rest of a
1339# for (..;..;..) { ... } loop
1340sub is_for_loop {
1341 my $op = shift;
1342 # This OP might be almost anything, though it won't be a
1343 # nextstate. (It's the initialization, so in the canonical case it
eae48c89
Z
1344 # will be an sassign.) The sibling is (old style) a lineseq whose
1345 # first child is a nextstate and whose second is a leaveloop, or
1346 # (new style) an unstack whose sibling is a leaveloop.
d989cdac 1347 my $lseq = $op->sibling;
eae48c89
Z
1348 return 0 unless !is_state($op) and !null($lseq);
1349 if ($lseq->name eq "lineseq") {
d989cdac
SM
1350 if ($lseq->first && !null($lseq->first) && is_state($lseq->first)
1351 && (my $sib = $lseq->first->sibling)) {
1352 return (!null($sib) && $sib->name eq "leaveloop");
1353 }
eae48c89
Z
1354 } elsif ($lseq->name eq "unstack" && ($lseq->flags & OPf_SPECIAL)) {
1355 my $sib = $lseq->sibling;
1356 return $sib && !null($sib) && $sib->name eq "leaveloop";
d989cdac
SM
1357 }
1358 return 0;
1359}
1360
6e90668e
SM
1361sub is_scalar {
1362 my $op = shift;
3f872cb9
GS
1363 return ($op->name eq "rv2sv" or
1364 $op->name eq "padsv" or
1365 $op->name eq "gv" or # only in array/hash constructs
bd0865ec 1366 $op->flags & OPf_KIDS && !null($op->first)
3f872cb9 1367 && $op->first->name eq "gvsv");
6e90668e
SM
1368}
1369
9d2c6865
SM
1370sub maybe_parens {
1371 my $self = shift;
1372 my($text, $cx, $prec) = @_;
1373 if ($prec < $cx # unary ops nest just fine
1374 or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21
1375 or $self->{'parens'})
1376 {
1377 $text = "($text)";
1378 # In a unop, let parent reuse our parens; see maybe_parens_unop
1379 $text = "\cS" . $text if $cx == 16;
1380 return $text;
1381 } else {
1382 return $text;
1383 }
1384}
1385
e38ccfd9 1386# same as above, but get around the 'if it looks like a function' rule
9d2c6865
SM
1387sub maybe_parens_unop {
1388 my $self = shift;
1389 my($name, $kid, $cx) = @_;
1390 if ($cx > 16 or $self->{'parens'}) {
a0035eb8
RH
1391 $kid = $self->deparse($kid, 1);
1392 if ($name eq "umask" && $kid =~ /^\d+$/) {
1393 $kid = sprintf("%#o", $kid);
1394 }
4a1ac32e 1395 return $self->keyword($name) . "($kid)";
9d2c6865
SM
1396 } else {
1397 $kid = $self->deparse($kid, 16);
a0035eb8
RH
1398 if ($name eq "umask" && $kid =~ /^\d+$/) {
1399 $kid = sprintf("%#o", $kid);
1400 }
4a1ac32e 1401 $name = $self->keyword($name);
9d2c6865
SM
1402 if (substr($kid, 0, 1) eq "\cS") {
1403 # use kid's parens
1404 return $name . substr($kid, 1);
1405 } elsif (substr($kid, 0, 1) eq "(") {
1406 # avoid looks-like-a-function trap with extra parens
e38ccfd9 1407 # ('+' can lead to ambiguities)
9d2c6865
SM
1408 return "$name(" . $kid . ")";
1409 } else {
1410 return "$name $kid";
1411 }
1412 }
1413}
1414
1415sub maybe_parens_func {
1416 my $self = shift;
1417 my($func, $text, $cx, $prec) = @_;
1418 if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) {
1419 return "$func($text)";
1420 } else {
1421 return "$func $text";
1422 }
1423}
1424
56cd2ef8
FC
1425sub find_our_type {
1426 my ($self, $name) = @_;
1427 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
5afbd733 1428 my $seq = $self->{'curcop'} ? $self->{'curcop'}->cop_seq : 0;
56cd2ef8
FC
1429 for my $a (@{$self->{'curcvlex'}{"o$name"}}) {
1430 my ($st, undef, $padname) = @$a;
5afbd733 1431 if ($st >= $seq && $padname->FLAGS & SVpad_TYPED) {
56cd2ef8
FC
1432 return $padname->SvSTASH->NAME;
1433 }
1434 }
1435 return '';
1436}
1437
6e90668e
SM
1438sub maybe_local {
1439 my $self = shift;
9d2c6865 1440 my($op, $cx, $text) = @_;
c8ec376c 1441 my $name = $op->name;
9187b6e4
FC
1442 my $our_intro = ($name =~ /^(?:(?:gv|rv2)[ash]v|split|refassign
1443 |lv(?:av)?ref)$/x)
de183bbb
FC
1444 ? OPpOUR_INTRO
1445 : 0;
1446 my $lval_intro = $name eq 'split' ? 0 : OPpLVAL_INTRO;
c8ec376c
FC
1447 # The @a in \(@a) isn't in ref context, but only when the
1448 # parens are there.
1449 my $need_parens = $self->{'in_refgen'} && $name =~ /[ah]v\z/
1450 && ($op->flags & (OPf_PARENS|OPf_REF)) == OPf_PARENS;
de183bbb 1451 if ((my $priv = $op->private) & ($lval_intro|$our_intro)) {
f3515641 1452 my @our_local;
de183bbb 1453 push @our_local, "local" if $priv & $lval_intro;
f3515641 1454 push @our_local, "our" if $priv & $our_intro;
3188a821 1455 my $our_local = join " ", map $self->keyword($_), @our_local;
f3515641 1456 if( $our_local[-1] eq 'our' ) {
640d5d41
FC
1457 if ( $text !~ /^\W(\w+::)*\w+\z/
1458 and !utf8::decode($text) || $text !~ /^\W(\w+::)*\w+\z/
1459 ) {
1460 die "Unexpected our($text)\n";
1461 }
d989cdac 1462 $text =~ s/(\w+::)+//;
56cd2ef8
FC
1463
1464 if (my $type = $self->find_our_type($text)) {
1465 $our_local .= ' ' . $type;
1466 }
8e3542b6 1467 }
c8ec376c
FC
1468 return $need_parens ? "($text)" : $text
1469 if $self->{'avoid_local'}{$$op};
1470 if ($need_parens) {
1471 return "$our_local($text)";
1472 } elsif (want_scalar($op)) {
ce4e655d 1473 return "$our_local $text";
e8d3f51b 1474 } else {
ce4e655d 1475 return $self->maybe_parens_func("$our_local", $text, $cx, 16);
e8d3f51b 1476 }
6e90668e 1477 } else {
c8ec376c 1478 return $need_parens ? "($text)" : $text;
a798dbf2 1479 }
a798dbf2
MB
1480}
1481
3ed82cfc
GS
1482sub maybe_targmy {
1483 my $self = shift;
1484 my($op, $cx, $func, @args) = @_;
1485 if ($op->private & OPpTARGET_MY) {
1486 my $var = $self->padname($op->targ);
1487 my $val = $func->($self, $op, 7, @args);
1488 return $self->maybe_parens("$var = $val", $cx, 7);
1489 } else {
1490 return $func->($self, $op, $cx, @args);
1491 }
1492}
1493
6e90668e
SM
1494sub padname_sv {
1495 my $self = shift;
1496 my $targ = shift;
d989cdac 1497 return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ);
6e90668e
SM
1498}
1499
1500sub maybe_my {
1501 my $self = shift;
8db6f480 1502 my($op, $cx, $text, $padname, $forbid_parens) = @_;
c8ec376c
FC
1503 # The @a in \(@a) isn't in ref context, but only when the
1504 # parens are there.
1505 my $need_parens = !$forbid_parens && $self->{'in_refgen'}
1506 && $op->name =~ /[ah]v\z/
1507 && ($op->flags & (OPf_PARENS|OPf_REF)) == OPf_PARENS;
0ed5b3c8
FC
1508 # The @a in \my @a must not have parens.
1509 if (!$need_parens && $self->{'in_refgen'}) {
1510 $forbid_parens = 1;
1511 }
4c1f658f 1512 if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
bcff4148
FC
1513 # Check $padname->FLAGS for statehood, rather than $op->private,
1514 # because enteriter ops do not carry the flag.
3188a821 1515 my $my =
bcff4148 1516 $self->keyword($padname->FLAGS & SVpad_STATE ? "state" : "my");
56cd2ef8
FC
1517 if ($padname->FLAGS & SVpad_TYPED) {
1518 $my .= ' ' . $padname->SvSTASH->NAME;
1519 }
c8ec376c
FC
1520 if ($need_parens) {
1521 return "$my($text)";
1522 } elsif ($forbid_parens || want_scalar($op)) {
3462b4ac 1523 return "$my $text";
e8d3f51b 1524 } else {
3462b4ac 1525 return $self->maybe_parens_func($my, $text, $cx, 16);
e8d3f51b 1526 }
6e90668e 1527 } else {
c8ec376c 1528 return $need_parens ? "($text)" : $text;
6e90668e
SM
1529 }
1530}
1531
9d2c6865
SM
1532# The following OPs don't have functions:
1533
1534# pp_padany -- does not exist after parsing
9d2c6865 1535
2ae48fff
RGS
1536sub AUTOLOAD {
1537 if ($AUTOLOAD =~ s/^.*::pp_//) {
5e8c3db2
FC
1538 warn "unexpected OP_".
1539 ($_[1]->type == OP_CUSTOM ? "CUSTOM ($AUTOLOAD)" : uc $AUTOLOAD);
2ae48fff
RGS
1540 return "XXX";
1541 } else {
1542 die "Undefined subroutine $AUTOLOAD called";
1543 }
9d2c6865 1544}
6e90668e 1545
611c1e95
IZ
1546sub DESTROY {} # Do not AUTOLOAD
1547
ce4e655d
RH
1548# $root should be the op which represents the root of whatever
1549# we're sequencing here. If it's undefined, then we don't append
1550# any subroutine declarations to the deparsed ops, otherwise we
1551# append appropriate declarations.
58cccf98 1552sub lineseq {
93a8ff62 1553 my($self, $root, $cx, @ops) = @_;
58cccf98 1554 my($expr, @exprs);
ce4e655d
RH
1555
1556 my $out_cop = $self->{'curcop'};
1557 my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef;
1558 my $limit_seq;
1559 if (defined $root) {
1560 $limit_seq = $out_seq;
76df5e8f
DM
1561 my $nseq;
1562 $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling};
ce4e655d
RH
1563 $limit_seq = $nseq if !defined($limit_seq)
1564 or defined($nseq) && $nseq < $limit_seq;
1565 }
1566 $limit_seq = $self->{'limit_seq'}
1567 if defined($self->{'limit_seq'})
1568 && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq);
1569 local $self->{'limit_seq'} = $limit_seq;
09d856fb
CK
1570
1571 $self->walk_lineseq($root, \@ops,
1572 sub { push @exprs, $_[0]} );
1573
93a8ff62
FC
1574 my $sep = $cx ? '; ' : ";\n";
1575 my $body = join($sep, grep {length} @exprs);
ce4e655d 1576 my $subs = "";
67fc2416 1577 if (defined $root && defined $limit_seq && !$self->{'in_format'}) {
ce4e655d
RH
1578 $subs = join "\n", $self->seq_subs($limit_seq);
1579 }
93a8ff62 1580 return join($sep, grep {length} $body, $subs);
6e90668e
SM
1581}
1582
58cccf98 1583sub scopeop {
d989cdac 1584 my($real_block, $self, $op, $cx) = @_;
58cccf98
SM
1585 my $kid;
1586 my @kids;
a0405c92 1587
0ced6c29
RGS
1588 local(@$self{qw'curstash warnings hints hinthash'})
1589 = @$self{qw'curstash warnings hints hinthash'} if $real_block;
58cccf98
SM
1590 if ($real_block) {
1591 $kid = $op->first->sibling; # skip enter
1592 if (is_miniwhile($kid)) {
1593 my $top = $kid->first;
1594 my $name = $top->name;
1595 if ($name eq "and") {
7741ceed 1596 $name = $self->keyword("while");
58cccf98 1597 } elsif ($name eq "or") {
7741ceed 1598 $name = $self->keyword("until");
58cccf98 1599 } else { # no conditional -> while 1 or until 0
7741ceed
FC
1600 return $self->deparse($top->first, 1) . " "
1601 . $self->keyword("while") . " 1";
58cccf98
SM
1602 }
1603 my $cond = $top->first;
1604 my $body = $cond->sibling->first; # skip lineseq
1605 $cond = $self->deparse($cond, 1);
1606 $body = $self->deparse($body, 1);
1607 return "$body $name $cond";
6e90668e 1608 }
58cccf98
SM
1609 } else {
1610 $kid = $op->first;
1611 }
1612 for (; !null($kid); $kid = $kid->sibling) {
1613 push @kids, $kid;
6e90668e 1614 }
d989cdac 1615 if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
73582821 1616 my $body = $self->lineseq($op, 0, @kids);
3188a821
FC
1617 return is_lexical_subs(@kids)
1618 ? $body
1619 : ($self->lex_in_scope("&do") ? "CORE::do" : "do")
1620 . " {\n\t$body\n\b}";
9d2c6865 1621 } else {
93a8ff62 1622 my $lineseq = $self->lineseq($op, $cx, @kids);
7a9b44b9 1623 return (length ($lineseq) ? "$lineseq;" : "");
6e90668e 1624 }
6e90668e
SM
1625}
1626
ce4e655d 1627sub pp_scope { scopeop(0, @_); }
58cccf98
SM
1628sub pp_lineseq { scopeop(0, @_); }
1629sub pp_leave { scopeop(1, @_); }
9d2c6865 1630
d989cdac
SM
1631# This is a special case of scopeop and lineseq, for the case of the
1632# main_root. The difference is that we print the output statements as
1633# soon as we get them, for the sake of impatient users.
1634sub deparse_root {
1635 my $self = shift;
1636 my($op) = @_;
0ced6c29
RGS
1637 local(@$self{qw'curstash warnings hints hinthash'})
1638 = @$self{qw'curstash warnings hints hinthash'};
d989cdac 1639 my @kids;
4ca8de37 1640 return if null $op->first; # Can happen, e.g., for Bytecode without -k
d989cdac
SM
1641 for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) {
1642 push @kids, $kid;
1643 }
09d856fb 1644 $self->walk_lineseq($op, \@kids,
4b1385ee 1645 sub { return unless length $_[0];
5e617af5 1646 print $self->indent($_[0].';');
4b1385ee 1647 print "\n"
5e617af5 1648 unless $_[1] == $#kids;
09d856fb
CK
1649 });
1650}
1651
1652sub walk_lineseq {
1653 my ($self, $op, $kids, $callback) = @_;
1654 my @kids = @$kids;
d989cdac
SM
1655 for (my $i = 0; $i < @kids; $i++) {
1656 my $expr = "";
1657 if (is_state $kids[$i]) {
09d856fb 1658 $expr = $self->deparse($kids[$i++], 0);
d989cdac 1659 if ($i > $#kids) {
09d856fb 1660 $callback->($expr, $i);
d989cdac
SM
1661 last;
1662 }
1663 }
1664 if (is_for_loop($kids[$i])) {
eae48c89
Z
1665 $callback->($expr . $self->for_loop($kids[$i], 0),
1666 $i += $kids[$i]->sibling->name eq "unstack" ? 2 : 1);
d989cdac
SM
1667 next;
1668 }
6b6b21da 1669 my $expr2 = $self->deparse($kids[$i], (@kids != 1)/2);
34b54951 1670 $expr2 =~ s/^sub :(?!:)/+sub :/; # statement label otherwise
6b6b21da 1671 $expr .= $expr2;
09d856fb 1672 $callback->($expr, $i);
d989cdac
SM
1673 }
1674}
1675
6e90668e
SM
1676# The BEGIN {} is used here because otherwise this code isn't executed
1677# when you run B::Deparse on itself.
1678my %globalnames;
1679BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC",
1680 "ENV", "ARGV", "ARGVOUT", "_"); }
1681
1682sub gv_name {
1683 my $self = shift;
1684 my $gv = shift;
b89b7257 1685 my $raw = shift;
32cc5cd1
FC
1686#Carp::confess() unless ref($gv) eq "B::GV";
1687 my $cv = $gv->FLAGS & SVf_ROK ? $gv->RV : 0;
1688 my $stash = ($cv || $gv)->STASH->NAME;
1689 my $name = $raw
1690 ? $cv ? $cv->NAME_HEK || $cv->GV->NAME : $gv->NAME
1691 : $cv
1692 ? B::safename($cv->NAME_HEK || $cv->GV->NAME)
1693 : $gv->SAFENAME;
8b2d6640
FC
1694 if ($stash eq 'main' && $name =~ /^::/) {
1695 $stash = '::';
1696 }
b861b87f
FC
1697 elsif (($stash eq 'main'
1698 && ($globalnames{$name} || $name =~ /^[^A-Za-z_:]/))
8b2d6640
FC
1699 or ($stash eq $self->{'curstash'} && !$globalnames{$name}
1700 && ($stash eq 'main' || $name !~ /::/))
b861b87f 1701 )
9d2c6865 1702 {
6e90668e
SM
1703 $stash = "";
1704 } else {
1705 $stash = $stash . "::";
a798dbf2 1706 }
b89b7257 1707 if (!$raw and $name =~ /^(\^..|{)/) {
083bda02 1708 $name = "{$name}"; # ${^WARNING_BITS}, etc and ${
6e90668e
SM
1709 }
1710 return $stash . $name;
a798dbf2
MB
1711}
1712
8510e997 1713# Return the name to use for a stash variable.
415d4c68
FC
1714# If a lexical with the same name is in scope, or
1715# if strictures are enabled, it may need to be
8510e997
RH
1716# fully-qualified.
1717sub stash_variable {
bb8996b8 1718 my ($self, $prefix, $name, $cx) = @_;
8510e997
RH
1719
1720 return "$prefix$name" if $name =~ /::/;
1721
d49c3562 1722 unless ($prefix eq '$' || $prefix eq '@' || $prefix eq '&' || #'
8510e997
RH
1723 $prefix eq '%' || $prefix eq '$#') {
1724 return "$prefix$name";
1725 }
1726
b6bba886 1727 if ($name =~ /^[^[:alpha:]_+-]$/) {
61154ac0
FC
1728 if (defined $cx && $cx == 26) {
1729 if ($prefix eq '@') {
bb8996b8
HY
1730 return "$prefix\{$name}";
1731 }
61154ac0
FC
1732 elsif ($name eq '#') { return '${#}' } # "${#}a" vs "$#a"
1733 }
1734 if ($prefix eq '$#') {
6ec73527 1735 return "\$#{$name}";
61154ac0 1736 }
6ec73527 1737 }
bb8996b8 1738
415d4c68 1739 return $prefix . $self->maybe_qualify($prefix, $name);
8510e997
RH
1740}
1741
93e453e2
KW
1742my %unctrl = # portable to EBCDIC
1743 (
dd405ed7
KW
1744 "\c@" => '@', # unused
1745 "\cA" => 'A',
1746 "\cB" => 'B',
1747 "\cC" => 'C',
1748 "\cD" => 'D',
1749 "\cE" => 'E',
1750 "\cF" => 'F',
1751 "\cG" => 'G',
1752 "\cH" => 'H',
1753 "\cI" => 'I',
1754 "\cJ" => 'J',
1755 "\cK" => 'K',
1756 "\cL" => 'L',
1757 "\cM" => 'M',
1758 "\cN" => 'N',
1759 "\cO" => 'O',
1760 "\cP" => 'P',
1761 "\cQ" => 'Q',
1762 "\cR" => 'R',
1763 "\cS" => 'S',
1764 "\cT" => 'T',
1765 "\cU" => 'U',
1766 "\cV" => 'V',
1767 "\cW" => 'W',
1768 "\cX" => 'X',
1769 "\cY" => 'Y',
1770 "\cZ" => 'Z',
1771 "\c[" => '[', # unused
1772 "\c\\" => '\\', # unused
1773 "\c]" => ']', # unused
1774 "\c_" => '_', # unused
93e453e2
KW
1775 );
1776
be6cf5cf
FC
1777# Return just the name, without the prefix. It may be returned as a quoted
1778# string. The second return value is a boolean indicating that.
1779sub stash_variable_name {
1780 my($self, $prefix, $gv) = @_;
1781 my $name = $self->gv_name($gv, 1);
415d4c68 1782 $name = $self->maybe_qualify($prefix,$name);
be6cf5cf 1783 if ($name =~ /^(?:\S|(?!\d)[\ca-\cz]?(?:\w|::)*|\d+)\z/) {
dd405ed7 1784 $name =~ s/^([\ca-\cz])/'^' . $unctrl{$1}/e;
be6cf5cf
FC
1785 $name =~ /^(\^..|{)/ and $name = "{$name}";
1786 return $name, 0; # not quoted
1787 }
1788 else {
7741ceed 1789 single_delim("q", "'", $name, $self), 1;
be6cf5cf
FC
1790 }
1791}
1792
415d4c68
FC
1793sub maybe_qualify {
1794 my ($self,$prefix,$name) = @_;
1795 my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
1796 return $name if !$prefix || $name =~ /::/;
1797 return $self->{'curstash'}.'::'. $name
1798 if
36727b53
FC
1799 $name =~ /^(?!\d)\w/ # alphabetic
1800 && $v !~ /^\$[ab]\z/ # not $a or $b
415d4c68
FC
1801 && !$globalnames{$name} # not a global name
1802 && $self->{hints} & $strict_bits{vars} # strict vars
1803 && !$self->lex_in_scope($v,1) # no "our"
1804 or $self->lex_in_scope($v); # conflicts with "my" variable
1805 return $name;
1806}
1807
8510e997 1808sub lex_in_scope {
415d4c68
FC
1809 my ($self, $name, $our) = @_;
1810 substr $name, 0, 0, = $our ? 'o' : 'm'; # our/my
8510e997
RH
1811 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
1812
6ec152c3 1813 return 0 if !defined($self->{'curcop'});
8510e997
RH
1814 my $seq = $self->{'curcop'}->cop_seq;
1815 return 0 if !exists $self->{'curcvlex'}{$name};
1816 for my $a (@{$self->{'curcvlex'}{$name}}) {
1817 my ($st, $en) = @$a;
1818 return 1 if $seq > $st && $seq <= $en;
1819 }
1820 return 0;
1821}
1822
1823sub populate_curcvlex {
1824 my $self = shift;
ce4e655d 1825 for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) {
7dafbf52
DM
1826 my $padlist = $cv->PADLIST;
1827 # an undef CV still in lexical chain
1828 next if class($padlist) eq "SPECIAL";
1829 my @padlist = $padlist->ARRAY;
8510e997
RH
1830 my @ns = $padlist[0]->ARRAY;
1831
1832 for (my $i=0; $i<@ns; ++$i) {
1833 next if class($ns[$i]) eq "SPECIAL";
0f2fe21d
RH
1834 if (class($ns[$i]) eq "PV") {
1835 # Probably that pesky lexical @_
1836 next;
1837 }
8510e997 1838 my $name = $ns[$i]->PVX;
679f2252 1839 next unless defined $name;
7dafbf52
DM
1840 my ($seq_st, $seq_en) =
1841 ($ns[$i]->FLAGS & SVf_FAKE)
1842 ? (0, 999999)
809abb02 1843 : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH);
8510e997 1844
415d4c68
FC
1845 push @{$self->{'curcvlex'}{
1846 ($ns[$i]->FLAGS & SVpad_OUR ? 'o' : 'm') . $name
56cd2ef8 1847 }}, [$seq_st, $seq_en, $ns[$i]];
8510e997
RH
1848 }
1849 }
1850}
1851
ce4e655d
RH
1852sub find_scope_st { ((find_scope(@_))[0]); }
1853sub find_scope_en { ((find_scope(@_))[1]); }
1854
1855# Recurses down the tree, looking for pad variable introductions and COPs
1856sub find_scope {
1857 my ($self, $op, $scope_st, $scope_en) = @_;
ff97752d 1858 carp("Undefined op in find_scope") if !defined $op;
ce4e655d
RH
1859 return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS;
1860
b6b46d6f
AB
1861 my @queue = ($op);
1862 while(my $op = shift @queue ) {
1863 for (my $o=$op->first; $$o; $o=$o->sibling) {
1864 if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) {
1865 my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW);
1866 my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH;
1867 $scope_st = $s if !defined($scope_st) || $s < $scope_st;
1868 $scope_en = $e if !defined($scope_en) || $e > $scope_en;
1869 return ($scope_st, $scope_en);
1870 }
1871 elsif (is_state($o)) {
1872 my $c = $o->cop_seq;
1873 $scope_st = $c if !defined($scope_st) || $c < $scope_st;
1874 $scope_en = $c if !defined($scope_en) || $c > $scope_en;
1875 return ($scope_st, $scope_en);
1876 }
1877 elsif ($o->flags & OPf_KIDS) {
1878 unshift (@queue, $o);
1879 }
34a48b4b
RH
1880 }
1881 }
ce4e655d
RH
1882
1883 return ($scope_st, $scope_en);
34a48b4b
RH
1884}
1885
1886# Returns a list of subs which should be inserted before the COP
1887sub cop_subs {
1888 my ($self, $op, $out_seq) = @_;
1889 my $seq = $op->cop_seq;
8635e3c2
FC
1890 if ($] < 5.021006) {
1891 # If we have nephews, then our sequence number indicates
1892 # the cop_seq of the end of some sort of scope.
1893 if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS
ce4e655d
RH
1894 and my $nseq = $self->find_scope_st($op->sibling) ) {
1895 $seq = $nseq;
8635e3c2 1896 }
34a48b4b
RH
1897 }
1898 $seq = $out_seq if defined($out_seq) && $out_seq < $seq;
1899 return $self->seq_subs($seq);
1900}
1901
1902sub seq_subs {
1903 my ($self, $seq) = @_;
1904 my @text;
1905#push @text, "# ($seq)\n";
1906
ce4e655d 1907 return "" if !defined $seq;
d88d1fe0 1908 my @pending;
34a48b4b
RH
1909 while (scalar(@{$self->{'subs_todo'}})
1910 and $seq > $self->{'subs_todo'}[0][0]) {
d88d1fe0 1911 my $cv = $self->{'subs_todo'}[0][1];
d4f1bfe7
FC
1912 # Skip the OUTSIDE check for lexical subs. We may be deparsing a
1913 # cloned anon sub with lexical subs declared in it, in which case
1914 # the OUTSIDE pointer points to the anon protosub.
c310a5ab 1915 my $lexical = ref $self->{'subs_todo'}[0][3];
d4f1bfe7
FC
1916 my $outside = !$lexical && $cv && $cv->OUTSIDE;
1917 if (!$lexical and $cv
1918 and ${$cv->OUTSIDE || \0} != ${$self->{'curcv'}})
1919 {
d88d1fe0
FC
1920 push @pending, shift @{$self->{'subs_todo'}};
1921 next;
1922 }
34a48b4b
RH
1923 push @text, $self->next_todo;
1924 }
d88d1fe0 1925 unshift @{$self->{'subs_todo'}}, @pending;
34a48b4b
RH
1926 return @text;
1927}
1928
95c04cde
NC
1929sub _features_from_bundle {
1930 my ($hints, $hh) = @_;
1873980a 1931 foreach (@{$feature::feature_bundle{@feature::hint_bundles[$hints >> $feature::hint_shift]}}) {
95c04cde
NC
1932 $hh->{$feature::feature{$_}} = 1;
1933 }
1934 return $hh;
1935}
1936
08c6f5ec 1937# Notice how subs and formats are inserted between statements here;
bc6b2ef6 1938# also $[ assignments and pragmas.
6e90668e
SM
1939sub pp_nextstate {
1940 my $self = shift;
9d2c6865 1941 my($op, $cx) = @_;
34a48b4b 1942 $self->{'curcop'} = $op;
6e90668e 1943 my @text;
34a48b4b 1944 push @text, $self->cop_subs($op);
4b1385ee
FC
1945 if (@text) {
1946 # Special marker to swallow up the semicolon
5e617af5 1947 push @text, "\cK";
4b1385ee 1948 }
11faa288 1949 my $stash = $op->stashpv;
6e90668e 1950 if ($stash ne $self->{'curstash'}) {
7741ceed 1951 push @text, $self->keyword("package") . " $stash;\n";
6e90668e
SM
1952 $self->{'curstash'} = $stash;
1953 }
08c6f5ec 1954
bc6b2ef6
Z
1955 if (OPpCONST_ARYBASE && $self->{'arybase'} != $op->arybase) {
1956 push @text, '$[ = '. $op->arybase .";\n";
1957 $self->{'arybase'} = $op->arybase;
1958 }
1959
7a9b44b9
RH
1960 my $warnings = $op->warnings;
1961 my $warning_bits;
1962 if ($warnings->isa("B::SPECIAL") && $$warnings == 4) {
810aef70 1963 $warning_bits = $warnings::Bits{"all"} & WARN_MASK;
7a9b44b9 1964 }
e31885a0 1965 elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) {
810aef70 1966 $warning_bits = $warnings::NONE;
7a9b44b9 1967 }
e31885a0
RH
1968 elsif ($warnings->isa("B::SPECIAL")) {
1969 $warning_bits = undef;
1970 }
7a9b44b9 1971 else {
34a48b4b 1972 $warning_bits = $warnings->PV & WARN_MASK;
7a9b44b9
RH
1973 }
1974
e31885a0
RH
1975 if (defined ($warning_bits) and
1976 !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) {
7741ceed
FC
1977 push @text,
1978 $self->declare_warnings($self->{'warnings'}, $warning_bits);
7a9b44b9
RH
1979 $self->{'warnings'} = $warning_bits;
1980 }
1981
2be95ceb 1982 my $hints = $] < 5.008009 ? $op->private : $op->hints;
0bb01b05 1983 my $old_hints = $self->{'hints'};
2be95ceb 1984 if ($self->{'hints'} != $hints) {
7741ceed 1985 push @text, $self->declare_hints($self->{'hints'}, $hints);
2be95ceb 1986 $self->{'hints'} = $hints;
a0405c92
RH
1987 }
1988
0bb01b05
FC
1989 my $newhh;
1990 if ($] > 5.009) {
1991 $newhh = $op->hints_hash->HASH;
1992 }
1993
1994 if ($] >= 5.015006) {
1995 # feature bundle hints
149758b3
NC
1996 my $from = $old_hints & $feature::hint_mask;
1997 my $to = $ hints & $feature::hint_mask;
0bb01b05 1998 if ($from != $to) {
149758b3 1999 if ($to == $feature::hint_mask) {
0bb01b05
FC
2000 if ($self->{'hinthash'}) {
2001 delete $self->{'hinthash'}{$_}
2002 for grep /^feature_/, keys %{$self->{'hinthash'}};
2003 }
2004 else { $self->{'hinthash'} = {} }
95c04cde
NC
2005 $self->{'hinthash'}
2006 = _features_from_bundle($from, $self->{'hinthash'});
0bb01b05
FC
2007 }
2008 else {
2009 my $bundle =
2010 $feature::hint_bundles[$to >> $feature::hint_shift];
2011 $bundle =~ s/(\d[13579])\z/$1+1/e; # 5.11 => 5.12
7741ceed 2012 push @text,
127ce1cd 2013 $self->keyword("no") . " feature ':all';\n",
7741ceed 2014 $self->keyword("use") . " feature ':$bundle';\n";
0bb01b05
FC
2015 }
2016 }
2017 }
2018
2019 if ($] > 5.009) {
7741ceed 2020 push @text, $self->declare_hinthash(
0bb01b05
FC
2021 $self->{'hinthash'}, $newhh,
2022 $self->{indent_size}, $self->{hints},
2023 );
2024 $self->{'hinthash'} = $newhh;
0ced6c29
RGS
2025 }
2026
d989cdac
SM
2027 # This should go after of any branches that add statements, to
2028 # increase the chances that it refers to the same line it did in
2029 # the original program.
e56a605e 2030 if ($self->{'linenums'} && $cx != .5) { # $cx == .5 means in a format
d989cdac
SM
2031 push @text, "\f#line " . $op->line .
2032 ' "' . $op->file, qq'"\n';
2033 }
2034
98a1a137
Z
2035 push @text, $op->label . ": " if $op->label;
2036
6e90668e
SM
2037 return join("", @text);
2038}
2039
08c6f5ec 2040sub declare_warnings {
7741ceed 2041 my ($self, $from, $to) = @_;
e6f1f756 2042 if (($to & WARN_MASK) eq (warnings::bits("all") & WARN_MASK)) {
7741ceed 2043 return $self->keyword("use") . " warnings;\n";
a0405c92 2044 }
e6f1f756 2045 elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) {
7741ceed 2046 return $self->keyword("no") . " warnings;\n";
a0405c92 2047 }
74b899ae
KW
2048 return "BEGIN {\${^WARNING_BITS} = \""
2049 . join("", map { sprintf("\\x%02x", ord $_) } split "", $to)
2050 . "\"}\n\cK";
a0405c92
RH
2051}
2052
2053sub declare_hints {
7741ceed 2054 my ($self, $from, $to) = @_;
a0035eb8
RH
2055 my $use = $to & ~$from;
2056 my $no = $from & ~$to;
2057 my $decls = "";
2058 for my $pragma (hint_pragmas($use)) {
7741ceed 2059 $decls .= $self->keyword("use") . " $pragma;\n";
a0035eb8
RH
2060 }
2061 for my $pragma (hint_pragmas($no)) {
7741ceed 2062 $decls .= $self->keyword("no") . " $pragma;\n";
a0035eb8
RH
2063 }
2064 return $decls;
2065}
2066
493c23c6
NC
2067# Internal implementation hints that the core sets automatically, so don't need
2068# (or want) to be passed back to the user
2069my %ignored_hints = (
2070 'open<' => 1,
2071 'open>' => 1,
dca6062a 2072 ':' => 1,
1c74777c
FC
2073 'strict/refs' => 1,
2074 'strict/subs' => 1,
2075 'strict/vars' => 1,
2e8342de 2076);
493c23c6 2077
a8095af7
FC
2078my %rev_feature;
2079
0ced6c29 2080sub declare_hinthash {
7741ceed 2081 my ($self, $from, $to, $indent, $hints) = @_;
a8095af7 2082 my $doing_features =
149758b3 2083 ($hints & $feature::hint_mask) == $feature::hint_mask;
0ced6c29 2084 my @decls;
a8095af7
FC
2085 my @features;
2086 my @unfeatures; # bugs?
0bb01b05 2087 for my $key (sort keys %$to) {
493c23c6 2088 next if $ignored_hints{$key};
a8095af7
FC
2089 my $is_feature = $key =~ /^feature_/ && $^V ge 5.15.6;
2090 next if $is_feature and not $doing_features;
04be0204 2091 if (!exists $from->{$key} or $from->{$key} ne $to->{$key}) {
a8095af7 2092 push(@features, $key), next if $is_feature;
035146a3 2093 push @decls,
7741ceed 2094 qq(\$^H{) . single_delim("q", "'", $key, $self) . qq(} = )
035146a3
FC
2095 . (
2096 defined $to->{$key}
7741ceed 2097 ? single_delim("q", "'", $to->{$key}, $self)
035146a3
FC
2098 : 'undef'
2099 )
04be0204 2100 . qq(;);
0ced6c29
RGS
2101 }
2102 }
0bb01b05 2103 for my $key (sort keys %$from) {
493c23c6 2104 next if $ignored_hints{$key};
a8095af7
FC
2105 my $is_feature = $key =~ /^feature_/ && $^V ge 5.15.6;
2106 next if $is_feature and not $doing_features;
0ced6c29 2107 if (!exists $to->{$key}) {
a8095af7 2108 push(@unfeatures, $key), next if $is_feature;
0ced6c29
RGS
2109 push @decls, qq(delete \$^H{'$key'};);
2110 }
2111 }
a8095af7
FC
2112 my @ret;
2113 if (@features || @unfeatures) {
a8095af7
FC
2114 if (!%rev_feature) { %rev_feature = reverse %feature::feature }
2115 }
2116 if (@features) {
7741ceed 2117 push @ret, $self->keyword("use") . " feature "
a8095af7
FC
2118 . join(", ", map "'$rev_feature{$_}'", @features) . ";\n";
2119 }
2120 if (@unfeatures) {
7741ceed 2121 push @ret, $self->keyword("no") . " feature "
a8095af7
FC
2122 . join(", ", map "'$rev_feature{$_}'", @unfeatures)
2123 . ";\n";
2124 }
2125 @decls and
2126 push @ret,
5e617af5 2127 join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n\cK";
a8095af7 2128 return @ret;
0ced6c29
RGS
2129}
2130
a0035eb8
RH
2131sub hint_pragmas {
2132 my ($bits) = @_;
415d4c68 2133 my (@pragmas, @strict);
a0035eb8 2134 push @pragmas, "integer" if $bits & 0x1;
415d4c68
FC
2135 for (sort keys %strict_bits) {
2136 push @strict, "'$_'" if $bits & $strict_bits{$_};
2137 }
2138 if (@strict == keys %strict_bits) {
2139 push @pragmas, "strict";
2140 }
2141 elsif (@strict) {
2142 push @pragmas, "strict " . join ', ', @strict;
2143 }
a0035eb8
RH
2144 push @pragmas, "bytes" if $bits & 0x8;
2145 return @pragmas;
08c6f5ec
RH
2146}
2147
6e90668e 2148sub pp_dbstate { pp_nextstate(@_) }
3f872cb9 2149sub pp_setstate { pp_nextstate(@_) }
6e90668e
SM
2150
2151sub pp_unstack { return "" } # see also leaveloop
2152
80e3f4ad
FC
2153my %feature_keywords = (
2154 # keyword => 'feature',
2155 state => 'state',
2156 say => 'say',
2157 given => 'switch',
2158 when => 'switch',
2159 default => 'switch',
e36901c8 2160 break => 'switch',
7d789282 2161 evalbytes=>'evalbytes',
84ed0108 2162 __SUB__ => '__SUB__',
838f2281 2163 fc => 'fc',
80e3f4ad
FC
2164);
2165
3ac5308a
DM
2166# keywords that are strong and also have a prototype
2167#
2168my %strong_proto_keywords = map { $_ => 1 } qw(
3ac5308a
DM
2169 pos
2170 prototype
2171 scalar
2172 study
2173 undef
2174);
2175
a958cfbb
FC
2176sub feature_enabled {
2177 my($self,$name) = @_;
223b1722 2178 my $hh;
149758b3
NC
2179 my $hints = $self->{hints} & $feature::hint_mask;
2180 if ($hints && $hints != $feature::hint_mask) {
1873980a 2181 $hh = _features_from_bundle($hints);
223b1722
FC
2182 }
2183 elsif ($hints) { $hh = $self->{'hinthash'} }
a958cfbb
FC
2184 return $hh && $hh->{"feature_$feature_keywords{$name}"}
2185}
2186
2187sub keyword {
2188 my $self = shift;
2189 my $name = shift;
2190 return $name if $name =~ /^CORE::/; # just in case
2191 if (exists $feature_keywords{$name}) {
2192 return "CORE::$name" if not $self->feature_enabled($name);
80e3f4ad 2193 }
7741ceed
FC
2194 # This sub may be called for a program that has no nextstate ops. In
2195 # that case we may have a lexical sub named no/use/sub in scope but
2196 # but $self->lex_in_scope will return false because it depends on the
2197 # current nextstate op. So we need this alternate method if there is
2198 # no current cop.
2199 if (!$self->{'curcop'}) {
2200 $self->populate_curcvlex() if !defined $self->{'curcvlex'};
2201 return "CORE::$name" if exists $self->{'curcvlex'}{"m&$name"}
2202 || exists $self->{'curcvlex'}{"o&$name"};
2203 } elsif ($self->lex_in_scope("&$name")
2204 || $self->lex_in_scope("&$name", 1)) {
3188a821
FC
2205 return "CORE::$name";
2206 }
3ac5308a
DM
2207 if ($strong_proto_keywords{$name}
2208 || ($name !~ /^(?:chom?p|do|exec|glob|s(?:elect|ystem))\z/
2209 && !defined eval{prototype "CORE::$name"})
4a1ac32e
FC
2210 ) { return $name }
2211 if (
2212 exists $self->{subs_declared}{$name}
2213 or
2214 exists &{"$self->{curstash}::$name"}
2215 ) {
2216 return "CORE::$name"
2217 }
2218 return $name;
2219}
2220
6e90668e
SM
2221sub baseop {
2222 my $self = shift;
9d2c6865 2223 my($op, $cx, $name) = @_;
4a1ac32e 2224 return $self->keyword($name);
6e90668e
SM
2225}
2226
ddb55548 2227sub pp_stub { "()" }
6e90668e
SM
2228sub pp_wantarray { baseop(@_, "wantarray") }
2229sub pp_fork { baseop(@_, "fork") }
3ed82cfc
GS
2230sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
2231sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
2232sub pp_time { maybe_targmy(@_, \&baseop, "time") }
6e90668e
SM
2233sub pp_tms { baseop(@_, "times") }
2234sub pp_ghostent { baseop(@_, "gethostent") }
2235sub pp_gnetent { baseop(@_, "getnetent") }
2236sub pp_gprotoent { baseop(@_, "getprotoent") }
2237sub pp_gservent { baseop(@_, "getservent") }
2238sub pp_ehostent { baseop(@_, "endhostent") }
2239sub pp_enetent { baseop(@_, "endnetent") }
2240sub pp_eprotoent { baseop(@_, "endprotoent") }
2241sub pp_eservent { baseop(@_, "endservent") }
2242sub pp_gpwent { baseop(@_, "getpwent") }
2243sub pp_spwent { baseop(@_, "setpwent") }
2244sub pp_epwent { baseop(@_, "endpwent") }
2245sub pp_ggrent { baseop(@_, "getgrent") }
2246sub pp_sgrent { baseop(@_, "setgrent") }
2247sub pp_egrent { baseop(@_, "endgrent") }
2248sub pp_getlogin { baseop(@_, "getlogin") }
2249
2250sub POSTFIX () { 1 }
2251
9d2c6865
SM
2252# I couldn't think of a good short name, but this is the category of
2253# symbolic unary operators with interesting precedence
2254
2255sub pfixop {
2256 my $self = shift;
2257 my($op, $cx, $name, $prec, $flags) = (@_, 0);
2258 my $kid = $op->first;
2259 $kid = $self->deparse($kid, $prec);
843b15cc
FC
2260 return $self->maybe_parens(($flags & POSTFIX)
2261 ? "$kid$name"
2262 # avoid confusion with filetests
2263 : $name eq '-'
2264 && $kid =~ /^[a-zA-Z](?!\w)/
2265 ? "$name($kid)"
2266 : "$name$kid",
9d2c6865
SM
2267 $cx, $prec);
2268}
2269
2270sub pp_preinc { pfixop(@_, "++", 23) }
2271sub pp_predec { pfixop(@_, "--", 23) }
3ed82cfc
GS
2272sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
2273sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
9d2c6865
SM
2274sub pp_i_preinc { pfixop(@_, "++", 23) }
2275sub pp_i_predec { pfixop(@_, "--", 23) }
3ed82cfc
GS
2276sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
2277sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
68cc8748 2278sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
27f31adf
FC
2279*pp_ncomplement = *pp_complement;
2280sub pp_scomplement { maybe_targmy(@_, \&pfixop, "~.", 21) }
9d2c6865 2281
3ed82cfc
GS
2282sub pp_negate { maybe_targmy(@_, \&real_negate) }
2283sub real_negate {
9d2c6865
SM
2284 my $self = shift;
2285 my($op, $cx) = @_;
3f872cb9 2286 if ($op->first->name =~ /^(i_)?negate$/) {
9d2c6865
SM
2287 # avoid --$x
2288 $self->pfixop($op, $cx, "-", 21.5);
2289 } else {
2290 $self->pfixop($op, $cx, "-", 21);
2291 }
2292}
2293sub pp_i_negate { pp_negate(@_) }
2294
2295sub pp_not {
2296 my $self = shift;
2297 my($op, $cx) = @_;
2298 if ($cx <= 4) {
1cabb3b3 2299 $self->listop($op, $cx, "not", $op->first);
9d2c6865
SM
2300 } else {
2301 $self->pfixop($op, $cx, "!", 21);
2302 }
2303}
2304
6e90668e
SM
2305sub unop {
2306 my $self = shift;
9c56d9ea 2307 my($op, $cx, $name, $nollafr) = @_;
6e90668e 2308 my $kid;
9d2c6865 2309 if ($op->flags & OPf_KIDS) {
aaf643ce 2310 $kid = $op->first;
1c85afce
YO
2311 if (not $name) {
2312 # this deals with 'boolkeys' right now
2313 return $self->deparse($kid,$cx);
2314 }
deb20ba3
RGS
2315 my $builtinname = $name;
2316 $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name";
2317 if (defined prototype($builtinname)
9cef6114 2318 && $builtinname ne 'CORE::readline'
deb20ba3 2319 && prototype($builtinname) =~ /^;?\*/
e31885a0
RH
2320 && $kid->name eq "rv2gv") {
2321 $kid = $kid->first;
2322 }
2323
9c56d9ea 2324 if ($nollafr) {
917a8f4f
FC
2325 if (($kid = $self->deparse($kid, 16)) !~ s/^\cS//) {
2326 # require foo() is a syntax error.
2327 $kid =~ /^(?!\d)\w/ and $kid = "($kid)";
2328 }
9c56d9ea
FC
2329 return $self->maybe_parens(
2330 $self->keyword($name) . " $kid", $cx, 16
2331 );
2332 }
9d2c6865 2333 return $self->maybe_parens_unop($name, $kid, $cx);
6e90668e 2334 } else {
4d8ac5c7
FC
2335 return $self->maybe_parens(
2336 $self->keyword($name) . ($op->flags & OPf_SPECIAL ? "()" : ""),
2337 $cx, 16,
2338 );
6e90668e 2339 }
6e90668e
SM
2340}
2341
3ed82cfc
GS
2342sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
2343sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
2344sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
2345sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
6e90668e
SM
2346sub pp_defined { unop(@_, "defined") }
2347sub pp_undef { unop(@_, "undef") }
2348sub pp_study { unop(@_, "study") }
6e90668e
SM
2349sub pp_ref { unop(@_, "ref") }
2350sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
2351
3ed82cfc
GS
2352sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
2353sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
2354sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
6e90668e 2355sub pp_srand { unop(@_, "srand") }
3ed82cfc
GS
2356sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
2357sub pp_log { maybe_targmy(@_, \&unop, "log") }
2358sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
2359sub pp_int { maybe_targmy(@_, \&unop, "int") }
2360sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
2361sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
2362sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
2363
2364sub pp_length { maybe_targmy(@_, \&unop, "length") }
2365sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
2366sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
6e90668e
SM
2367
2368sub pp_each { unop(@_, "each") }
2369sub pp_values { unop(@_, "values") }
2370sub pp_keys { unop(@_, "keys") }
09dcfa7d 2371{ no strict 'refs'; *{"pp_r$_"} = *{"pp_$_"} for qw< keys each values >; }
1c85afce
YO
2372sub pp_boolkeys {
2373 # no name because its an optimisation op that has no keyword
2374 unop(@_,"");
2375}
644741fd
NC
2376sub pp_aeach { unop(@_, "each") }
2377sub pp_avalues { unop(@_, "values") }
2378sub pp_akeys { unop(@_, "keys") }
6e90668e
SM
2379sub pp_pop { unop(@_, "pop") }
2380sub pp_shift { unop(@_, "shift") }
2381
2382sub pp_caller { unop(@_, "caller") }
2383sub pp_reset { unop(@_, "reset") }
2384sub pp_exit { unop(@_, "exit") }
2385sub pp_prototype { unop(@_, "prototype") }
2386
2387sub pp_close { unop(@_, "close") }
2388sub pp_fileno { unop(@_, "fileno") }
2389sub pp_umask { unop(@_, "umask") }
6e90668e
SM
2390sub pp_untie { unop(@_, "untie") }
2391sub pp_tied { unop(@_, "tied") }
2392sub pp_dbmclose { unop(@_, "dbmclose") }
2393sub pp_getc { unop(@_, "getc") }
2394sub pp_eof { unop(@_, "eof") }
2395sub pp_tell { unop(@_, "tell") }
2396sub pp_getsockname { unop(@_, "getsockname") }
2397sub pp_getpeername { unop(@_, "getpeername") }
2398
0175f038
FC
2399sub pp_chdir {
2400 my ($self, $op, $cx) = @_;
3c4a43a5 2401 if (($op->flags & (OPf_SPECIAL|OPf_KIDS)) == (OPf_SPECIAL|OPf_KIDS)) {
0175f038
FC
2402 my $kw = $self->keyword("chdir");
2403 my $kid = $self->const_sv($op->first)->PV;
2404 my $code = $kw
2405 . ($cx >= 16 || $self->{'parens'} ? "($kid)" : " $kid");
2406 maybe_targmy(@_, sub { $_[3] }, $code);
2407 } else {
2408 maybe_targmy(@_, \&unop, "chdir")
2409 }
2410}
2411
3ed82cfc 2412sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
6e90668e 2413sub pp_readlink { unop(@_, "readlink") }
3ed82cfc 2414sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
6e90668e
SM
2415sub pp_readdir { unop(@_, "readdir") }
2416sub pp_telldir { unop(@_, "telldir") }
2417sub pp_rewinddir { unop(@_, "rewinddir") }
2418sub pp_closedir { unop(@_, "closedir") }
3ed82cfc 2419sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
6e90668e
SM
2420sub pp_localtime { unop(@_, "localtime") }
2421sub pp_gmtime { unop(@_, "gmtime") }
2422sub pp_alarm { unop(@_, "alarm") }
3ed82cfc 2423sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
6e90668e 2424
94bb57f9 2425sub pp_dofile {
9c56d9ea 2426 my $code = unop(@_, "do", 1); # llafr does not apply
8b46c09b 2427 if ($code =~ s/^((?:CORE::)?do) \{/$1({/) { $code .= ')' }
94bb57f9
FC
2428 $code;
2429}
7d789282
FC
2430sub pp_entereval {
2431 unop(
2432 @_,
c7c39989 2433 $_[1]->private & OPpEVAL_BYTES ? 'evalbytes' : "eval"
7d789282
FC
2434 )
2435}
6e90668e
SM
2436
2437sub pp_ghbyname { unop(@_, "gethostbyname") }
2438sub pp_gnbyname { unop(@_, "getnetbyname") }
2439sub pp_gpbyname { unop(@_, "getprotobyname") }
2440sub pp_shostent { unop(@_, "sethostent") }
2441sub pp_snetent { unop(@_, "setnetent") }
2442sub pp_sprotoent { unop(@_, "setprotoent") }
2443sub pp_sservent { unop(@_, "setservent") }
2444sub pp_gpwnam { unop(@_, "getpwnam") }
2445sub pp_gpwuid { unop(@_, "getpwuid") }
2446sub pp_ggrnam { unop(@_, "getgrnam") }
2447sub pp_ggrgid { unop(@_, "getgrgid") }
2448
2449sub pp_lock { unop(@_, "lock") }
2450
0d863452 2451sub pp_continue { unop(@_, "continue"); }
c08f093b 2452sub pp_break { unop(@_, "break"); }
0d863452
RH
2453
2454sub givwhen {
2455 my $self = shift;
2456 my($op, $cx, $givwhen) = @_;
2457
2458 my $enterop = $op->first;
2459 my ($head, $block);
2460 if ($enterop->flags & OPf_SPECIAL) {
80e3f4ad 2461 $head = $self->keyword("default");
0d863452
RH
2462 $block = $self->deparse($enterop->first, 0);
2463 }
2464 else {
2465 my $cond = $enterop->first;
2466 my $cond_str = $self->deparse($cond, 1);
2467 $head = "$givwhen ($cond_str)";
2468 $block = $self->deparse($cond->sibling, 0);
2469 }
2470
2471 return "$head {\n".
2472 "\t$block\n".
2473 "\b}\cK";
2474}
2475
80e3f4ad
FC
2476sub pp_leavegiven { givwhen(@_, $_[0]->keyword("given")); }
2477sub pp_leavewhen { givwhen(@_, $_[0]->keyword("when")); }
0d863452 2478
6e90668e
SM
2479sub pp_exists {
2480 my $self = shift;
9d2c6865 2481 my($op, $cx) = @_;
34a48b4b 2482 my $arg;
3188a821 2483 my $name = $self->keyword("exists");
34a48b4b
RH
2484 if ($op->private & OPpEXISTS_SUB) {
2485 # Checking for the existence of a subroutine
3188a821 2486 return $self->maybe_parens_func($name,
34a48b4b
RH
2487 $self->pp_rv2cv($op->first, 16), $cx, 16);
2488 }
2489 if ($op->flags & OPf_SPECIAL) {
2490 # Array element, not hash element
3188a821 2491 return $self->maybe_parens_func($name,
34a48b4b
RH
2492 $self->pp_aelem($op->first, 16), $cx, 16);
2493 }
3188a821 2494 return $self->maybe_parens_func($name, $self->pp_helem($op->first, 16),
9d2c6865 2495 $cx, 16);
6e90668e
SM
2496}
2497
6e90668e
SM
2498sub pp_delete {
2499 my $self = shift;
9d2c6865 2500 my($op, $cx) = @_;
6e90668e 2501 my $arg;
3188a821 2502 my $name = $self->keyword("delete");
6e90668e 2503 if ($op->private & OPpSLICE) {
34a48b4b
RH
2504 if ($op->flags & OPf_SPECIAL) {
2505 # Deleting from an array, not a hash
3188a821 2506 return $self->maybe_parens_func($name,
34a48b4b
RH
2507 $self->pp_aslice($op->first, 16),
2508 $cx, 16);
2509 }
3188a821 2510 return $self->maybe_parens_func($name,
9d2c6865
SM
2511 $self->pp_hslice($op->first, 16),
2512 $cx, 16);
6e90668e 2513 } else {
34a48b4b
RH
2514 if ($op->flags & OPf_SPECIAL) {
2515 # Deleting from an array, not a hash
3188a821 2516 return $self->maybe_parens_func($name,
34a48b4b
RH
2517 $self->pp_aelem($op->first, 16),
2518 $cx, 16);
2519 }
3188a821 2520 return $self->maybe_parens_func($name,
9d2c6865
SM
2521 $self->pp_helem($op->first, 16),
2522 $cx, 16);
6e90668e 2523 }
6e90668e
SM
2524}
2525
6e90668e
SM
2526sub pp_require {
2527 my $self = shift;
9d2c6865 2528 my($op, $cx) = @_;
d5889722 2529 my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require';
5e7acd25
FC
2530 my $kid = $op->first;
2531 if ($kid->name eq 'const') {
2532 my $priv = $kid->private;
2533 my $sv = $self->const_sv($kid);
2534 my $arg;
2535 if ($priv & OPpCONST_BARE) {
2536 $arg = $sv->PV;
2537 $arg =~ s[/][::]g;
2538 $arg =~ s/\.pm//g;
2539 } elsif ($priv & OPpCONST_NOVER) {
2540 $opname = $self->keyword('no');
2541 $arg = $self->const($sv, 16);
2542 } elsif ((my $tmp = $self->const($sv, 16)) =~ /^v/) {
2543 $arg = $tmp;
2544 }
2545 if ($arg) {
2546 return $self->maybe_parens("$opname $arg", $cx, 16);
2547 }
2548 }
2549 $self->unop(
41df74e3 2550 $op, $cx,
5e7acd25 2551 $opname,
41df74e3 2552 1, # llafr does not apply
5e7acd25 2553 );
6e90668e
SM
2554}
2555
d989cdac 2556sub pp_scalar {
9d2c6865 2557 my $self = shift;
d9002312 2558 my($op, $cx) = @_;
9d2c6865
SM
2559 my $kid = $op->first;
2560 if (not null $kid->sibling) {
2561 # XXX Was a here-doc
2562 return $self->dquote($op);
2563 }
2564 $self->unop(@_, "scalar");
2565}
2566
2567
6e90668e
SM
2568sub padval {
2569 my $self = shift;
2570 my $targ = shift;
d989cdac 2571 return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ);
6e90668e
SM
2572}
2573
78c72037
NC
2574sub anon_hash_or_list {
2575 my $self = shift;
d9002312 2576 my($op, $cx) = @_;
78c72037
NC
2577
2578 my($pre, $post) = @{{"anonlist" => ["[","]"],
2579 "anonhash" => ["{","}"]}->{$op->name}};
2580 my($expr, @exprs);
2581 $op = $op->first->sibling; # skip pushmark
2582 for (; !null($op); $op = $op->sibling) {
2583 $expr = $self->deparse($op, 6);
2584 push @exprs, $expr;
2585 }
d9002312
SM
2586 if ($pre eq "{" and $cx < 1) {
2587 # Disambiguate that it's not a block
2588 $pre = "+{";
2589 }
78c72037
NC
2590 return $pre . join(", ", @exprs) . $post;
2591}
2592
2593sub pp_anonlist {
d9002312
SM
2594 my $self = shift;
2595 my ($op, $cx) = @_;
78c72037 2596 if ($op->flags & OPf_SPECIAL) {
d9002312 2597 return $self->anon_hash_or_list($op, $cx);
78c72037
NC
2598 }
2599 warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL";
2600 return 'XXX';
2601}
2602
2603*pp_anonhash = \&pp_anonlist;
2604
6e90668e
SM
2605sub pp_refgen {
2606 my $self = shift;
9d2c6865 2607 my($op, $cx) = @_;
6e90668e 2608 my $kid = $op->first;
3f872cb9 2609 if ($kid->name eq "null") {
01762542 2610 my $anoncode = $kid = $kid->first;
b77472f9
FC
2611 if ($anoncode->name eq "anonconst") {
2612 $anoncode = $anoncode->first->first->sibling;
2613 }
01762542
FC
2614 if ($anoncode->name eq "anoncode"
2615 or !null($anoncode = $kid->sibling) and
2616 $anoncode->name eq "anoncode") {
2617 return $self->e_anoncode({ code => $self->padval($anoncode->targ) });
3f872cb9
GS
2618 } elsif ($kid->name eq "pushmark") {
2619 my $sib_name = $kid->sibling->name;
c8ec376c 2620 if ($sib_name eq 'entersub') {
c8c62db7
AD
2621 my $text = $self->deparse($kid->sibling, 1);
2622 # Always show parens for \(&func()), but only with -p otherwise
2623 $text = "($text)" if $self->{'parens'}
2624 or $kid->sibling->private & OPpENTERSUB_AMPER;
2625 return "\\$text";
2626 }
2627 }
6e90668e 2628 }
c8ec376c 2629 local $self->{'in_refgen'} = 1;
9d2c6865 2630 $self->pfixop($op, $cx, "\\", 20);
6e90668e
SM
2631}
2632
09d856fb
CK
2633sub e_anoncode {
2634 my ($self, $info) = @_;
2635 my $text = $self->deparse_sub($info->{code});
7741ceed 2636 return $self->keyword("sub") . " $text";
09d856fb
CK
2637}
2638
6e90668e
SM
2639sub pp_srefgen { pp_refgen(@_) }
2640
2641sub pp_readline {
2642 my $self = shift;
9d2c6865 2643 my($op, $cx) = @_;
6e90668e 2644 my $kid = $op->first;
18371617
LM
2645 if (is_scalar($kid)
2646 and $op->flags & OPf_SPECIAL
2647 and $self->deparse($kid, 1) eq 'ARGV')
2648 {
2649 return '<<>>';
65ef2c3e 2650 }
e31885a0 2651 return $self->unop($op, $cx, "readline");
6e90668e
SM
2652}
2653
ad8caead
RGS
2654sub pp_rcatline {
2655 my $self = shift;
2656 my($op) = @_;
d989cdac 2657 return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">";
ad8caead
RGS
2658}
2659
bd0865ec
GS
2660# Unary operators that can occur as pseudo-listops inside double quotes
2661sub dq_unop {
2662 my $self = shift;
2663 my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
2664 my $kid;
2665 if ($op->flags & OPf_KIDS) {
2666 $kid = $op->first;
2667 # If there's more than one kid, the first is an ex-pushmark.
2668 $kid = $kid->sibling if not null $kid->sibling;
2669 return $self->maybe_parens_unop($name, $kid, $cx);
2670 } else {
d989cdac 2671 return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
bd0865ec
GS
2672 }
2673}
2674
2675sub pp_ucfirst { dq_unop(@_, "ucfirst") }
2676sub pp_lcfirst { dq_unop(@_, "lcfirst") }
2677sub pp_uc { dq_unop(@_, "uc") }
2678sub pp_lc { dq_unop(@_, "lc") }
3ed82cfc 2679sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
838f2281 2680sub pp_fc { dq_unop(@_, "fc") }
bd0865ec 2681
6e90668e
SM
2682sub loopex {
2683 my $self = shift;
9d2c6865 2684 my ($op, $cx, $name) = @_;
6e90668e 2685 if (class($op) eq "PVOP") {
41df74e3 2686 $name .= " " . $op->pv;
9d2c6865 2687 } elsif (class($op) eq "OP") {
41df74e3 2688 # no-op
6e90668e 2689 } elsif (class($op) eq "UNOP") {
1eb0b7be 2690 (my $kid = $self->deparse($op->first, 7)) =~ s/^\cS//;
df465735
FC
2691 # last foo() is a syntax error.
2692 $kid =~ /^(?!\d)\w/ and $kid = "($kid)";
41df74e3 2693 $name .= " $kid";
6e90668e 2694 }
1eb0b7be 2695 return $self->maybe_parens($name, $cx, 7);
6e90668e
SM
2696}
2697
2698sub pp_last { loopex(@_, "last") }
2699sub pp_next { loopex(@_, "next") }
2700sub pp_redo { loopex(@_, "redo") }
2701sub pp_goto { loopex(@_, "goto") }
266da325 2702sub pp_dump { loopex(@_, "CORE::dump") }
6e90668e
SM
2703
2704sub ftst {
2705 my $self = shift;
9d2c6865 2706 my($op, $cx, $name) = @_;
6e90668e 2707 if (class($op) eq "UNOP") {
e38ccfd9 2708 # Genuine '-X' filetests are exempt from the LLAFR, but not
5830412d
FC
2709 # l?stat()
2710 if ($name =~ /^-/) {
2711 (my $kid = $self->deparse($op->first, 16)) =~ s/^\cS//;
2712 return $self->maybe_parens("$name $kid", $cx, 16);
2713 }
9d2c6865 2714 return $self->maybe_parens_unop($name, $op->first, $cx);
d989cdac 2715 } elsif (class($op) =~ /^(SV|PAD)OP$/) {
9d2c6865 2716 return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
6e90668e 2717 } else { # I don't think baseop filetests ever survive ck_ftst, but...
9d2c6865 2718 return $name;
6e90668e 2719 }
6e90668e
SM
2720}
2721
d989cdac
SM
2722sub pp_lstat { ftst(@_, "lstat") }
2723sub pp_stat { ftst(@_, "stat") }
2724sub pp_ftrread { ftst(@_, "-R") }
6e90668e 2725sub pp_ftrwrite { ftst(@_, "-W") }
d989cdac
SM
2726sub pp_ftrexec { ftst(@_, "-X") }
2727sub pp_fteread { ftst(@_, "-r") }
e31885a0 2728sub pp_ftewrite { ftst(@_, "-w") }
d989cdac
SM
2729sub pp_fteexec { ftst(@_, "-x") }
2730sub pp_ftis { ftst(@_, "-e") }
6e90668e
SM
2731sub pp_fteowned { ftst(@_, "-O") }
2732sub pp_ftrowned { ftst(@_, "-o") }
d989cdac
SM
2733sub pp_ftzero { ftst(@_, "-z") }
2734sub pp_ftsize { ftst(@_, "-s") }
2735sub pp_ftmtime { ftst(@_, "-M") }
2736sub pp_ftatime { ftst(@_, "-A") }
2737sub pp_ftctime { ftst(@_, "-C") }
2738sub pp_ftsock { ftst(@_, "-S") }
2739sub pp_ftchr { ftst(@_, "-c") }
2740sub pp_ftblk { ftst(@_, "-b") }
2741sub pp_ftfile { ftst(@_, "-f") }
2742sub pp_ftdir { ftst(@_, "-d") }
2743sub pp_ftpipe { ftst(@_, "-p") }
2744sub pp_ftlink { ftst(@_, "-l") }
2745sub pp_ftsuid { ftst(@_, "-u") }
2746sub pp_ftsgid { ftst(@_, "-g") }
2747sub pp_ftsvtx { ftst(@_, "-k") }
2748sub pp_fttty { ftst(@_, "-t") }
2749sub pp_fttext { ftst(@_, "-T") }
6e90668e
SM
2750sub pp_ftbinary { ftst(@_, "-B") }
2751
a798dbf2 2752sub SWAP_CHILDREN () { 1 }
6e90668e 2753sub ASSIGN () { 2 } # has OP= variant
7013e6ae 2754sub LIST_CONTEXT () { 4 } # Assignment is in list context
6e90668e 2755
9d2c6865
SM
2756my(%left, %right);
2757
2758sub assoc_class {
2759 my $op = shift;
3f872cb9
GS
2760 my $name = $op->name;
2761 if ($name eq "concat" and $op->first->name eq "concat") {
e38ccfd9 2762 # avoid spurious '=' -- see comment in pp_concat
3f872cb9 2763 return "concat";
9d2c6865 2764 }
3f872cb9
GS
2765 if ($name eq "null" and class($op) eq "UNOP"
2766 and $op->first->name =~ /^(and|x?or)$/
9d2c6865
SM
2767 and null $op->first->sibling)
2768 {
2769 # Like all conditional constructs, OP_ANDs and OP_ORs are topped
2770 # with a null that's used as the common end point of the two
2771 # flows of control. For precedence purposes, ignore it.
2772 # (COND_EXPRs have these too, but we don't bother with
2773 # their associativity).
2774 return assoc_class($op->first);
2775 }
2776 return $name . ($op->flags & OPf_STACKED ? "=" : "");
2777}
2778
e38ccfd9 2779# Left associative operators, like '+', for which
9d2c6865
SM
2780# $a + $b + $c is equivalent to ($a + $b) + $c
2781
2782BEGIN {
3f872cb9
GS
2783 %left = ('multiply' => 19, 'i_multiply' => 19,
2784 'divide' => 19, 'i_divide' => 19,
2785 'modulo' => 19, 'i_modulo' => 19,
2786 'repeat' => 19,
2787 'add' => 18, 'i_add' => 18,
2788 'subtract' => 18, 'i_subtract' => 18,
2789 'concat' => 18,
2790 'left_shift' => 17, 'right_shift' => 17,
27f31adf 2791 'bit_and' => 13, 'nbit_and' => 13, 'sbit_and' => 13,
3f872cb9 2792 'bit_or' => 12, 'bit_xor' => 12,
27f31adf
FC
2793 'sbit_or' => 12, 'sbit_xor' => 12,
2794 'nbit_or' => 12, 'nbit_xor' => 12,
3f872cb9
GS
2795 'and' => 3,
2796 'or' => 2, 'xor' => 2,
9d2c6865
SM
2797 );
2798}
2799
2800sub deparse_binop_left {
2801 my $self = shift;
2802 my($op, $left, $prec) = @_;
58231d39 2803 if ($left{assoc_class($op)} && $left{assoc_class($left)}
9d2c6865
SM
2804 and $left{assoc_class($op)} == $left{assoc_class($left)})
2805 {
2806 return $self->deparse($left, $prec - .00001);
2807 } else {
2808 return $self->deparse($left, $prec);
2809 }
2810}
2811
e38ccfd9 2812# Right associative operators, like '=', for which
9d2c6865
SM
2813# $a = $b = $c is equivalent to $a = ($b = $c)
2814
2815BEGIN {
3f872cb9
GS
2816 %right = ('pow' => 22,
2817 'sassign=' => 7, 'aassign=' => 7,
2818 'multiply=' => 7, 'i_multiply=' => 7,
2819 'divide=' => 7, 'i_divide=' => 7,
2820 'modulo=' => 7, 'i_modulo=' => 7,
9187b6e4 2821 'repeat=' => 7, 'refassign' => 7, 'refassign=' => 7,
3f872cb9
GS
2822 'add=' => 7, 'i_add=' => 7,
2823 'subtract=' => 7, 'i_subtract=' => 7,
2824 'concat=' => 7,
2825 'left_shift=' => 7, 'right_shift=' => 7,
27f31adf
FC
2826 'bit_and=' => 7, 'sbit_and=' => 7, 'nbit_and=' => 7,
2827 'nbit_or=' => 7, 'nbit_xor=' => 7,
2828 'sbit_or=' => 7, 'sbit_xor=' => 7,
3f872cb9
GS
2829 'andassign' => 7,
2830 'orassign' => 7,
9d2c6865
SM
2831 );
2832}
2833
2834sub deparse_binop_right {
2835 my $self = shift;
2836 my($op, $right, $prec) = @_;
58231d39 2837 if ($right{assoc_class($op)} && $right{assoc_class($right)}
9d2c6865
SM
2838 and $right{assoc_class($op)} == $right{assoc_class($right)})
2839 {
2840 return $self->deparse($right, $prec - .00001);
2841 } else {
2842 return $self->deparse($right, $prec);
2843 }
2844}
2845
a798dbf2 2846sub binop {
6e90668e 2847 my $self = shift;
9d2c6865 2848 my ($op, $cx, $opname, $prec, $flags) = (@_, 0);
a798dbf2
MB
2849 my $left = $op->first;
2850 my $right = $op->last;
9d2c6865
SM
2851 my $eq = "";
2852 if ($op->flags & OPf_STACKED && $flags & ASSIGN) {
2853 $eq = "=";
2854 $prec = 7;
2855 }
a798dbf2
MB
2856 if ($flags & SWAP_CHILDREN) {
2857 ($left, $right) = ($right, $left);
2858 }
6a861075 2859 my $leftop = $left;
9d2c6865 2860 $left = $self->deparse_binop_left($op, $left, $prec);
90c0eb26 2861 $left = "($left)" if $flags & LIST_CONTEXT
6a861075
FC
2862 and $left !~ /^(my|our|local|)[\@\(]/
2863 || do {
2864 # Parenthesize if the left argument is a
2865 # lone repeat op.
2866 my $left = $leftop->first->sibling;
2867 $left->name eq 'repeat'
2868 && null($left->sibling);
2869 };
9d2c6865
SM
2870 $right = $self->deparse_binop_right($op, $right, $prec);
2871 return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
2872}
2873
3ed82cfc
GS
2874sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2875sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2876sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
2877sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2878sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2879sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
2880sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
2881sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
2882sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
2883sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
2884sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
2885
2886sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
2887sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
2888sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
2889sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
2890sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
27f31adf
FC
2891*pp_nbit_and = *pp_bit_and;
2892*pp_nbit_or = *pp_bit_or;
2893*pp_nbit_xor = *pp_bit_xor;
2894sub pp_sbit_and { maybe_targmy(@_, \&binop, "&.", 13, ASSIGN) }
2895sub pp_sbit_or { maybe_targmy(@_, \&binop, "|.", 12, ASSIGN) }
2896sub pp_sbit_xor { maybe_targmy(@_, \&binop, "^.", 12, ASSIGN) }
9d2c6865
SM
2897
2898sub pp_eq { binop(@_, "==", 14) }
2899sub pp_ne { binop(@_, "!=", 14) }
2900sub pp_lt { binop(@_, "<", 15) }
2901sub pp_gt { binop(@_, ">", 15) }
2902sub pp_ge { binop(@_, ">=", 15) }
2903sub pp_le { binop(@_, "<=", 15) }
2904sub pp_ncmp { binop(@_, "<=>", 14) }
2905sub pp_i_eq { binop(@_, "==", 14) }
2906sub pp_i_ne { binop(@_, "!=", 14) }
2907sub pp_i_lt { binop(@_, "<", 15) }
2908sub pp_i_gt { binop(@_, ">", 15) }
2909sub pp_i_ge { binop(@_, ">=", 15) }
2910sub pp_i_le { binop(@_, "<=", 15) }
d1455c67 2911sub pp_i_ncmp { maybe_targmy(@_, \&binop, "<=>", 14) }
9d2c6865
SM
2912
2913sub pp_seq { binop(@_, "eq", 14) }
2914sub pp_sne { binop(@_, "ne", 14) }
2915sub pp_slt { binop(@_, "lt", 15) }
2916sub pp_sgt { binop(@_, "gt", 15) }
2917sub pp_sge { binop(@_, "ge", 15) }
2918sub pp_sle { binop(@_, "le", 15) }
d1455c67 2919sub pp_scmp { maybe_targmy(@_, \&binop, "cmp", 14) }
9d2c6865
SM
2920
2921sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
7013e6ae 2922sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
6e90668e 2923
0d863452
RH
2924sub pp_smartmatch {
2925 my ($self, $op, $cx) = @_;
2926 if ($op->flags & OPf_SPECIAL) {
9210de83 2927 return $self->deparse($op->last, $cx);
0d863452
RH
2928 }
2929 else {
2930 binop(@_, "~~", 14);
2931 }
2932}
2933
e38ccfd9 2934# '.' is special because concats-of-concats are optimized to save copying
6e90668e 2935# by making all but the first concat stacked. The effect is as if the
e38ccfd9 2936# programmer had written '($a . $b) .= $c', except legal.
3ed82cfc
GS
2937sub pp_concat { maybe_targmy(@_, \&real_concat) }
2938sub real_concat {
6e90668e 2939 my $self = shift;
9d2c6865 2940 my($op, $cx) = @_;
6e90668e
SM
2941 my $left = $op->first;
2942 my $right = $op->last;
2943 my $eq = "";
9d2c6865 2944 my $prec = 18;
3f872cb9 2945 if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
6e90668e 2946 $eq = "=";
9d2c6865 2947 $prec = 7;
6e90668e 2948 }
9d2c6865
SM
2949 $left = $self->deparse_binop_left($op, $left, $prec);
2950 $right = $self->deparse_binop_right($op, $right, $prec);
2951 return $self->maybe_parens("$left .$eq $right", $cx, $prec);
6e90668e
SM
2952}
2953
6402d4ee
FC
2954sub pp_repeat { maybe_targmy(@_, \&repeat) }
2955
e38ccfd9 2956# 'x' is weird when the left arg is a list
6402d4ee 2957sub repeat {
6e90668e 2958 my $self = shift;
9d2c6865 2959 my($op, $cx) = @_;
6e90668e
SM
2960 my $left = $op->first;
2961 my $right = $op->last;
9d2c6865
SM
2962 my $eq = "";
2963 my $prec = 19;
2964 if ($op->flags & OPf_STACKED) {
2965 $eq = "=";
2966 $prec = 7;
2967 }
6e90668e 2968 if (null($right)) { # list repeat; count is inside left-side ex-list
5e462669 2969 # in 5.21.5 and earlier
6e90668e
SM
2970 my $kid = $left->first->sibling; # skip pushmark
2971 my @exprs;
2972 for (; !null($kid->sibling); $kid = $kid->sibling) {
9d2c6865 2973 push @exprs, $self->deparse($kid, 6);
6e90668e
SM
2974 }
2975 $right = $kid;
2976 $left = "(" . join(", ", @exprs). ")";
2977 } else {
5e462669
FC
2978 my $dolist = $op->private & OPpREPEAT_DOLIST;
2979 $left = $self->deparse_binop_left($op, $left, $dolist ? 1 : $prec);
2980 if ($dolist) {
2981 $left = "($left)";
2982 }
6e90668e 2983 }
9d2c6865
SM
2984 $right = $self->deparse_binop_right($op, $right, $prec);
2985 return $self->maybe_parens("$left x$eq $right", $cx, $prec);
6e90668e
SM
2986}
2987
2988sub range {
2989 my $self = shift;
9d2c6865 2990 my ($op, $cx, $type) = @_;
6e90668e
SM
2991 my $left = $op->first;
2992 my $right = $left->sibling;
9d2c6865
SM
2993 $left = $self->deparse($left, 9);
2994 $right = $self->deparse($right, 9);
2995 return $self->maybe_parens("$left $type $right", $cx, 9);
6e90668e
SM
2996}
2997
2998sub pp_flop {
2999 my $self = shift;
9d2c6865 3000 my($op, $cx) = @_;
6e90668e
SM
3001 my $flip = $op->first;
3002 my $type = ($flip->flags & OPf_SPECIAL) ? "..." : "..";
9d2c6865 3003 return $self->range($flip->first, $cx, $type);
6e90668e
SM
3004}
3005
3006# one-line while/until is handled in pp_leave
3007
3008sub logop {
3009 my $self = shift;
9d2c6865 3010 my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
6e90668e
SM
3011 my $left = $op->first;
3012 my $right = $op->first->sibling;
7741ceed 3013 $blockname &&= $self->keyword($blockname);
d989cdac 3014 if ($cx < 1 and is_scope($right) and $blockname
58cccf98
SM
3015 and $self->{'expand'} < 7)
3016 { # if ($a) {$b}
9d2c6865
SM
3017 $left = $self->deparse($left, 1);
3018 $right = $self->deparse($right, 0);
3019 return "$blockname ($left) {\n\t$right\n\b}\cK";
d989cdac 3020 } elsif ($cx < 1 and $blockname and not $self->{'parens'}
58cccf98 3021 and $self->{'expand'} < 7) { # $b if $a
9d2c6865
SM
3022 $right = $self->deparse($right, 1);
3023 $left = $self->deparse($left, 1);
3024 return "$right $blockname $left";
3025 } elsif ($cx > $lowprec and $highop) { # $a && $b
3026 $left = $self->deparse_binop_left($op, $left, $highprec);
3027 $right = $self->deparse_binop_right($op, $right, $highprec);
3028 return $self->maybe_parens("$left $highop $right", $cx, $highprec);
3029 } else { # $a and $b
3030 $left = $self->deparse_binop_left($op, $left, $lowprec);
3031 $right = $self->deparse_binop_right($op, $right, $lowprec);
d989cdac 3032 return $self->maybe_parens("$left $lowop $right", $cx, $lowprec);
9d2c6865
SM
3033 }
3034}
3035
3036sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
f4a44678 3037sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
5b99f273 3038sub pp_dor { logop(@_, "//", 10) }
3ed82cfc
GS
3039
3040# xor is syntactically a logop, but it's really a binop (contrary to
3041# old versions of opcode.pl). Syntax is what matters here.
9d2c6865 3042sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
6e90668e
SM
3043
3044sub logassignop {
3045 my $self = shift;
9d2c6865 3046 my ($op, $cx, $opname) = @_;
6e90668e
SM
3047 my $left = $op->first;
3048 my $right = $op->first->sibling->first; # skip sassign
9d2c6865
SM
3049 $left = $self->deparse($left, 7);
3050 $right = $self->deparse($right, 7);
3051 return $self->maybe_parens("$left $opname $right", $cx, 7);
a798dbf2
MB
3052}
3053
6e90668e 3054sub pp_andassign { logassignop(@_, "&&=") }
c963b151
BD
3055sub pp_orassign { logassignop(@_, "||=") }
3056sub pp_dorassign { logassignop(@_, "//=") }
6e90668e 3057
b89b7257
FC
3058sub rv2gv_or_string {
3059 my($self,$op) = @_;
3060 if ($op->name eq "gv") { # could be open("open") or open("###")
be6cf5cf 3061 my($name,$quoted) =
1db94eeb 3062 $self->stash_variable_name("", $self->gv_or_padgv($op));
be6cf5cf 3063 $quoted ? $name : "*$name";
b89b7257
FC
3064 }
3065 else {
3066 $self->deparse($op, 6);
3067 }
3068}
3069
6e90668e
SM
3070sub listop {
3071 my $self = shift;
9c56d9ea 3072 my($op, $cx, $name, $kid, $nollafr) = @_;
9d2c6865
SM
3073 my(@exprs);
3074 my $parens = ($cx >= 5) || $self->{'parens'};
24fcb59f 3075 $kid ||= $op->first->sibling;
4d8ac5c7
FC
3076 # If there are no arguments, add final parentheses (or parenthesize the
3077 # whole thing if the llafr does not apply) to account for cases like
3078 # (return)+1 or setpgrp()+1. When the llafr does not apply, we use a
3079 # precedence of 6 (< comma), as "return, 1" does not need parentheses.
3080 if (null $kid) {
3081 return $nollafr
3082 ? $self->maybe_parens($self->keyword($name), $cx, 7)
3083 : $self->keyword($name) . '()' x (7 < $cx);
3084 }
e31885a0 3085 my $first;
4a1ac32e 3086 my $fullname = $self->keyword($name);
b72c97e8 3087 my $proto = prototype("CORE::$name");
bc1cc2c3
DM
3088 if (
3089 ( (defined $proto && $proto =~ /^;?\*/)
3090 || $name eq 'select' # select(F) doesn't have a proto
3091 )
3092 && $kid->name eq "rv2gv"
3093 && !($kid->private & OPpLVAL_INTRO)
3094 ) {
b89b7257 3095 $first = $self->rv2gv_or_string($kid->first);
e31885a0
RH
3096 }
3097 else {
3098 $first = $self->deparse($kid, 6);
3099 }
e99ebc55 3100 if ($name eq "chmod" && $first =~ /^\d+$/) {
a0035eb8 3101 $first = sprintf("%#o", $first);
e99ebc55 3102 }
9c56d9ea
FC
3103 $first = "+$first"
3104 if not $parens and not $nollafr and substr($first, 0, 1) eq "(";
9d2c6865
SM
3105 push @exprs, $first;
3106 $kid = $kid->sibling;
564cd6cb
FC
3107 if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv"
3108 && !($kid->private & OPpLVAL_INTRO)) {
b89b7257 3109 push @exprs, $first = $self->rv2gv_or_string($kid->first);
b72c97e8
RGS
3110 $kid = $kid->sibling;
3111 }
9d2c6865
SM
3112 for (; !null($kid); $kid = $kid->sibling) {
3113 push @exprs, $self->deparse($kid, 6);
3114 }
689e417f 3115 if ($name eq "reverse" && ($op->private & OPpREVERSE_INPLACE)) {
4a1ac32e
FC
3116 return "$exprs[0] = $fullname"
3117 . ($parens ? "($exprs[0])" : " $exprs[0]");
689e417f 3118 }
327088eb 3119
9c56d9ea
FC
3120 if ($parens && $nollafr) {
3121 return "($fullname " . join(", ", @exprs) . ")";
3122 } elsif ($parens) {
4a1ac32e 3123 return "$fullname(" . join(", ", @exprs) . ")";
9d2c6865 3124 } else {
4a1ac32e 3125 return "$fullname " . join(", ", @exprs);
6e90668e 3126 }
6e90668e 3127}
a798dbf2 3128
6e90668e 3129sub pp_bless { listop(@_, "bless") }
3ed82cfc 3130sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
24fcb59f
FC
3131sub pp_substr {
3132 my ($self,$op,$cx) = @_;
3133 if ($op->private & OPpSUBSTR_REPL_FIRST) {
3134 return
3135 listop($self, $op, 7, "substr", $op->first->sibling->sibling)
3136 . " = "
3137 . $self->deparse($op->first->sibling, 7);
3138 }
3139 maybe_local(@_, listop(@_, "substr"))
3140}
6402d4ee 3141sub pp_vec { maybe_targmy(@_, \&maybe_local, listop(@_, "vec")) }
3ed82cfc
GS
3142sub pp_index { maybe_targmy(@_, \&listop, "index") }
3143sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
3144sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
6e90668e 3145sub pp_formline { listop(@_, "formline") } # see also deparse_format
3ed82cfc 3146sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
6e90668e
SM
3147sub pp_unpack { listop(@_, "unpack") }
3148sub pp_pack { listop(@_, "pack") }
3ed82cfc 3149sub pp_join { maybe_targmy(@_, \&listop, "join") }
6e90668e 3150sub pp_splice { listop(@_, "splice") }
3ed82cfc
GS
3151sub pp_push { maybe_targmy(@_, \&listop, "push") }
3152sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
6e90668e
SM
3153sub pp_reverse { listop(@_, "reverse") }
3154sub pp_warn { listop(@_, "warn") }
3155sub pp_die { listop(@_, "die") }
9c56d9ea 3156sub pp_return { listop(@_, "return", undef, 1) } # llafr does not apply
6e90668e
SM
3157sub pp_open { listop(@_, "open") }
3158sub pp_pipe_op { listop(@_, "pipe") }
3159sub pp_tie { listop(@_, "tie") }
82bafd27 3160sub pp_binmode { listop(@_, "binmode") }
6e90668e
SM
3161sub pp_dbmopen { listop(@_, "dbmopen") }
3162sub pp_sselect { listop(@_, "select") }
3163sub pp_select { listop(@_, "select") }
3164sub pp_read { listop(@_, "read") }
3165sub pp_sysopen { listop(@_, "sysopen") }
3166sub pp_sysseek { listop(@_, "sysseek") }
3167sub pp_sysread { listop(@_, "sysread") }
3168sub pp_syswrite { listop(@_, "syswrite") }
3169sub pp_send { listop(@_, "send") }
3170sub pp_recv { listop(@_, "recv") }
3171sub pp_seek { listop(@_, "seek") }
6e90668e
SM
3172sub pp_fcntl { listop(@_, "fcntl") }
3173sub pp_ioctl { listop(@_, "ioctl") }
3ed82cfc 3174sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
6e90668e 3175sub pp_socket { listop(@_, "socket") }
5deb1341 3176sub pp_sockpair { listop(@_, "socketpair") }
6e90668e
SM
3177sub pp_bind { listop(@_, "bind") }
3178sub pp_connect { listop(@_, "connect") }
3179sub pp_listen { listop(@_, "listen") }
3180sub pp_accept { listop(@_, "accept") }
3181sub pp_shutdown { listop(@_, "shutdown") }
3182sub pp_gsockopt { listop(@_, "getsockopt") }
3183sub pp_ssockopt { listop(@_, "setsockopt") }
3ed82cfc
GS
3184sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
3185sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
3186sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
3187sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
3188sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
3189sub pp_link { maybe_targmy(@_, \&listop, "link") }
3190sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
3191sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
6e90668e
SM
3192sub pp_open_dir { listop(@_, "opendir") }
3193sub pp_seekdir { listop(@_, "seekdir") }
3ed82cfc 3194sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
9d52f6f3
FC
3195sub pp_system { maybe_targmy(@_, \&indirop, "system") }
3196sub pp_exec { maybe_targmy(@_, \&indirop, "exec") }
3ed82cfc
GS
3197sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
3198sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
3199sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
3200sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
6e90668e
SM
3201sub pp_shmget { listop(@_, "shmget") }
3202sub pp_shmctl { listop(@_, "shmctl") }
3203sub pp_shmread { listop(@_, "shmread") }
3204sub pp_shmwrite { listop(@_, "shmwrite") }
3205sub pp_msgget { listop(@_, "msgget") }
3206sub pp_msgctl { listop(@_, "msgctl") }
3207sub pp_msgsnd { listop(@_, "msgsnd") }
3208sub pp_msgrcv { listop(@_, "msgrcv") }
3209sub pp_semget { listop(@_, "semget") }
3210sub pp_semctl { listop(@_, "semctl") }
3211sub pp_semop { listop(@_, "semop") }
3212sub pp_ghbyaddr { listop(@_, "gethostbyaddr") }
3213sub pp_gnbyaddr { listop(@_, "getnetbyaddr") }
3214sub pp_gpbynumber { listop(@_, "getprotobynumber") }
3215sub pp_gsbyname { listop(@_, "getservbyname") }
3216sub pp_gsbyport { listop(@_, "getservbyport") }
3217sub pp_syscall { listop(@_, "syscall") }
3218
3219sub pp_glob {
3220 my $self = shift;
9d2c6865 3221 my($op, $cx) = @_;
93860275 3222 my $kid = $op->first->sibling; # skip pushmark
a32fbbd8
FC
3223 my $keyword =
3224 $op->flags & OPf_SPECIAL ? 'glob' : $self->keyword('glob');
18371617
LM
3225 my $text = $self->deparse($kid);
3226 return $cx >= 5 || $self->{'parens'}
3227 ? "$keyword($text)"
3228 : "$keyword $text";
6e90668e
SM
3229}
3230
f5aa8f4e
SM
3231# Truncate is special because OPf_SPECIAL makes a bareword first arg
3232# be a filehandle. This could probably be better fixed in the core
3233# by moving the GV lookup into ck_truc.
3234
3235sub pp_truncate {
3236 my $self = shift;
3237 my($op, $cx) = @_;
3238 my(@exprs);
3239 my $parens = ($cx >= 5) || $self->{'parens'};
3240 my $kid = $op->first->sibling;
acba1d67 3241 my $fh;
f5aa8f4e
SM
3242 if ($op->flags & OPf_SPECIAL) {
3243 # $kid is an OP_CONST
18228111 3244 $fh = $self->const_sv($kid)->PV;
f5aa8f4e
SM
3245 } else {
3246 $fh = $self->deparse($kid, 6);
3247 $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
3248 }
3249 my $len = $self->deparse($kid->sibling, 6);
4a1ac32e 3250 my $name = $self->keyword('truncate');
f5aa8f4e 3251 if ($parens) {
4a1ac32e 3252 return "$name($fh, $len)";
f5aa8f4e 3253 } else {
4a1ac32e 3254 return "$name $fh, $len";
f5aa8f4e 3255 }
f5aa8f4e
SM
3256}
3257
6e90668e
SM
3258sub indirop {
3259 my $self = shift;
9d2c6865 3260 my($op, $cx, $name) = @_;
6e90668e 3261 my($expr, @exprs);
521795fe 3262 my $firstkid = my $kid = $op->first->sibling;
6e90668e
SM
3263 my $indir = "";
3264 if ($op->flags & OPf_STACKED) {
3265 $indir = $kid;
3266 $indir = $indir->first; # skip rv2gv
3267 if (is_scope($indir)) {
9d2c6865 3268 $indir = "{" . $self->deparse($indir, 0) . "}";
d989cdac 3269 $indir = "{;}" if $indir eq "{}";
c73811ab
RH
3270 } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) {
3271 $indir = $self->const_sv($indir)->PV;
6e90668e 3272 } else {
9d2c6865 3273 $indir = $self->deparse($indir, 24);
6e90668e
SM
3274 }
3275 $indir = $indir . " ";
3276 $kid = $kid->sibling;
3277 }
7e80da18 3278 if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) {
3ac6e0f9 3279 $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} '
7e80da18
RH
3280 : '{$a <=> $b} ';
3281 }
3ac6e0f9 3282 elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) {
7e80da18
RH
3283 $indir = '{$b cmp $a} ';
3284 }
6e90668e 3285 for (; !null($kid); $kid = $kid->sibling) {
521795fe 3286 $expr = $self->deparse($kid, !$indir && $kid == $firstkid && $name eq "sort" && $firstkid->name eq "entersub" ? 16 : 6);
6e90668e
SM
3287 push @exprs, $expr;
3288 }
4a1ac32e 3289 my $name2;
3ac6e0f9 3290 if ($name eq "sort" && $op->private & OPpSORT_REVERSE) {
4a1ac32e 3291 $name2 = $self->keyword('reverse') . ' ' . $self->keyword('sort');
3ac6e0f9 3292 }
4a1ac32e 3293 else { $name2 = $self->keyword($name) }
2b6e98cb 3294 if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) {
3ac6e0f9 3295 return "$exprs[0] = $name2 $indir $exprs[0]";
2b6e98cb
DM
3296 }
3297
d989cdac 3298 my $args = $indir . join(", ", @exprs);
521795fe 3299 if ($indir ne "" && $name eq "sort") {
d989cdac
SM
3300 # We don't want to say "sort(f 1, 2, 3)", since perl -w will
3301 # give bareword warnings in that case. Therefore if context
3302 # requires, we'll put parens around the outside "(sort f 1, 2,
3303 # 3)". Unfortunately, we'll currently think the parens are
3c4b39be 3304 # necessary more often that they really are, because we don't
d989cdac
SM
3305 # distinguish which side of an assignment we're on.
3306 if ($cx >= 5) {
3ac6e0f9 3307 return "($name2 $args)";
d989cdac 3308 } else {
3ac6e0f9 3309 return "$name2 $args";
d989cdac 3310 }
521795fe
FC
3311 } elsif (
3312 !$indir && $name eq "sort"
ca331985 3313 && !null($op->first->sibling)
521795fe
FC
3314 && $op->first->sibling->name eq 'entersub'
3315 ) {
3316 # We cannot say sort foo(bar), as foo will be interpreted as a
3317 # comparison routine. We have to say sort(...) in that case.
3318 return "$name2($args)";
d989cdac 3319 } else {
9d52f6f3
FC
3320 return length $args
3321 ? $self->maybe_parens_func($name2, $args, $cx, 5)
3322 : $name2 . '()' x (7 < $cx);
d989cdac
SM
3323 }
3324
6e90668e
SM
3325}
3326
3327sub pp_prtf { indirop(@_, "printf") }
3328sub pp_print { indirop(@_, "print") }
9b08e3d3 3329sub pp_say { indirop(@_, "say") }
6e90668e
SM
3330sub pp_sort { indirop(@_, "sort") }
3331
3332sub mapop {
3333 my $self = shift;
9d2c6865 3334 my($op, $cx, $name) = @_;
6e90668e
SM
3335 my($expr, @exprs);
3336 my $kid = $op->first; # this is the (map|grep)start
3337 $kid = $kid->first->sibling; # skip a pushmark
3338 my $code = $kid->first; # skip a null
3339 if (is_scope $code) {
f4a44678 3340 $code = "{" . $self->deparse($code, 0) . "} ";
6e90668e 3341 } else {
6d08f7b3
DM
3342 $code = $self->deparse($code, 24);
3343 $code .= ", " if !null($kid->sibling);
6e90668e
SM
3344 }
3345 $kid = $kid->sibling;
3346 for (; !null($kid); $kid = $kid->sibling) {
9d2c6865 3347 $expr = $self->deparse($kid, 6);
9a58b761 3348 push @exprs, $expr if defined $expr;
6e90668e 3349 }
3188a821
FC
3350 return $self->maybe_parens_func($self->keyword($name),
3351 $code . join(", ", @exprs), $cx, 5);
6e90668e
SM
3352}
3353
d989cdac
SM
3354sub pp_mapwhile { mapop(@_, "map") }
3355sub pp_grepwhile { mapop(@_, "grep") }
11e09183
SP
3356sub pp_mapstart { baseop(@_, "map") }
3357sub pp_grepstart { baseop(@_, "grep") }
6e90668e 3358
12cea2fa
FC
3359my %uses_intro;
3360BEGIN {
3361 @uses_intro{
3362 eval { require B::Op_private }
e58dedd3 3363 ? @{$B::Op_private::ops_using{OPpLVAL_INTRO}}
12cea2fa
FC
3364 : qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice
3365 hslice delete padsv padav padhv enteriter entersub padrange
3366 pushmark cond_expr refassign list)
3367 } = ();
bba4f5ff 3368 delete @uses_intro{qw( lvref lvrefslice lvavref entersub )};
12cea2fa
FC
3369}
3370
6e90668e
SM
3371sub pp_list {
3372 my $self = shift;
9d2c6865 3373 my($op, $cx) = @_;
6e90668e
SM
3374 my($expr, @exprs);
3375 my $kid = $op->first->sibling; # skip pushmark
958ed56b 3376 return '' if class($kid) eq 'NULL';
6e90668e 3377 my $lop;
3462b4ac 3378 my $local = "either"; # could be local(...), my(...), state(...) or our(...)
56cd2ef8 3379 my $type;
6e90668e 3380 for ($lop = $kid; !null($lop); $lop = $lop->sibling) {
3b4e80b8 3381 my $lopname = $lop->name;
5f4d8496 3382 my $loppriv = $lop->private;
56cd2ef8 3383 my $newtype;
12cea2fa 3384 if ($lopname =~ /^pad[ash]v$/ && $loppriv & OPpLVAL_INTRO) {
5f4d8496
FC
3385 if ($loppriv & OPpPAD_STATE) { # state()
3386 ($local = "", last) if $local !~ /^(?:either|state)$/;
3462b4ac
RGS
3387 $local = "state";
3388 } else { # my()
5f4d8496 3389 ($local = "", last) if $local !~ /^(?:either|my)$/;
3462b4ac
RGS
3390 $local = "my";
3391 }
56cd2ef8
FC
3392 my $padname = $self->padname_sv($lop->targ);
3393 if ($padname->FLAGS & SVpad_TYPED) {
3394 $newtype = $padname->SvSTASH->NAME;
3395 }
3b4e80b8 3396 } elsif ($lopname =~ /^(?:gv|rv2)([ash])v$/
5f4d8496 3397 && $loppriv & OPpOUR_INTRO
40ced2f4
FC
3398 or $lopname eq "null" && class($lop) eq 'UNOP'
3399 && $lop->first->name eq "gvsv"
b8e103fc 3400 && $lop->first->private & OPpOUR_INTRO) { # our()
5f4d8496
FC
3401 my $newlocal = "local " x !!($loppriv & OPpLVAL_INTRO) . "our";
3402 ($local = "", last)
3403 if $local ne 'either' && $local ne $newlocal;
3404 $local = $newlocal;
56cd2ef8
FC
3405 my $funny = !$1 || $1 eq 's' ? '$' : $1 eq 'a' ? '@' : '%';
3406 if (my $t = $self->find_our_type(
3407 $funny . $self->gv_or_padgv($lop->first)->NAME
3408 )) {
3409 $newtype = $t;
3410 }
12cea2fa
FC
3411 } elsif ($lopname ne 'undef'
3412 and !($loppriv & OPpLVAL_INTRO)
3413 || !exists $uses_intro{$lopname eq 'null'
3414 ? substr B::ppname($lop->targ), 3
3415 : $lopname})
3416 {
3417 $local = ""; # or not
3418 last;
3419 } elsif ($lopname ne "undef")
3ac6e0f9
RGS
3420 {
3421 # local()
5f4d8496 3422 ($local = "", last) if $local !~ /^(?:either|local)$/;
6e90668e
SM
3423 $local = "local";
3424 }
56cd2ef8
FC
3425 if (defined $type && defined $newtype && $newtype ne $type) {
3426 $local = '';
3427 last;
3428 }
3429 $type = $newtype;
6e90668e
SM
3430 }
3431 $local = "" if $local eq "either"; # no point if it's all undefs
5f4d8496 3432 $local &&= join ' ', map $self->keyword($_), split / /, $local;
56cd2ef8 3433 $local .= " $type " if $local && length $type;
f5aa8f4e 3434 return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
6e90668e
SM
3435 for (; !null($kid); $kid = $kid->sibling) {
3436 if ($local) {
3f872cb9 3437 if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
6e90668e
SM
3438 $lop = $kid->first;
3439 } else {
3440 $lop = $kid;
3441 }
3442 $self->{'avoid_local'}{$$lop}++;
9d2c6865 3443 $expr = $self->deparse($kid, 6);
6e90668e
SM
3444 delete $self->{'avoid_local'}{$$lop};
3445 } else {
9d2c6865 3446 $expr = $self->deparse($kid, 6);
6e90668e
SM
3447 }
3448 push @exprs, $expr;
3449 }
9d2c6865
SM
3450 if ($local) {
3451 return "$local(" . join(", ", @exprs) . ")";
3452 } else {
3453 return $self->maybe_parens( join(", ", @exprs), $cx, 6);
3454 }
6e90668e
SM
3455}
3456
6f611a1a
GS
3457sub is_ifelse_cont {
3458 my $op = shift;
3459 return ($op->name eq "null" and class($op) eq "UNOP"
3460 and $op->first->name =~ /^(and|cond_expr)$/
3461 and is_scope($op->first->first->sibling));
3462}
3463
6e90668e
SM
3464sub pp_cond_expr {
3465 my $self = shift;
9d2c6865 3466 my($op, $cx) = @_;
6e90668e
SM
3467 my $cond = $op->first;
3468 my $true = $cond->sibling;
3469 my $false = $true->sibling;
9d2c6865 3470 my $cuddle = $self->{'cuddle'};
d989cdac 3471 unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and
58cccf98
SM
3472 (is_scope($false) || is_ifelse_cont($false))
3473 and $self->{'expand'} < 7) {
f5aa8f4e 3474 $cond = $self->deparse($cond, 8);
cfaba469 3475 $true = $self->deparse($true, 6);
9d2c6865
SM
3476 $false = $self->deparse($false, 8);
3477 return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
6f611a1a
GS
3478 }
3479
f5aa8f4e 3480 $cond = $self->deparse($cond, 1);
d989cdac 3481 $true = $self->deparse($true, 0);
7741ceed 3482 my $head = $self->keyword("if") . " ($cond) {\n\t$true\n\b}";
6f611a1a 3483 my @elsifs;
7741ceed 3484 my $elsif;
6f611a1a
GS
3485 while (!null($false) and is_ifelse_cont($false)) {
3486 my $newop = $false->first;
3487 my $newcond = $newop->first;
3488 my $newtrue = $newcond->sibling;
3489 $false = $newtrue->sibling; # last in chain is OP_AND => no else
7ecdd211
PJ
3490 if ($newcond->name eq "lineseq")
3491 {
3492 # lineseq to ensure correct line numbers in elsif()
3493 # Bug #37302 fixed by change #33710.
3494 $newcond = $newcond->first->sibling;
3495 }
6f611a1a
GS
3496 $newcond = $self->deparse($newcond, 1);
3497 $newtrue = $self->deparse($newtrue, 0);
7741ceed
FC
3498 $elsif ||= $self->keyword("elsif");
3499 push @elsifs, "$elsif ($newcond) {\n\t$newtrue\n\b}";
6f611a1a 3500 }
d989cdac 3501 if (!null($false)) {
7741ceed 3502 $false = $cuddle . $self->keyword("else") . " {\n\t" .
6f611a1a
GS
3503 $self->deparse($false, 0) . "\n\b}\cK";
3504 } else {
3505 $false = "\cK";
6e90668e 3506 }
d989cdac 3507 return $head . join($cuddle, "", @elsifs) . $false;
6e90668e
SM
3508}
3509
95562366
NC
3510sub pp_once {
3511 my ($self, $op, $cx) = @_;
3512 my $cond = $op->first;
3513 my $true = $cond->sibling;
3514
a1b22abd
FC
3515 my $ret = $self->deparse($true, $cx);
3516 $ret =~ s/^(\(?)\$/$1 . $self->keyword("state") . ' $'/e;
3517 $ret;
95562366
NC
3518}
3519
58cccf98 3520sub loop_common {
6e90668e 3521 my $self = shift;
58cccf98 3522 my($op, $cx, $init) = @_;
6e90668e
SM
3523 my $enter = $op->first;
3524 my $kid = $enter->sibling;
0ced6c29
RGS
3525 local(@$self{qw'curstash warnings hints hinthash'})
3526 = @$self{qw'curstash warnings hints hinthash'};
6e90668e 3527 my $head = "";
9d2c6865 3528 my $bare = 0;
58cccf98
SM
3529 my $body;
3530 my $cond = undef;
22584011 3531 my $name;
d989cdac 3532 if ($kid->name eq "lineseq") { # bare or infinite loop
241416b8 3533 if ($kid->last->name eq "unstack") { # infinite
e99ebc55 3534 $head = "while (1) "; # Can't use for(;;) if there's a continue
58cccf98 3535 $cond = "";
9d2c6865
SM
3536 } else {
3537 $bare = 1;
6e90668e 3538 }
58cccf98 3539 $body = $kid;
3f872cb9 3540 } elsif ($enter->name eq "enteriter") { # foreach
6e90668e
SM
3541 my $ary = $enter->first->sibling; # first was pushmark
3542 my $var = $ary->sibling;
36d57d93
RGS
3543 if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) {
3544 # "reverse" was optimised away
aae53c41 3545 $ary = listop($self, $ary->first->sibling, 1, 'reverse');
36d57d93 3546 } elsif ($enter->flags & OPf_STACKED
f5aa8f4e
SM
3547 and not null $ary->first->sibling->sibling)
3548 {
d7f5b6da
SM
3549 $ary = $self->deparse($ary->first->sibling, 9) . " .. " .
3550 $self->deparse($ary->first->sibling->sibling, 9);
d8d95777
GA
3551 } else {
3552 $ary = $self->deparse($ary, 1);
3553 }
6e90668e 3554 if (null $var) {
dacd2ca7 3555 $var = $self->pp_padsv($enter, 1, 1);
3f872cb9 3556 } elsif ($var->name eq "rv2gv") {
9d2c6865 3557 $var = $self->pp_rv2sv($var, 1);
241416b8
DM
3558 if ($enter->private & OPpOUR_INTRO) {
3559 # our declarations don't have package names
3560 $var =~ s/^(.).*::/$1/;
3561 $var = "our $var";
3562 }
3f872cb9 3563 } elsif ($var->name eq "gv") {
9d2c6865 3564 $var = "\$" . $self->deparse($var, 1);
9187b6e4
FC
3565 } else {
3566 $var = $self->deparse($var, 1);
6e90668e 3567 }
58cccf98 3568 $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
afb60448 3569 if (!is_state $body->first and $body->first->name !~ /^(?:stub|leave|scope)$/) {
cf24a840
SM
3570 confess unless $var eq '$_';
3571 $body = $body->first;
7741ceed
FC
3572 return $self->deparse($body, 2) . " "
3573 . $self->keyword("foreach") . " ($ary)";
cf24a840
SM
3574 }
3575 $head = "foreach $var ($ary) ";
3f872cb9 3576 } elsif ($kid->name eq "null") { # while/until
6e90668e 3577 $kid = $kid->first;
22584011
FC
3578 $name = {"and" => "while", "or" => "until"}->{$kid->name};
3579 $cond = $kid->first;
58cccf98 3580 $body = $kid->first->sibling;
3f872cb9 3581 } elsif ($kid->name eq "stub") { # bare and empty
9d2c6865 3582 return "{;}"; # {} could be a hashref
6e90668e 3583 }
58cccf98 3584 # If there isn't a continue block, then the next pointer for the loop
241416b8 3585 # will point to the unstack, which is kid's last child, except
58cccf98 3586 # in a bare loop, when it will point to the leaveloop. When neither of
241416b8 3587 # these conditions hold, then the second-to-last child is the continue
58cccf98
SM
3588 # block (or the last in a bare loop).
3589 my $cont_start = $enter->nextop;
3590 my $cont;
22584011
FC
3591 my $precond;
3592 my $postcond;
241416b8 3593 if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) {
58cccf98
SM
3594 if ($bare) {
3595 $cont = $body->last;
3596 } else {
3597 $cont = $body->first;
241416b8 3598 while (!null($cont->sibling->sibling)) {
58cccf98
SM
3599 $cont = $cont->sibling;
3600 }
3601 }
3602 my $state = $body->first;
3603 my $cuddle = $self->{'cuddle'};
3604 my @states;
3605 for (; $$state != $$cont; $state = $state->sibling) {
3606 push @states, $state;
3607 }
93a8ff62 3608 $body = $self->lineseq(undef, 0, @states);
58cccf98 3609 if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
22584011
FC
3610 $precond = "for ($init; ";
3611 $postcond = "; " . $self->deparse($cont, 1) .") ";
58cccf98
SM
3612 $cont = "\cK";
3613 } else {
3614 $cont = $cuddle . "continue {\n\t" .
3615 $self->deparse($cont, 0) . "\n\b}\cK";
6e90668e 3616 }
6e90668e 3617 } else {
7a9b44b9 3618 return "" if !defined $body;
c73811ab 3619 if (length $init) {
22584011
FC
3620 $precond = "for ($init; ";
3621 $postcond = ";) ";
c73811ab 3622 }
9d2c6865 3623 $cont = "\cK";
58cccf98 3624 $body = $self->deparse($body, 0);
6e90668e 3625 }
22584011 3626 if ($precond) { # for(;;)
88a758b5
FC
3627 $cond &&= $name eq 'until'
3628 ? listop($self, undef, 1, "not", $cond->first)
3629 : $self->deparse($cond, 1);
22584011
FC
3630 $head = "$precond$cond$postcond";
3631 }
3632 if ($name && !$head) {
3633 ref $cond and $cond = $self->deparse($cond, 1);
3634 $head = "$name ($cond) ";
3635 }
7741ceed 3636 $head =~ s/^(for(?:each)?|while|until)/$self->keyword($1)/e;
ce4e655d 3637 $body =~ s/;?$/;\n/;
34a48b4b
RH
3638
3639 return $head . "{\n\t" . $body . "\b}" . $cont;
58cccf98
SM
3640}
3641
09d856fb 3642sub pp_leaveloop { shift->loop_common(@_, "") }
58cccf98
SM
3643
3644sub for_loop {
3645 my $self = shift;
3646 my($op, $cx) = @_;
3647 my $init = $self->deparse($op, 1);
eae48c89
Z
3648 my $s = $op->sibling;
3649 my $ll = $s->name eq "unstack" ? $s->sibling : $s->first->sibling;
3650 return $self->loop_common($ll, $cx, $init);
6e90668e
SM
3651}
3652
3653sub pp_leavetry {
3654 my $self = shift;
9d2c6865 3655 return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
bd0865ec 3656}
6e90668e 3657
7d3c8a68
S
3658sub _op_is_or_was {
3659 my ($op, $expect_type) = @_;
3660 my $type = $op->type;
3661 return($type == $expect_type
3662 || ($type == OP_NULL && $op->targ == $expect_type));
3663}
3664
a798dbf2 3665sub pp_null {
34b54951 3666 my($self, $op, $cx) = @_;
6e90668e 3667 if (class($op) eq "OP") {
f4a44678
SM
3668 # old value is lost
3669 return $self->{'ex_const'} if $op->targ == OP_CONST;
619dadb5 3670 } elsif (class ($op) eq "COP") {
34b54951 3671 return &pp_nextstate;
7d3c8a68
S
3672 } elsif ($op->first->name eq 'pushmark'
3673 or $op->first->name eq 'null'
3674 && $op->first->targ == OP_PUSHMARK
3675 && _op_is_or_was($op, OP_LIST)) {
9d2c6865 3676 return $self->pp_list($op, $cx);
3f872cb9 3677 } elsif ($op->first->name eq "enter") {
9d2c6865 3678 return $self->pp_leave($op, $cx);
31c6271a
RD
3679 } elsif ($op->first->name eq "leave") {
3680 return $self->pp_leave($op->first, $cx);
3681 } elsif ($op->first->name eq "scope") {
3682 return $self->pp_scope($op->first, $cx);
bd0865ec 3683 } elsif ($op->targ == OP_STRINGIFY) {
6f611a1a 3684 return $self->dquote($op, $cx);
f4002a4b
FC
3685 } elsif ($op->targ == OP_GLOB) {
3686 return $self->pp_glob(
3687 $op->first # entersub
3688 ->first # ex-list
3689 ->first # pushmark
3690 ->sibling, # glob
3691 $cx
3692 );
6e90668e 3693 } elsif (!null($op->first->sibling) and
3f872cb9 3694 $op->first->sibling->name eq "readline" and
6e90668e 3695 $op->first->sibling->flags & OPf_STACKED) {
9d2c6865
SM
3696 return $self->maybe_parens($self->deparse($op->first, 7) . " = "
3697 . $self->deparse($op->first->sibling, 7),
3698 $cx, 7);
6e90668e 3699 } elsif (!null($op->first->sibling) and
d52196e1 3700 $op->first->sibling->name =~ /^transr?\z/ and
6e90668e 3701 $op->first->sibling->flags & OPf_STACKED) {
9d2c6865
SM
3702 return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
3703 . $self->deparse($op->first->sibling, 20),
3704 $cx, 20);
d989cdac 3705 } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) {
3188a821
FC
3706 return ($self->lex_in_scope("&do") ? "CORE::do" : "do")
3707 . " {\n\t". $self->deparse($op->first, $cx) ."\n\b};";
ad8caead
RGS
3708 } elsif (!null($op->first->sibling) and
3709 $op->first->sibling->name eq "null" and
3710 class($op->first->sibling) eq "UNOP" and
3711 $op->first->sibling->first->flags & OPf_STACKED and
3712 $op->first->sibling->first->name eq "rcatline") {
3713 return $self->maybe_parens($self->deparse($op->first, 18) . " .= "
3714 . $self->deparse($op->first->sibling, 18),
3715 $cx, 18);
6e90668e 3716 } else {
9d2c6865 3717 return $self->deparse($op->first, $cx);
6e90668e 3718 }
a798dbf2
MB
3719}
3720
6e90668e
SM
3721sub padname {
3722 my $self = shift;
3723 my $targ = shift;
68223ea3 3724 return $self->padname_sv($targ)->PVX;
6e90668e
SM
3725}
3726
3727sub padany {
3728 my $self = shift;
3729 my $op = shift;
3730 return substr($self->padname($op->targ), 1); # skip $/@/%
3731}
3732
3733sub pp_padsv {
3734 my $self = shift;
4da9a2ca 3735 my($op, $cx, $forbid_parens) = @_;
8db6f480
FC
3736 my $targ = $op->targ;
3737 return $self->maybe_my($op, $cx, $self->padname($targ),
3738 $self->padname_sv($targ),
4da9a2ca 3739 $forbid_parens);
6e90668e
SM
3740}
3741
3742sub pp_padav { pp_padsv(@_) }
3743sub pp_padhv { pp_padsv(@_) }
3744
6f611a1a 3745sub gv_or_padgv {
18228111
GS
3746 my $self = shift;
3747 my $op = shift;
6f611a1a
GS
3748 if (class($op) eq "PADOP") {
3749 return $self->padval($op->padix);
3750 } else { # class($op) eq "SVOP"
3751 return $op->gv;
18228111 3752 }
18228111
GS
3753}
3754
6e90668e
SM
3755sub pp_gvsv {
3756 my $self = shift;
9d2c6865 3757 my($op, $cx) = @_;
6f611a1a 3758 my $gv = $self->gv_or_padgv($op);
8510e997 3759 return $self->maybe_local($op, $cx, $self->stash_variable("\$",
bb8996b8 3760 $self->gv_name($gv), $cx));
6e90668e
SM
3761}
3762
3763sub pp_gv {
3764 my $self = shift;
9d2c6865 3765 my($op, $cx) = @_;
6f611a1a 3766 my $gv = $self->gv_or_padgv($op);
18228111 3767 return $self->gv_name($gv);
6e90668e
SM
3768}
3769
93bad3fd
NC
3770sub pp_aelemfast_lex {
3771 my $self = shift;
3772 my($op, $cx) = @_;
3773 my $name = $self->padname($op->targ);
3774 $name =~ s/^@/\$/;
b024352e
DM
3775 my $i = $op->private;
3776 $i -= 256 if $i > 127;
3777 return $name . "[" . ($i + $self->{'arybase'}) . "]";
93bad3fd
NC
3778}
3779
6e90668e
SM
3780sub pp_aelemfast {
3781 my $self = shift;
9d2c6865 3782 my($op, $cx) = @_;
93bad3fd
NC
3783 # optimised PADAV, pre 5.15
3784 return $self->pp_aelemfast_lex(@_) if ($op->flags & OPf_SPECIAL);
ce4e655d 3785
93bad3fd 3786 my $gv = $self->gv_or_padgv($op);
be6cf5cf
FC
3787 my($name,$quoted) = $self->stash_variable_name('@',$gv);
3788 $name = $quoted ? "$name->" : '$' . $name;
b024352e
DM
3789 my $i = $op->private;
3790 $i -= 256 if $i > 127;
3791 return $name . "[" . ($i + $self->{'arybase'}) . "]";
6e90668e
SM
3792}
3793
3794sub rv2x {
3795 my $self = shift;
9d2c6865 3796 my($op, $cx, $type) = @_;
90c0eb26
RH
3797
3798 if (class($op) eq 'NULL' || !$op->can("first")) {
ff97752d 3799 carp("Unexpected op in pp_rv2x");
90c0eb26
RH
3800 return 'XXX';
3801 }
6e90668e 3802 my $kid = $op->first;
d989cdac 3803 if ($kid->name eq "gv") {
bb8996b8 3804 return $self->stash_variable($type, $self->deparse($kid, 0), $cx);
d989cdac
SM
3805 } elsif (is_scalar $kid) {
3806 my $str = $self->deparse($kid, 0);
3807 if ($str =~ /^\$([^\w\d])\z/) {
3808 # "$$+" isn't a legal way to write the scalar dereference
3809 # of $+, since the lexer can't tell you aren't trying to
3810 # do something like "$$ + 1" to get one more than your
3811 # PID. Either "${$+}" or "$${+}" are workable
3812 # disambiguations, but if the programmer did the former,
3813 # they'd be in the "else" clause below rather than here.
3814 # It's not clear if this should somehow be unified with
3815 # the code in dq and re_dq that also adds lexer
3816 # disambiguation braces.
3817 $str = '$' . "{$1}"; #'
3818 }
3819 return $type . $str;
3820 } else {
3821 return $type . "{" . $self->deparse($kid, 0) . "}";
3822 }
6e90668e
SM
3823}
3824
3825sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) }
3826sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) }
3827sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
3828
3829# skip rv2av
3830sub pp_av2arylen {
3831 my $self = shift;
9d2c6865 3832 my($op, $cx) = @_;
3f872cb9 3833 if ($op->first->name eq "padav") {
9d2c6865 3834 return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
6e90668e 3835 } else {
f5aa8f4e
SM
3836 return $self->maybe_local($op, $cx,
3837 $self->rv2x($op->first, $cx, '$#'));
6e90668e
SM
3838 }
3839}
3840
3841# skip down to the old, ex-rv2cv
90c0eb26
RH
3842sub pp_rv2cv {
3843 my ($self, $op, $cx) = @_;
3844 if (!null($op->first) && $op->first->name eq 'null' &&
76e14ed3 3845 $op->first->targ == OP_LIST)
90c0eb26
RH
3846 {
3847 return $self->rv2x($op->first->first->sibling, $cx, "&")
3848 }
3849 else {
3850 return $self->rv2x($op, $cx, "")
3851 }
3852}
6e90668e 3853
d989cdac
SM
3854sub list_const {
3855 my $self = shift;
3856 my($cx, @list) = @_;
3857 my @a = map $self->const($_, 6), @list;
3858 if (@a == 0) {
3859 return "()";
3860 } elsif (@a == 1) {
3861 return $a[0];
3862 } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) {
3863 # collapse (-1,0,1,2) into (-1..2)
3864 my ($s, $e) = @a[0,-1];
3865 my $i = $s;
3866 return $self->maybe_parens("$s..$e", $cx, 9)
3867 unless grep $i++ != $_, @a;
3868 }
3869 return $self->maybe_parens(join(", ", @a), $cx, 6);
3870}
3871
6e90668e
SM
3872sub pp_rv2av {
3873 my $self = shift;
9d2c6865 3874 my($op, $cx) = @_;
6e90668e 3875 my $kid = $op->first;
3f872cb9 3876 if ($kid->name eq "const") { # constant list
18228111 3877 my $av = $self->const_sv($kid);
d989cdac 3878 return $self->list_const($cx, $av->ARRAY);
6e90668e 3879 } else {
9d2c6865 3880 return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
6e90668e
SM
3881 }
3882 }
3883
3ed82cfc
GS
3884sub is_subscriptable {
3885 my $op = shift;
fedf30e1 3886 if ($op->name =~ /^([ahg]elem|multideref$)/) {
3ed82cfc
GS
3887 return 1;
3888 } elsif ($op->name eq "entersub") {
3889 my $kid = $op->first;
3890 return 0 unless null $kid->sibling;
3891 $kid = $kid->first;
3892 $kid = $kid->sibling until null $kid->sibling;
3893 return 0 if is_scope($kid);
3894 $kid = $kid->first;
73582821 3895 return 0 if $kid->name eq "gv" || $kid->name eq "padcv";
3ed82cfc
GS
3896 return 0 if is_scalar($kid);
3897 return is_subscriptable($kid);
3898 } else {
3899 return 0;
3900 }
3901}
6e90668e 3902
21b7468a
BL
3903sub elem_or_slice_array_name
3904{
6e90668e 3905 my $self = shift;
21b7468a
BL
3906 my ($array, $left, $padname, $allow_arrow) = @_;
3907
3f872cb9 3908 if ($array->name eq $padname) {
21b7468a 3909 return $self->padany($array);
6e90668e 3910 } elsif (is_scope($array)) { # ${expr}[0]
21b7468a 3911 return "{" . $self->deparse($array, 0) . "}";
ce4e655d 3912 } elsif ($array->name eq "gv") {
10e8e32b
FC
3913 ($array, my $quoted) =
3914 $self->stash_variable_name(
3915 $left eq '[' ? '@' : '%', $self->gv_or_padgv($array)
3916 );
3917 if (!$allow_arrow && $quoted) {
3918 # This cannot happen.
3919 die "Invalid variable name $array for slice";
ce4e655d 3920 }
10e8e32b 3921 return $quoted ? "$array->" : $array;
21b7468a
BL
3922 } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ...
3923 return $self->deparse($array, 24);
6e90668e 3924 } else {
21b7468a 3925 return undef;
6e90668e 3926 }
21b7468a
BL
3927}
3928
3929sub elem_or_slice_single_index
3930{
3931 my $self = shift;
3932 my ($idx) = @_;
3933
9d2c6865 3934 $idx = $self->deparse($idx, 1);
7a9b44b9
RH
3935
3936 # Outer parens in an array index will confuse perl
3937 # if we're interpolating in a regular expression, i.e.
3938 # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/
3939 #
3940 # If $self->{parens}, then an initial '(' will
3941 # definitely be paired with a final ')'. If
3942 # !$self->{parens}, the misleading parens won't
3943 # have been added in the first place.
3944 #
3945 # [You might think that we could get "(...)...(...)"
3946 # where the initial and final parens do not match
3947 # each other. But we can't, because the above would
3948 # only happen if there's an infix binop between the
3949 # two pairs of parens, and *that* means that the whole
3950 # expression would be parenthesized as well.]
3951 #
3952 $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'};
3953
098251bc
RH
3954 # Hash-element braces will autoquote a bareword inside themselves.
3955 # We need to make sure that C<$hash{warn()}> doesn't come out as
3956 # C<$hash{warn}>, which has a quite different meaning. Currently
3957 # B::Deparse will always quote strings, even if the string was a
3958 # bareword in the original (i.e. the OPpCONST_BARE flag is ignored
3959 # for constant strings.) So we can cheat slightly here - if we see
3960 # a bareword, we know that it is supposed to be a function call.
3961 #
3962 $idx =~ s/^([A-Za-z_]\w*)$/$1()/;
3963
21b7468a
BL
3964 return $idx;
3965}
3966
3967sub elem {
3968 my $self = shift;
3969 my ($op, $cx, $left, $right, $padname) = @_;
3970 my($array, $idx) = ($op->first, $op->first->sibling);
3971
3972 $idx = $self->elem_or_slice_single_index($idx);
3973
3974 unless ($array->name eq $padname) { # Maybe this has been fixed
3975 $array = $array->first; # skip rv2av (or ex-rv2av in _53+)
3976 }
3977 if (my $array_name=$self->elem_or_slice_array_name
3978 ($array, $left, $padname, 1)) {
bcbe2b27
FC
3979 return ($array_name =~ /->\z/
3980 ? $array_name
3981 : $array_name eq '#' ? '${#}' : "\$" . $array_name)
10e8e32b 3982 . $left . $idx . $right;
21b7468a
BL
3983 } else {
3984 # $x[20][3]{hi} or expr->[20]
3985 my $arrow = is_subscriptable($array) ? "" : "->";
3986 return $self->deparse($array, 24) . $arrow . $left . $idx . $right;
3987 }
3988
6e90668e
SM
3989}
3990
fedf30e1
DM
3991# a simplified version of elem_or_slice_array_name()
3992# for the use of pp_multideref
3993
3994sub multideref_var_name {
3995 my $self = shift;
3996 my ($gv, $is_hash) = @_;
3997
3998 my ($name, $quoted) =
3999 $self->stash_variable_name( $is_hash ? '%' : '@', $gv);
4000 return $quoted ? "$name->"
4001 : $name eq '#'
4002 ? '${#}' # avoid ${#}[1] => $#[1]
4003 : '$' . $name;
4004}
4005
4006
4007sub pp_multideref {
4008 my $self = shift;
4009 my($op, $cx) = @_;
4010 my $text = "";
4011
4012 if ($op->private & OPpMULTIDEREF_EXISTS) {
4013 $text = $self->keyword("exists"). " ";
4014 }
4015 elsif ($op->private & OPpMULTIDEREF_DELETE) {
4016 $text = $self->keyword("delete"). " ";
4017 }
4018 elsif ($op->private & OPpLVAL_INTRO) {
4019 $text = $self->keyword("local"). " ";
4020 }
4021
4022 if ($op->first && ($op->first->flags & OPf_KIDS)) {
4023 # arbitrary initial expression, e.g. f(1,2,3)->[...]
4024 $text .= $self->deparse($op->first, 24);
4025 }
4026
4027 my @items = $op->aux_list($self->{curcv});
4028 my $actions = shift @items;
4029
4030 my $is_hash;
4031 my $derefs = 0;
4032
4033 while (1) {
4034 if (($actions & MDEREF_ACTION_MASK) == MDEREF_reload) {
4035 $actions = shift @items;
4036 next;
4037 }
4038
4039 $is_hash = (
4040 ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_pop_rv2hv_helem
4041 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvsv_vivify_rv2hv_helem
4042 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padsv_vivify_rv2hv_helem
4043 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_vivify_rv2hv_helem
4044 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padhv_helem
4045 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvhv_helem
4046 );
4047
4048 if ( ($actions & MDEREF_ACTION_MASK) == MDEREF_AV_padav_aelem
4049 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padhv_helem)
4050 {
4051 $derefs = 1;
4052 $text .= '$' . substr($self->padname(shift @items), 1);
4053 }
4054 elsif ( ($actions & MDEREF_ACTION_MASK) == MDEREF_AV_gvav_aelem
4055 || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvhv_helem)
4056 {
4057 $derefs = 1;
4058 $text .= $self->multideref_var_name(shift @items, $is_hash);
4059 }
4060 else {
4061 if ( ($actions & MDEREF_ACTION_MASK) ==
4062 MDEREF_AV_padsv_vivify_rv2av_aelem
4063 || ($actions & MDEREF_ACTION_MASK) ==
4064 MDEREF_HV_padsv_vivify_rv2hv_helem)
4065 {
4066 $text .= $self->padname(shift @items);
4067 }
4068 elsif ( ($actions & MDEREF_ACTION_MASK) ==
4069 MDEREF_AV_gvsv_vivify_rv2av_aelem
4070 || ($actions & MDEREF_ACTION_MASK) ==
4071 MDEREF_HV_gvsv_vivify_rv2hv_helem)
4072 {
4073 $text .= $self->multideref_var_name(shift @items, $is_hash);
4074 }
4075 elsif ( ($actions & MDEREF_ACTION_MASK) ==
4076 MDEREF_AV_pop_rv2av_aelem
4077 || ($actions & MDEREF_ACTION_MASK) ==
4078 MDEREF_HV_pop_rv2hv_helem)
4079 {
4080 if ( ($op->flags & OPf_KIDS)
4081 && ( _op_is_or_was($op->first, OP_RV2AV)
4082 || _op_is_or_was($op->first, OP_RV2HV))
4083 && ($op->first->flags & OPf_KIDS)
4084 && ( _op_is_or_was($op->first->first, OP_AELEM)
4085 || _op_is_or_was($op->first->first, OP_HELEM))
4086 )
4087 {
4088 $derefs++;
4089 }
4090 }
4091
4092 $text .= '->' if !$derefs++;
4093 }
4094
4095
4096 if (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_none) {
4097 last;
4098 }
4099
4100 $text .= $is_hash ? '{' : '[';
4101
4102 if (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_const) {
4103 my $key = shift @items;
4104 if ($is_hash) {
4105 $text .= $self->const($key, $cx);
4106 }
4107 else {
4108 $text .= $key;
4109 }
4110 }
4111 elsif (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_padsv) {
4112 $text .= $self->padname(shift @items);
4113 }
4114 elsif (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_gvsv) {
4115 $text .= '$' . ($self->stash_variable_name('$', shift @items))[0];
4116 }
4117
4118 $text .= $is_hash ? '}' : ']';
4119
4120 if ($actions & MDEREF_FLAG_last) {
4121 last;
4122 }
4123 $actions >>= MDEREF_SHIFT;
4124 }
4125
4126 return $text;
4127}
4128
4129
3f872cb9
GS
4130sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
4131sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
6e90668e
SM
4132
4133sub pp_gelem {
4134 my $self = shift;
9d2c6865 4135 my($op, $cx) = @_;
6e90668e
SM
4136 my($glob, $part) = ($op->first, $op->last);
4137 $glob = $glob->first; # skip rv2gv
3f872cb9 4138 $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
9d2c6865
SM
4139 my $scope = is_scope($glob);
4140 $glob = $self->deparse($glob, 0);
4141 $part = $self->deparse($part, 1);
6e90668e
SM
4142 return "*" . ($scope ? "{$glob}" : $glob) . "{$part}";
4143}
4144
4145sub slice {
4146 my $self = shift;
9d2c6865 4147 my ($op, $cx, $left, $right, $regname, $padname) = @_;
6e90668e
SM
4148 my $last;
4149 my(@elems, $kid, $array, $list);
4150 if (class($op) eq "LISTOP") {
4151 $last = $op->last;
4152 } else { # ex-hslice inside delete()
4153 for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {}
4154 $last = $kid;
4155 }
4156 $array = $last;
4157 $array = $array->first
3f872cb9 4158 if $array->name eq $regname or $array->name eq "null";
21b7468a 4159 $array = $self->elem_or_slice_array_name($array,$left,$padname,0);
6e90668e 4160 $kid = $op->first->sibling; # skip pushmark
3f872cb9 4161 if ($kid->name eq "list") {
6e90668e
SM
4162 $kid = $kid->first->sibling; # skip list, pushmark
4163 for (; !null $kid; $kid = $kid->sibling) {
9d2c6865 4164 push @elems, $self->deparse($kid, 6);
6e90668e
SM
4165 }
4166 $list = join(", ", @elems);
4167 } else {
21b7468a 4168 $list = $self->elem_or_slice_single_index($kid);
6e90668e 4169 }
5cae3edb
RZ
4170 my $lead = '@';
4171 $lead = '%' if $op->name =~ /^kv/i;
4172 return $lead . $array . $left . $list . $right;
6e90668e
SM
4173}
4174
5cae3edb 4175sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
6dd3e0f2 4176sub pp_kvaslice { slice(@_, "[", "]", "rv2av", "padav") }
5cae3edb
RZ
4177sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
4178sub pp_kvhslice { slice(@_, "{", "}", "rv2hv", "padhv") }
6e90668e
SM
4179
4180sub pp_lslice {
4181 my $self = shift;
9d2c6865 4182 my($op, $cx) = @_;
6e90668e
SM
4183 my $idx = $op->first;
4184 my $list = $op->last;
4185 my(@elems, $kid);
9d2c6865
SM
4186 $list = $self->deparse($list, 1);
4187 $idx = $self->deparse($idx, 1);
4188 return "($list)" . "[$idx]";
6e90668e
SM
4189}
4190
6e90668e
SM
4191sub want_scalar {
4192 my $op = shift;
4193 return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
4194}
4195
bd0865ec
GS
4196sub want_list {
4197 my $op = shift;
4198 return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
4199}
4200
09d856fb 4201sub _method {
6e90668e 4202 my $self = shift;
9d2c6865 4203 my($op, $cx) = @_;
bd0865ec
GS
4204 my $kid = $op->first->sibling; # skip pushmark
4205 my($meth, $obj, @exprs);
3f872cb9 4206 if ($kid->name eq "list" and want_list $kid) {
bd0865ec
GS
4207 # When an indirect object isn't a bareword but the args are in
4208 # parens, the parens aren't part of the method syntax (the LLAFR
4209 # doesn't apply), but they make a list with OPf_PARENS set that
4210 # doesn't get flattened by the append_elem that adds the method,
4211 # making a (object, arg1, arg2, ...) list where the object
d989cdac 4212 # usually is. This can be distinguished from
e38ccfd9 4213 # '($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
bd0865ec
GS
4214 # object) because in the later the list is in scalar context
4215 # as the left side of -> always is, while in the former
4216 # the list is in list context as method arguments always are.
4217 # (Good thing there aren't method prototypes!)
3ed82cfc 4218 $meth = $kid->sibling;
bd0865ec
GS
4219 $kid = $kid->first->sibling; # skip pushmark
4220 $obj = $kid;
6e90668e 4221 $kid = $kid->sibling;
bd0865ec 4222 for (; not null $kid; $kid = $kid->sibling) {
09d856fb 4223 push @exprs, $kid;
6e90668e 4224 }
bd0865ec
GS
4225 } else {
4226 $obj = $kid;
4227 $kid = $kid->sibling;
35a99a08 4228 for (; !null ($kid->sibling) && $kid->name!~/^method(?:_named)?\z/;
90c0eb26 4229 $kid = $kid->sibling) {
09d856fb 4230 push @exprs, $kid
6e90668e 4231 }
3ed82cfc 4232 $meth = $kid;
bd0865ec 4233 }
09d856fb 4234
3ed82cfc 4235 if ($meth->name eq "method_named") {
b46e009d 4236 $meth = $self->meth_sv($meth)->PV;
7d6c333c 4237 } elsif ($meth->name eq "method_super") {
4238 $meth = "SUPER::".$self->meth_sv($meth)->PV;
810bd8b7 4239 } elsif ($meth->name eq "method_redir") {
4240 $meth = $self->meth_rclass_sv($meth)->PV.'::'.$self->meth_sv($meth)->PV;
4241 } elsif ($meth->name eq "method_redir_super") {
4242 $meth = $self->meth_rclass_sv($meth)->PV.'::SUPER::'.
4243 $self->meth_sv($meth)->PV;
bd0865ec 4244 } else {
3ed82cfc
GS
4245 $meth = $meth->first;
4246 if ($meth->name eq "const") {
4247 # As of 5.005_58, this case is probably obsoleted by the
4248 # method_named case above
18228111 4249 $meth = $self->const_sv($meth)->PV; # needs to be bare
3ed82cfc 4250 }
bd0865ec 4251 }
09d856fb
CK
4252
4253 return { method => $meth, variable_method => ref($meth),
1bf8bbb0
FC
4254 object => $obj, args => \@exprs },
4255 $cx;
09d856fb
CK
4256}
4257
4258# compat function only
4259sub method {
4260 my $self = shift;
4261 my $info = $self->_method(@_);
4262 return $self->e_method( $self->_method(@_) );
4263}
4264
4265sub e_method {
1bf8bbb0 4266 my ($self, $info, $cx) = @_;
09d856fb
CK
4267 my $obj = $self->deparse($info->{object}, 24);
4268
4269 my $meth = $info->{method};
4270 $meth = $self->deparse($meth, 1) if $info->{variable_method};
4271 my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} );
1bf8bbb0
FC
4272 if ($info->{object}->name eq 'scope' && want_list $info->{object}) {
4273 # method { $object }
4274 # This must be deparsed this way to preserve list context
4275 # of $object.
4276 my $need_paren = $cx >= 6;
4277 return '(' x $need_paren
4278 . $meth . substr($obj,2) # chop off the "do"
4279 . " $args"
4280 . ')' x $need_paren;
4281 }
09d856fb 4282 my $kid = $obj . "->" . $meth;
145eb477 4283 if (length $args) {
bd0865ec
GS
4284 return $kid . "(" . $args . ")"; # parens mandatory
4285 } else {
4286 return $kid;
4287 }
4288}
4289
4290# returns "&" if the prototype doesn't match the args,
4291# or ("", $args_after_prototype_demunging) if it does.
4292sub check_proto {
4293 my $self = shift;
acaaef34 4294 return "&" if $self->{'noproto'};
bd0865ec
GS
4295 my($proto, @args) = @_;
4296 my($arg, $real);
4297 my $doneok = 0;
4298 my @reals;
4299 # An unbackslashed @ or % gobbles up the rest of the args
2ae48fff 4300 1 while $proto =~ s/(?<!\\)([@%])[^\]]+$/$1/;
c4cf781e 4301 $proto =~ s/^\s*//;
bd0865ec 4302 while ($proto) {
fd8be4a1 4303 $proto =~ s/^(\\?[\$\@&%*_]|\\\[[\$\@&%*]+\]|;|)\s*//;
bd0865ec
GS
4304 my $chr = $1;
4305 if ($chr eq "") {
4306 return "&" if @args;
4307 } elsif ($chr eq ";") {
4308 $doneok = 1;
4309 } elsif ($chr eq "@" or $chr eq "%") {
4310 push @reals, map($self->deparse($_, 6), @args);
4311 @args = ();
6e90668e 4312 } else {
bd0865ec
GS
4313 $arg = shift @args;
4314 last unless $arg;
21b52158 4315 if ($chr eq "\$" || $chr eq "_") {
bd0865ec
GS
4316 if (want_scalar $arg) {
4317 push @reals, $self->deparse($arg, 6);
4318 } else {
4319 return "&";
4320 }
4321 } elsif ($chr eq "&") {
3f872cb9 4322 if ($arg->name =~ /^(s?refgen|undef)$/) {
bd0865ec
GS
4323 push @reals, $self->deparse($arg, 6);
4324 } else {
4325 return "&";
4326 }
4327 } elsif ($chr eq "*") {
3f872cb9
GS
4328 if ($arg->name =~ /^s?refgen$/
4329 and $arg->first->first->name eq "rv2gv")
bd0865ec
GS
4330 {
4331 $real = $arg->first->first; # skip refgen, null
3f872cb9 4332 if ($real->first->name eq "gv") {
bd0865ec
GS
4333 push @reals, $self->deparse($real, 6);
4334 } else {
4335 push @reals, $self->deparse($real->first, 6);
4336 }
4337 } else {
4338 return "&";
4339 }
4340 } elsif (substr($chr, 0, 1) eq "\\") {
2ae48fff 4341 $chr =~ tr/\\[]//d;
3f872cb9 4342 if ($arg->name =~ /^s?refgen$/ and
bd0865ec 4343 !null($real = $arg->first) and
2ae48fff
RGS
4344 ($chr =~ /\$/ && is_scalar($real->first)
4345 or ($chr =~ /@/
4346 && class($real->first->sibling) ne 'NULL'
3f872cb9
GS
4347 && $real->first->sibling->name
4348 =~ /^(rv2|pad)av$/)
2ae48fff
RGS
4349 or ($chr =~ /%/
4350 && class($real->first->sibling) ne 'NULL'
3f872cb9
GS
4351 && $real->first->sibling->name
4352 =~ /^(rv2|pad)hv$/)
2ae48fff 4353 #or ($chr =~ /&/ # This doesn't work
3f872cb9 4354 # && $real->first->name eq "rv2cv")
2ae48fff 4355 or ($chr =~ /\*/
3f872cb9 4356 && $real->first->name eq "rv2gv")))
bd0865ec
GS
4357 {
4358 push @reals, $self->deparse($real, 6);
4359 } else {
4360 return "&";
4361 }
4362 }
4363 }
9d2c6865 4364 }
e38ccfd9 4365 return "&" if $proto and !$doneok; # too few args and no ';'
bd0865ec
GS
4366 return "&" if @args; # too many args
4367 return ("", join ", ", @reals);
4368}
4369
c65b7c4d
FC
4370sub retscalar {
4371 my $name = $_[0]->name;
4372 # XXX There has to be a better way of doing this scalar-op check.
4373 # Currently PL_opargs is not exposed.
4374 if ($name eq 'null') {
4375 $name = substr B::ppname($_[0]->targ), 3
4376 }
4377 $name =~ /^(?:scalar|pushmark|wantarray|const|gvsv|gv|padsv|rv2gv
4378 |rv2sv|av2arylen|anoncode|prototype|srefgen|ref|bless
4379 |regcmaybe|regcreset|regcomp|qr|subst|substcont|trans
4380 |transr|sassign|chop|schop|chomp|schomp|defined|undef
4381 |study|pos|preinc|i_preinc|predec|i_predec|postinc
4382 |i_postinc|postdec|i_postdec|pow|multiply|i_multiply
4383 |divide|i_divide|modulo|i_modulo|add|i_add|subtract
4384 |i_subtract|concat|stringify|left_shift|right_shift|lt
4385 |i_lt|gt|i_gt|le|i_le|ge|i_ge|eq|i_eq|ne|i_ne|ncmp|i_ncmp
27f31adf
FC
4386 |slt|sgt|sle|sge|seq|sne|scmp|[sn]?bit_(?:and|x?or)|negate
4387 |i_negate|not|[sn]?complement|smartmatch|atan2|sin|cos
c65b7c4d
FC
4388 |rand|srand|exp|log|sqrt|int|hex|oct|abs|length|substr
4389 |vec|index|rindex|sprintf|formline|ord|chr|crypt|ucfirst
4390 |lcfirst|uc|lc|quotemeta|aelemfast|aelem|exists|helem
4391 |pack|join|anonlist|anonhash|push|pop|shift|unshift|xor
4392 |andassign|orassign|dorassign|warn|die|reset|nextstate
4393 |dbstate|unstack|last|next|redo|dump|goto|exit|open|close
4394 |pipe_op|fileno|umask|binmode|tie|untie|tied|dbmopen
4395 |dbmclose|select|getc|read|enterwrite|prtf|print|say
4396 |sysopen|sysseek|sysread|syswrite|eof|tell|seek|truncate
4397 |fcntl|ioctl|flock|send|recv|socket|sockpair|bind|connect
4398 |listen|accept|shutdown|gsockopt|ssockopt|getsockname
4399 |getpeername|ftrread|ftrwrite|ftrexec|fteread|ftewrite
4400 |fteexec|ftis|ftsize|ftmtime|ftatime|ftctime|ftrowned
4401 |fteowned|ftzero|ftsock|ftchr|ftblk|ftfile|ftdir|ftpipe
4402 |ftsuid|ftsgid|ftsvtx|ftlink|fttty|fttext|ftbinary|chdir
4403 |chown|chroot|unlink|chmod|utime|rename|link|symlink
4404 |readlink|mkdir|rmdir|open_dir|telldir|seekdir|rewinddir
4405 |closedir|fork|wait|waitpid|system|exec|kill|getppid
4406 |getpgrp|setpgrp|getpriority|setpriority|time|alarm|sleep
4407 |shmget|shmctl|shmread|shmwrite|msgget|msgctl|msgsnd
4408 |msgrcv|semop|semget|semctl|hintseval|shostent|snetent
4409 |sprotoent|sservent|ehostent|enetent|eprotoent|eservent
4410 |spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv
4411 |fc)\z/x
4412}
4413
bd0865ec
GS
4414sub pp_entersub {
4415 my $self = shift;
4416 my($op, $cx) = @_;
09d856fb
CK
4417 return $self->e_method($self->_method($op, $cx))
4418 unless null $op->first->sibling;
bd0865ec
GS
4419 my $prefix = "";
4420 my $amper = "";
4421 my($kid, @exprs);
90c0eb26 4422 if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
9d2c6865
SM
4423 $prefix = "do ";
4424 } elsif ($op->private & OPpENTERSUB_AMPER) {
4425 $amper = "&";
4426 }
4427 $kid = $op->first;
4428 $kid = $kid->first->sibling; # skip ex-list, pushmark
4429 for (; not null $kid->sibling; $kid = $kid->sibling) {
4430 push @exprs, $kid;
4431 }
bd0865ec
GS
4432 my $simple = 0;
4433 my $proto = undef;
bb9bfaa4 4434 my $lexical;
9d2c6865
SM
4435 if (is_scope($kid)) {
4436 $amper = "&";
4437 $kid = "{" . $self->deparse($kid, 0) . "}";
3f872cb9 4438 } elsif ($kid->first->name eq "gv") {
6f611a1a 4439 my $gv = $self->gv_or_padgv($kid->first);
32cc5cd1
FC
4440 my $cv;
4441 if (class($gv) eq 'GV' && class($cv = $gv->CV) ne "SPECIAL"
4442 || $gv->FLAGS & SVf_ROK && class($cv = $gv->RV) eq 'CV') {
4443 $proto = $cv->PV if $cv->FLAGS & SVf_POK;
9d2c6865 4444 }
bd0865ec 4445 $simple = 1; # only calls of named functions can be prototyped
9d2c6865 4446 $kid = $self->deparse($kid, 24);
d49c3562
FC
4447 my $fq;
4448 # Fully qualify any sub name that conflicts with a lexical.
4449 if ($self->lex_in_scope("&$kid")
4450 || $self->lex_in_scope("&$kid", 1))
4451 {
4452 $fq++;
4453 } elsif (!$amper) {
8b2d6640
FC
4454 if ($kid eq 'main::') {
4455 $kid = '::';
a958cfbb
FC
4456 }
4457 else {
4458 if ($kid !~ /::/ && $kid ne 'x') {
4459 # Fully qualify any sub name that is also a keyword. While
4460 # we could check the import flag, we cannot guarantee that
4461 # the code deparsed so far would set that flag, so we qual-
4462 # ify the names regardless of importation.
a958cfbb
FC
4463 if (exists $feature_keywords{$kid}) {
4464 $fq++ if $self->feature_enabled($kid);
e54915d6
FC
4465 } elsif (do { local $@; local $SIG{__DIE__};
4466 eval { () = prototype "CORE::$kid"; 1 } }) {
a958cfbb
FC
4467 $fq++
4468 }
a958cfbb
FC
4469 }
4470 if ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) {
7741ceed 4471 $kid = single_delim("q", "'", $kid, $self) . '->';
a958cfbb 4472 }
8b2d6640
FC
4473 }
4474 }
d49c3562 4475 $fq and substr $kid, 0, 0, = $self->{'curstash'}.'::';
90c0eb26 4476 } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') {
9d2c6865
SM
4477 $amper = "&";
4478 $kid = $self->deparse($kid, 24);
4479 } else {
4480 $prefix = "";
bb9bfaa4
FC
4481 my $grandkid = $kid->first;
4482 my $arrow = ($lexical = $grandkid->name eq "padcv")
4483 || is_subscriptable($grandkid)
4484 ? ""
4485 : "->";
3ed82cfc 4486 $kid = $self->deparse($kid, 24) . $arrow;
bb9bfaa4
FC
4487 if ($lexical) {
4488 my $padlist = $self->{'curcv'}->PADLIST;
4489 my $padoff = $grandkid->targ;
4490 my $padname = $padlist->ARRAYelt(0)->ARRAYelt($padoff);
4491 my $protocv = $padname->FLAGS & SVpad_STATE
4492 ? $padlist->ARRAYelt(1)->ARRAYelt($padoff)
4493 : $padname->PROTOCV;
4494 if ($protocv->FLAGS & SVf_POK) {
4495 $proto = $protocv->PV
4496 }
4497 $simple = 1;
4498 }
9d2c6865 4499 }
0ca62a8e
RH
4500
4501 # Doesn't matter how many prototypes there are, if
4502 # they haven't happened yet!
bb9bfaa4 4503 my $declared = $lexical || exists $self->{'subs_declared'}{$kid};
de4fa237
FC
4504 if (not $declared and $self->{'in_coderef2text'}) {
4505 no strict 'refs';
4506 no warnings 'uninitialized';
4507 $declared =
4508 (
4509 defined &{ ${$self->{'curstash'}."::"}{$kid} }
4510 && !exists
4511 $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid}
4512 && defined prototype $self->{'curstash'}."::".$kid
4513 );
4514 }
f2279a62
FC
4515 if (!$declared && defined($proto)) {
4516 # Avoid "too early to check prototype" warning
4517 ($amper, $proto) = ('&');
e99ebc55 4518 }
0ca62a8e 4519
bd0865ec 4520 my $args;
e16ceb94 4521 my $listargs = 1;
0ca62a8e 4522 if ($declared and defined $proto and not $amper) {
bd0865ec 4523 ($amper, $args) = $self->check_proto($proto, @exprs);
e16ceb94
FC
4524 $listargs = $amper;
4525 }
4526 if ($listargs) {
c65b7c4d
FC
4527 $args = join(", ", map(
4528 ($_->flags & OPf_WANT) == OPf_WANT_SCALAR
4529 && !retscalar($_)
4530 ? $self->maybe_parens_unop('scalar', $_, 6)
4531 : $self->deparse($_, 6),
4532 @exprs
4533 ));
6e90668e 4534 }
9d2c6865 4535 if ($prefix or $amper) {
1b38d782 4536 if ($kid eq '&') { $kid = "{$kid}" } # &{&} cannot be written as &&
9d2c6865
SM
4537 if ($op->flags & OPf_STACKED) {
4538 return $prefix . $amper . $kid . "(" . $args . ")";
4539 } else {
4540 return $prefix . $amper. $kid;
4541 }
6e90668e 4542 } else {
7969d523 4543 # It's a syntax error to call CORE::GLOBAL::foo with a prefix,
34a48b4b
RH
4544 # so it must have been translated from a keyword call. Translate
4545 # it back.
4546 $kid =~ s/^CORE::GLOBAL:://;
4547
d989cdac 4548 my $dproto = defined($proto) ? $proto : "undefined";
fd8be4a1 4549 my $scalar_proto = $dproto =~ /^;*(?:[\$*_+]|\\.|\\\[[^]]\])\z/;
0ca62a8e
RH
4550 if (!$declared) {
4551 return "$kid(" . $args . ")";
c4cf781e 4552 } elsif ($dproto =~ /^\s*\z/) {
9d2c6865 4553 return $kid;
fd8be4a1 4554 } elsif ($scalar_proto and is_scalar($exprs[0])) {
d989cdac
SM
4555 # is_scalar is an excessively conservative test here:
4556 # really, we should be comparing to the precedence of the
4557 # top operator of $exprs[0] (ala unop()), but that would
4558 # take some major code restructuring to do right.
9d2c6865 4559 return $self->maybe_parens_func($kid, $args, $cx, 16);
fd8be4a1 4560 } elsif (not $scalar_proto and defined($proto) || $simple) { #'
9d2c6865
SM
4561 return $self->maybe_parens_func($kid, $args, $cx, 5);
4562 } else {
4563 return "$kid(" . $args . ")";
4564 }
6e90668e
SM
4565 }
4566}
4567
4568sub pp_enterwrite { unop(@_, "write") }
4569
4570# escape things that cause interpolation in double quotes,
4571# but not character escapes
4572sub uninterp {
4573 my($str) = @_;
3f766ba3 4574 $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g;
9d2c6865
SM
4575 return $str;
4576}
4577
b7dad2dc
RH
4578{
4579my $bal;
4580BEGIN {
cdf8218f
RH
4581 use re "eval";
4582 # Matches any string which is balanced with respect to {braces}
b7dad2dc 4583 $bal = qr(
cdf8218f
RH
4584 (?:
4585 [^\\{}]
4586 | \\\\
4587 | \\[{}]
4588 | \{(??{$bal})\}
4589 )*
4590 )x;
b7dad2dc
RH
4591}
4592
4593# the same, but treat $|, $), $( and $ at the end of the string differently
ba0372a0 4594# and leave comments unmangled for the sake of /x and (?x).
b7dad2dc
RH
4595sub re_uninterp {
4596 my($str) = @_;
cdf8218f
RH
4597
4598 $str =~ s/
4599 ( ^|\G # $1
4600 | [^\\]
4601 )
4602
4603 ( # $2
4604 (?:\\\\)*
4605 )
4606
4607 ( # $3
b7dad2dc
RH
4608 ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks)
4609 | \#[^\n]* # (skip over comments)
4610 )
4611 | [\$\@]
9a58b761 4612 (?!\||\)|\(|$|\s)
b7dad2dc
RH
4613 | \\[uUlLQE]
4614 )
4615
c7de4c66 4616 /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg;
b7dad2dc 4617
a9760014
RH
4618 return $str;
4619}
b7dad2dc 4620}
a9760014 4621
6e90668e 4622# character escapes, but not delimiters that might need to be escaped
746698c5 4623sub escape_str { # ASCII, UTF8
6e90668e 4624 my($str) = @_;
cef22867 4625 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
6e90668e 4626 $str =~ s/\a/\\a/g;
78425176
KW
4627# $str =~ s/\cH/\\b/g; # \b means something different in a regex; and \cH
4628 # isn't a backspace in EBCDIC
6e90668e
SM
4629 $str =~ s/\t/\\t/g;
4630 $str =~ s/\n/\\n/g;
4631 $str =~ s/\e/\\e/g;
4632 $str =~ s/\f/\\f/g;
4633 $str =~ s/\r/\\r/g;
dd405ed7 4634 $str =~ s/([\cA-\cZ])/'\\c' . $unctrl{$1}/ge;
2d5b99ed 4635 $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/age;
6e90668e
SM
4636 return $str;
4637}
4638
ba0372a0
FC
4639# For regexes. Leave whitespace unmangled in case of /x or (?x).
4640sub escape_re {
a9760014 4641 my($str) = @_;
cef22867 4642 $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg;
aee8fd8d 4643 $str =~ s/([[:^print:]])/
2d5b99ed 4644 ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/age;
a9760014
RH
4645 $str =~ s/\n/\n\f/g;
4646 return $str;
4647}
4648
9d2c6865
SM
4649# Don't do this for regexen
4650sub unback {
4651 my($str) = @_;
4652 $str =~ s/\\/\\\\/g;
4653 return $str;
4654}
4655
08c6f5ec
RH
4656# Remove backslashes which precede literal control characters,
4657# to avoid creating ambiguity when we escape the latter.
4658sub re_unback {
4659 my($str) = @_;
4660
4661 # the insane complexity here is due to the behaviour of "\c\"
cef22867 4662 $str =~ s/(^|[^\\]|\\c\\)(?<!\\c)\\(\\\\)*(?=[[:^print:]])/$1$2/g;
08c6f5ec
RH
4663 return $str;
4664}
4665
6e90668e
SM
4666sub balanced_delim {
4667 my($str) = @_;
4668 my @str = split //, $str;
80b7d6d2 4669 my($ar, $open, $close, $fail, $c, $cnt, $last_bs);
6e90668e
SM
4670 for $ar (['[',']'], ['(',')'], ['<','>'], ['{','}']) {
4671 ($open, $close) = @$ar;
80b7d6d2 4672 $fail = 0; $cnt = 0; $last_bs = 0;
6e90668e
SM
4673 for $c (@str) {
4674 if ($c eq $open) {
80b7d6d2 4675 $fail = 1 if $last_bs;
6e90668e
SM
4676 $cnt++;
4677 } elsif ($c eq $close) {
80b7d6d2 4678 $fail = 1 if $last_bs;
6e90668e
SM
4679 $cnt--;
4680 if ($cnt < 0) {
bd0865ec 4681 # qq()() isn't ")("
6e90668e
SM
4682 $fail = 1;
4683 last;
4684 }
4685 }
80b7d6d2 4686 $last_bs = $c eq '\\';
6e90668e
SM
4687 }
4688 $fail = 1 if $cnt != 0;
4689 return ($open, "$open$str$close") if not $fail;
4690 }
4691 return ("", $str);
4692}
4693
4694sub single_delim {
7741ceed 4695 my($q, $default, $str, $self) = @_;
90be192f 4696 return "$default$str$default" if $default and index($str, $default) == -1;
7741ceed 4697 my $coreq = $self->keyword($q); # maybe CORE::q
8347ad86
RGS
4698 if ($q ne 'qr') {
4699 (my $succeed, $str) = balanced_delim($str);
7741ceed 4700 return "$coreq$str" if $succeed;
8347ad86
RGS
4701 }
4702 for my $delim ('/', '"', '#') {
7741ceed 4703 return "$coreq$delim" . $str . $delim if index($str, $delim) == -1;
6e90668e 4704 }
90be192f
SM
4705 if ($default) {
4706 $str =~ s/$default/\\$default/g;
4707 return "$default$str$default";
4708 } else {
4709 $str =~ s[/][\\/]g;
7741ceed 4710 return "$coreq/$str/";
90be192f 4711 }
6e90668e
SM
4712}
4713
d989cdac
SM
4714my $max_prec;
4715BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); }
4716
4717# Split a floating point number into an integer mantissa and a binary
4718# exponent. Assumes you've already made sure the number isn't zero or
4719# some weird infinity or NaN.
4720sub split_float {
4721 my($f) = @_;
4722 my $exponent = 0;
4723 if ($f == int($f)) {
4724 while ($f % 2 == 0) {
4725 $f /= 2;
4726 $exponent++;
4727 }
4728 } else {
4729 while ($f != int($f)) {
4730 $f *= 2;
4731 $exponent--;
4732 }
4733 }
4734 my $mantissa = sprintf("%.0f", $f);
4735 return ($mantissa, $exponent);
4736}
4737
6e90668e 4738sub const {
d989cdac
SM
4739 my $self = shift;
4740 my($sv, $cx) = @_;
4741 if ($self->{'use_dumper'}) {
4742 return $self->const_dumper($sv, $cx);
4743 }
6e90668e 4744 if (class($sv) eq "SPECIAL") {
d989cdac 4745 # sv_undef, sv_yes, sv_no
ea36157c
FC
4746 return $$sv == 3 ? $self->maybe_parens("!1", $cx, 21)
4747 : ('undef', '1')[$$sv-1];
805b1011
DM
4748 }
4749 if (class($sv) eq "NULL") {
7a9b44b9 4750 return 'undef';
805b1011 4751 }
127212b2
DM
4752 # convert a version object into the "v1.2.3" string in its V magic
4753 if ($sv->FLAGS & SVs_RMG) {
4754 for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
4755 return $mg->PTR if $mg->TYPE eq 'V';
4756 }
4757 }
4758
4759 if ($sv->FLAGS & SVf_IOK) {
d989cdac
SM
4760 my $str = $sv->int_value;
4761 $str = $self->maybe_parens($str, $cx, 21) if $str < 0;
4762 return $str;
6e90668e 4763 } elsif ($sv->FLAGS & SVf_NOK) {
d989cdac
SM
4764 my $nv = $sv->NV;
4765 if ($nv == 0) {
4766 if (pack("F", $nv) eq pack("F", 0)) {
4767 # positive zero
4768 return "0";
4769 } else {
4770 # negative zero
4771 return $self->maybe_parens("-.0", $cx, 21);
4772 }
4773 } elsif (1/$nv == 0) {
4774 if ($nv > 0) {
4775 # positive infinity
4776 return $self->maybe_parens("9**9**9", $cx, 22);
4777 } else {
4778 # negative infinity
4779 return $self->maybe_parens("-9**9**9", $cx, 21);
4780 }
4781 } elsif ($nv != $nv) {
4782 # NaN
4783 if (pack("F", $nv) eq pack("F", sin(9**9**9))) {
4784 # the normal kind
4785 return "sin(9**9**9)";
4786 } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) {
4787 # the inverted kind
4788 return $self->maybe_parens("-sin(9**9**9)", $cx, 21);
4789 } else {
4790 # some other kind
4791 my $hex = unpack("h*", pack("F", $nv));
4792 return qq'unpack("F", pack("h*", "$hex"))';
4793 }
fecea806 4794 }
d989cdac
SM
4795 # first, try the default stringification
4796 my $str = "$nv";
4797 if ($str != $nv) {
4798 # failing that, try using more precision
4799 $str = sprintf("%.${max_prec}g", $nv);
4800# if (pack("F", $str) ne pack("F", $nv)) {
4801 if ($str != $nv) {
4802 # not representable in decimal with whatever sprintf()
4803 # and atof() Perl is using here.
4804 my($mant, $exp) = split_float($nv);
4805 return $self->maybe_parens("$mant * 2**$exp", $cx, 19);
4806 }
4807 }
4808 $str = $self->maybe_parens($str, $cx, 21) if $nv < 0;
4809 return $str;
7a9b44b9 4810 } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) {
d989cdac 4811 my $ref = $sv->RV;
5e965771
FC
4812 my $class = class($ref);
4813 if ($class eq "AV") {
d989cdac 4814 return "[" . $self->list_const(2, $ref->ARRAY) . "]";
5e965771 4815 } elsif ($class eq "HV") {
d989cdac
SM
4816 my %hash = $ref->ARRAY;
4817 my @elts;
4818 for my $k (sort keys %hash) {
4819 push @elts, "$k => " . $self->const($hash{$k}, 6);
4820 }
4821 return "{" . join(", ", @elts) . "}";
5e965771 4822 } elsif ($class eq "CV") {
1a35f9ff 4823 BEGIN {
86d8ec8a 4824 if ($] > 5.0150051) {
1a35f9ff
FC
4825 require overloading;
4826 unimport overloading;
86d8ec8a 4827 }
1a35f9ff 4828 }
86d8ec8a 4829 if ($] > 5.0150051 && $self->{curcv} &&
1a35f9ff
FC
4830 $self->{curcv}->object_2svref == $ref->object_2svref) {
4831 return $self->keyword("__SUB__");
4832 }
d989cdac
SM
4833 return "sub " . $self->deparse_sub($ref);
4834 }
5e965771 4835 if ($class ne 'SPECIAL' and $ref->FLAGS & SVs_SMG) {
d989cdac
SM
4836 for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
4837 if ($mg->TYPE eq 'r') {
ba0372a0 4838 my $re = re_uninterp(escape_re(re_unback($mg->precomp)));
7741ceed 4839 return single_delim("qr", "", $re, $self);
d989cdac
SM
4840 }
4841 }
4842 }
4843
9f125c4a
FC
4844 my $const = $self->const($ref, 20);
4845 if ($self->{in_subst_repl} && $const =~ /^[0-9]/) {
4846 $const = "($const)";
4847 }
4848 return $self->maybe_parens("\\$const", $cx, 20);
34768ba5 4849 } elsif ($sv->FLAGS & SVf_POK) {
6e90668e 4850 my $str = $sv->PV;
2a43599b 4851 if ($str =~ /[[:^print:]]/a) {
7741ceed
FC
4852 return single_delim("qq", '"',
4853 uninterp(escape_str unback $str), $self);
6e90668e 4854 } else {
7741ceed 4855 return single_delim("q", "'", unback($str), $self);
6e90668e 4856 }
34768ba5
RH
4857 } else {
4858 return "undef";
a798dbf2
MB
4859 }
4860}
4861
d989cdac
SM
4862sub const_dumper {
4863 my $self = shift;
4864 my($sv, $cx) = @_;
4865 my $ref = $sv->object_2svref();
4866 my $dumper = Data::Dumper->new([$$ref], ['$v']);
4867 $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1);
4868 my $str = $dumper->Dump();
4869 if ($str =~ /^\$v/) {
4870 return '${my ' . $str . ' \$v}';
4871 } else {
4872 return $str;
4873 }
4874}
4875
18228111
GS
4876sub const_sv {
4877 my $self = shift;
4878 my $op = shift;
4879 my $sv = $op->sv;
4880 # the constant could be in the pad (under useithreads)
4881 $sv = $self->padval($op->targ) unless $$sv;
4882 return $sv;
4883}
4884
b46e009d 4885sub meth_sv {
4886 my $self = shift;
4887 my $op = shift;
4888 my $sv = $op->meth_sv;
4889 # the constant could be in the pad (under useithreads)
4890 $sv = $self->padval($op->targ) unless $$sv;
4891 return $sv;
4892}
4893
810bd8b7 4894sub meth_rclass_sv {
4895 my $self = shift;
4896 my $op = shift;
4897 my $sv = $op->rclass;
4898 # the constant could be in the pad (under useithreads)
4899 $sv = $self->padval($sv) unless ref $sv;
4900 return $sv;
4901}
4902
6e90668e
SM
4903sub pp_const {
4904 my $self = shift;
9d2c6865 4905 my($op, $cx) = @_;
bc6b2ef6
Z
4906 if ($op->private & OPpCONST_ARYBASE) {
4907 return '$[';
4908 }
e38ccfd9 4909# if ($op->private & OPpCONST_BARE) { # trouble with '=>' autoquoting
18228111 4910# return $self->const_sv($op)->PV;
6e90668e 4911# }
18228111 4912 my $sv = $self->const_sv($op);
d989cdac 4913 return $self->const($sv, $cx);
6e90668e
SM
4914}
4915
4916sub dq {
4917 my $self = shift;
4918 my $op = shift;
3f872cb9
GS
4919 my $type = $op->name;
4920 if ($type eq "const") {
bc6b2ef6 4921 return '$[' if $op->private & OPpCONST_ARYBASE;
f3402b25 4922 return uninterp(escape_str(unback($self->const_sv($op)->as_string)));
3f872cb9 4923 } elsif ($type eq "concat") {
8fed1104
RH
4924 my $first = $self->dq($op->first);
4925 my $last = $self->dq($op->last);
44c6d2a1 4926
333f3d7a 4927 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar"
44c6d2a1
RH
4928 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
4929 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
d989cdac 4930 || ($last =~ /^[:'{\[\w_]/ && #'
44c6d2a1
RH
4931 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
4932
8fed1104 4933 return $first . $last;
3f872cb9 4934 } elsif ($type eq "uc") {
6e90668e 4935 return '\U' . $self->dq($op->first->sibling) . '\E';
3f872cb9 4936 } elsif ($type eq "lc") {
6e90668e 4937 return '\L' . $self->dq($op->first->sibling) . '\E';
3f872cb9 4938 } elsif ($type eq "ucfirst") {
6e90668e 4939 return '\u' . $self->dq($op->first->sibling);
3f872cb9 4940 } elsif ($type eq "lcfirst") {
6e90668e 4941 return '\l' . $self->dq($op->first->sibling);
3f872cb9 4942 } elsif ($type eq "quotemeta") {
6e90668e 4943 return '\Q' . $self->dq($op->first->sibling) . '\E';
838f2281
BF
4944 } elsif ($type eq "fc") {
4945 return '\F' . $self->dq($op->first->sibling) . '\E';
3f872cb9 4946 } elsif ($type eq "join") {
9d2c6865 4947 return $self->deparse($op->last, 26); # was join($", @ary)
a798dbf2 4948 } else {
9d2c6865 4949 return $self->deparse($op, 26);
6e90668e
SM
4950 }
4951}
4952
4953sub pp_backtick {
4954 my $self = shift;
9d2c6865 4955 my($op, $cx) = @_;
85675c4c
RGS
4956 # skip pushmark if it exists (readpipe() vs ``)
4957 my $child = $op->first->sibling->isa('B::NULL')
c53941b4 4958 ? $op->first : $op->first->sibling;
5d8c42c2 4959 if ($self->pure_string($child)) {
7741ceed 4960 return single_delim("qx", '`', $self->dq($child, 1), $self);
5d8c42c2
FC
4961 }
4962 unop($self, @_, "readpipe");
6e90668e
SM
4963}
4964
4965sub dquote {
4966 my $self = shift;
6f611a1a 4967 my($op, $cx) = @_;
3ed82cfc
GS
4968 my $kid = $op->first->sibling; # skip ex-stringify, pushmark
4969 return $self->deparse($kid, $cx) if $self->{'unquote'};
4970 $self->maybe_targmy($kid, $cx,
7741ceed
FC
4971 sub {single_delim("qq", '"', $self->dq($_[1]),
4972 $self)});
6e90668e
SM
4973}
4974
bd0865ec 4975# OP_STRINGIFY is a listop, but it only ever has one arg
3b4e2a4d
FC
4976sub pp_stringify {
4977 my ($self, $op, $cx) = @_;
4978 my $kid = $op->first->sibling;
4979 while ($kid->name eq 'null' && !null($kid->first)) {
4980 $kid = $kid->first;
4981 }
fedf30e1 4982 if ($kid->name =~ /^(?:const|padsv|rv2sv|av2arylen|gvsv|multideref
3b4e2a4d
FC
4983 |aelemfast(?:_lex)?|[ah]elem|join|concat)\z/x) {
4984 maybe_targmy(@_, \&dquote);
4985 }
4986 else {
4987 # Actually an optimised join.
4988 my $result = listop(@_,"join");
4989 $result =~ s/join([( ])/join$1$self->{'ex_const'}, /;
4990 $result;
4991 }
4992}
6e90668e
SM
4993
4994# tr/// and s/// (and tr[][], tr[]//, tr###, etc)
4995# note that tr(from)/to/ is OK, but not tr/from/(to)
4996sub double_delim {
4997 my($from, $to) = @_;
4998 my($succeed, $delim);
4999 if ($from !~ m[/] and $to !~ m[/]) {
5000 return "/$from/$to/";
5001 } elsif (($succeed, $from) = balanced_delim($from) and $succeed) {
5002 if (($succeed, $to) = balanced_delim($to) and $succeed) {
5003 return "$from$to";
5004 } else {
6b0bcbb1 5005 for $delim ('/', '"', '#') { # note no "'" -- s''' is special
6e90668e
SM
5006 return "$from$delim$to$delim" if index($to, $delim) == -1;
5007 }
5008 $to =~ s[/][\\/]g;
5009 return "$from/$to/";
5010 }
5011 } else {
5012 for $delim ('/', '"', '#') { # note no '
5013 return "$delim$from$delim$to$delim"
5014 if index($to . $from, $delim) == -1;
5015 }
5016 $from =~ s[/][\\/]g;
5017 $to =~ s[/][\\/]g;
5018 return "/$from/$to/";
5019 }
5020}
5021
2a9e2f8a 5022# Only used by tr///, so backslashes hyphens
6e90668e
SM
5023sub pchr { # ASCII
5024 my($n) = @_;
5025 if ($n == ord '\\') {
5026 return '\\\\';
2a9e2f8a
RH
5027 } elsif ($n == ord "-") {
5028 return "\\-";
02d26cb6
KW
5029 } elsif (utf8::native_to_unicode($n) >= utf8::native_to_unicode(ord(' '))
5030 and utf8::native_to_unicode($n) <= utf8::native_to_unicode(ord('~')))
5031 {
5032 # I'm presuming a regex is not ok here, otherwise we could have used
5033 # /[[:print:]]/a to get here
6e90668e
SM
5034 return chr($n);
5035 } elsif ($n == ord "\a") {
5036 return '\\a';
5037 } elsif ($n == ord "\b") {
5038 return '\\b';
5039 } elsif ($n == ord "\t") {
5040 return '\\t';
5041 } elsif ($n == ord "\n") {
5042 return '\\n';
5043 } elsif ($n == ord "\e") {
5044 return '\\e';
5045 } elsif ($n == ord "\f") {
5046 return '\\f';
5047 } elsif ($n == ord "\r") {
5048 return '\\r';
5049 } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) {
dd405ed7 5050 return '\\c' . unctrl{chr $n};
6e90668e
SM
5051 } else {
5052# return '\x' . sprintf("%02x", $n);
5053 return '\\' . sprintf("%03o", $n);
5054 }
5055}
5056
5057sub collapse {
5058 my(@chars) = @_;
23db111c 5059 my($str, $c, $tr) = ("");
6e90668e
SM
5060 for ($c = 0; $c < @chars; $c++) {
5061 $tr = $chars[$c];
5062 $str .= pchr($tr);
5063 if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
5064 $chars[$c + 2] == $tr + 2)
5065 {
f4a44678
SM
5066 for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
5067 {}
6e90668e
SM
5068 $str .= "-";
5069 $str .= pchr($chars[$c]);
5070 }
5071 }
5072 return $str;
5073}
5074
f4a44678
SM
5075sub tr_decode_byte {
5076 my($table, $flags) = @_;
2a9e2f8a 5077 my(@table) = unpack("s*", $table);
bec89253 5078 splice @table, 0x100, 1; # Number of subsequent elements
6e90668e 5079 my($c, $tr, @from, @to, @delfrom, $delhyphen);
d989cdac 5080 if ($table[ord "-"] != -1 and
6e90668e
SM
5081 $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
5082 {
5083 $tr = $table[ord "-"];
5084 $table[ord "-"] = -1;
5085 if ($tr >= 0) {
5086 @from = ord("-");
5087 @to = $tr;
5088 } else { # -2 ==> delete
5089 $delhyphen = 1;
5090 }
5091 }
2a9e2f8a 5092 for ($c = 0; $c < @table; $c++) {
6e90668e
SM
5093 $tr = $table[$c];
5094 if ($tr >= 0) {
5095 push @from, $c; push @to, $tr;
5096 } elsif ($tr == -2) {
5097 push @delfrom, $c;
5098 }
5099 }
6e90668e 5100 @from = (@from, @delfrom);
f4a44678 5101 if ($flags & OPpTRANS_COMPLEMENT) {
6e90668e
SM
5102 my @newfrom = ();
5103 my %from;
5104 @from{@from} = (1) x @from;
5105 for ($c = 0; $c < 256; $c++) {
5106 push @newfrom, $c unless $from{$c};
5107 }
5108 @from = @newfrom;
5109 }
56d8b52c 5110 unless ($flags & OPpTRANS_DELETE || !@to) {
6e90668e
SM
5111 pop @to while $#to and $to[$#to] == $to[$#to -1];
5112 }
6e90668e
SM
5113 my($from, $to);
5114 $from = collapse(@from);
5115 $to = collapse(@to);
5116 $from .= "-" if $delhyphen;
f4a44678
SM
5117 return ($from, $to);
5118}
5119
5120sub tr_chr {
5121 my $x = shift;
5122 if ($x == ord "-") {
5123 return "\\-";
2a9e2f8a
RH
5124 } elsif ($x == ord "\\") {
5125 return "\\\\";
f4a44678
SM
5126 } else {
5127 return chr $x;
5128 }
5129}
5130
5131# XXX This doesn't yet handle all cases correctly either
5132
5133sub tr_decode_utf8 {
5134 my($swash_hv, $flags) = @_;
5135 my %swash = $swash_hv->ARRAY;
5136 my $final = undef;
5137 $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
5138 my $none = $swash{"NONE"}->IV;
5139 my $extra = $none + 1;
5140 my(@from, @delfrom, @to);
5141 my $line;
5142 foreach $line (split /\n/, $swash{'LIST'}->PV) {
5143 my($min, $max, $result) = split(/\t/, $line);
5144 $min = hex $min;
5145 if (length $max) {
5146 $max = hex $max;
5147 } else {
5148 $max = $min;
5149 }
5150 $result = hex $result;
5151 if ($result == $extra) {
d989cdac 5152 push @delfrom, [$min, $max];
f4a44678
SM
5153 } else {
5154 push @from, [$min, $max];
5155 push @to, [$result, $result + $max - $min];
5156 }
5157 }
5158 for my $i (0 .. $#from) {
5159 if ($from[$i][0] == ord '-') {
5160 unshift @from, splice(@from, $i, 1);
5161 unshift @to, splice(@to, $i, 1);
5162 last;
5163 } elsif ($from[$i][1] == ord '-') {
5164 $from[$i][1]--;
5165 $to[$i][1]--;
5166 unshift @from, ord '-';
5167 unshift @to, ord '-';
5168 last;
5169 }
5170 }
5171 for my $i (0 .. $#delfrom) {
5172 if ($delfrom[$i][0] == ord '-') {
5173 push @delfrom, splice(@delfrom, $i, 1);
5174 last;
5175 } elsif ($delfrom[$i][1] == ord '-') {
5176 $delfrom[$i][1]--;
5177 push @delfrom, ord '-';
5178 last;
5179 }
5180 }
5181 if (defined $final and $to[$#to][1] != $final) {
5182 push @to, [$final, $final];
5183 }
5184 push @from, @delfrom;
5185 if ($flags & OPpTRANS_COMPLEMENT) {
5186 my @newfrom;
5187 my $next = 0;
5188 for my $i (0 .. $#from) {
5189 push @newfrom, [$next, $from[$i][0] - 1];
5190 $next = $from[$i][1] + 1;
5191 }
5192 @from = ();
5193 for my $range (@newfrom) {
5194 if ($range->[0] <= $range->[1]) {
5195 push @from, $range;
5196 }
5197 }
5198 }
5199 my($from, $to, $diff);
5200 for my $chunk (@from) {
5201 $diff = $chunk->[1] - $chunk->[0];
5202 if ($diff > 1) {
5203 $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
5204 } elsif ($diff == 1) {
5205 $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
5206 } else {
5207 $from .= tr_chr($chunk->[0]);
5208 }
5209 }
5210 for my $chunk (@to) {
5211 $diff = $chunk->[1] - $chunk->[0];
5212 if ($diff > 1) {
5213 $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
5214 } elsif ($diff == 1) {
5215 $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
5216 } else {
5217 $to .= tr_chr($chunk->[0]);
5218 }
5219 }
5220 #$final = sprintf("%04x", $final) if defined $final;
5221 #$none = sprintf("%04x", $none) if defined $none;
d989cdac 5222 #$extra = sprintf("%04x", $extra) if defined $extra;
f4a44678
SM
5223 #print STDERR "final: $final\n none: $none\nextra: $extra\n";
5224 #print STDERR $swash{'LIST'}->PV;
5225 return (escape_str($from), escape_str($to));
5226}
5227
5228sub pp_trans {
5229 my $self = shift;
05a502dc 5230 my($op, $cx, $morflags) = @_;
f4a44678 5231 my($from, $to);
cb8157e3 5232 my $class = class($op);
b031d0e6 5233 my $priv_flags = $op->private;
cb8157e3 5234 if ($class eq "PVOP") {
b031d0e6 5235 ($from, $to) = tr_decode_byte($op->pv, $priv_flags);
cb8157e3
FC
5236 } elsif ($class eq "PADOP") {
5237 ($from, $to)
b031d0e6 5238 = tr_decode_utf8($self->padval($op->padix)->RV, $priv_flags);
f4a44678 5239 } else { # class($op) eq "SVOP"
b031d0e6 5240 ($from, $to) = tr_decode_utf8($op->sv->RV, $priv_flags);
f4a44678
SM
5241 }
5242 my $flags = "";
42b824d2
FC
5243 $flags .= "c" if $priv_flags & OPpTRANS_COMPLEMENT;
5244 $flags .= "d" if $priv_flags & OPpTRANS_DELETE;
f4a44678 5245 $to = "" if $from eq $to and $flags eq "";
42b824d2 5246 $flags .= "s" if $priv_flags & OPpTRANS_SQUASH;
05a502dc
FC
5247 $flags .= $morflags if defined $morflags;
5248 my $ret = $self->keyword("tr") . double_delim($from, $to) . $flags;
5249 if (my $targ = $op->targ) {
5250 return $self->maybe_parens($self->padname($targ) . " =~ $ret",
5251 $cx, 20);
5252 }
5253 return $ret;
6e90668e
SM
5254}
5255
05a502dc 5256sub pp_transr { push @_, 'r'; goto &pp_trans }
bb16bae8 5257
03b22f1b
RGS
5258sub re_dq_disambiguate {
5259 my ($first, $last) = @_;
5260 # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
5261 ($last =~ /^[A-Z\\\^\[\]_?]/ &&
5262 $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc
5263 || ($last =~ /^[{\[\w_]/ &&
5264 $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/);
5265 return $first . $last;
5266}
5267
6e90668e
SM
5268# Like dq(), but different
5269sub re_dq {
5270 my $self = shift;
ba0372a0 5271 my ($op) = @_;
a9760014 5272
3f872cb9
GS
5273 my $type = $op->name;
5274 if ($type eq "const") {
bc6b2ef6 5275 return '$[' if $op->private & OPpCONST_ARYBASE;
a9760014 5276 my $unbacked = re_unback($self->const_sv($op)->as_string);
ba0372a0 5277 return re_uninterp(escape_re($unbacked));
3f872cb9 5278 } elsif ($type eq "concat") {
ba0372a0
FC
5279 my $first = $self->re_dq($op->first);
5280 my $last = $self->re_dq($op->last);
03b22f1b 5281 return re_dq_disambiguate($first, $last);
3f872cb9 5282 } elsif ($type eq "uc") {
ba0372a0 5283 return '\U' . $self->re_dq($op->first->sibling) . '\E';
3f872cb9 5284 } elsif ($type eq "lc") {
ba0372a0 5285 return '\L' . $self->re_dq($op->first->sibling) . '\E';
3f872cb9 5286 } elsif ($type eq "ucfirst") {
ba0372a0 5287 return '\u' . $self->re_dq($op->first->sibling);
3f872cb9 5288 } elsif ($type eq "lcfirst") {
ba0372a0 5289 return '\l' . $self->re_dq($op->first->sibling);
3f872cb9 5290 } elsif ($type eq "quotemeta") {
ba0372a0 5291 return '\Q' . $self->re_dq($op->first->sibling) . '\E';
838f2281 5292 } elsif ($type eq "fc") {
ba0372a0 5293 return '\F' . $self->re_dq($op->first->sibling) . '\E';
3f872cb9 5294 } elsif ($type eq "join") {
9d2c6865 5295 return $self->deparse($op->last, 26); # was join($", @ary)
6e90668e 5296 } else {
337d7381 5297 my $ret = $self->deparse($op, 26);
3f193e55
FC
5298 $ret =~ s/^\$([(|)])\z/\${$1}/ # $( $| $) need braces
5299 or $ret =~ s/^\@([-+])\z/\@{$1}/; # @- @+ need braces
337d7381 5300 return $ret;
6e90668e
SM
5301 }
5302}
5303
a9760014
RH
5304sub pure_string {
5305 my ($self, $op) = @_;
64b007ad 5306 return 0 if null $op;
a9760014
RH
5307 my $type = $op->name;
5308
36727b53 5309 if ($type eq 'const' || $type eq 'av2arylen') {
a9760014
RH
5310 return 1;
5311 }
838f2281 5312 elsif ($type =~ /^(?:[ul]c(first)?|fc)$/ || $type eq 'quotemeta') {
a9760014
RH
5313 return $self->pure_string($op->first->sibling);
5314 }
5315 elsif ($type eq 'join') {
5316 my $join_op = $op->first->sibling; # Skip pushmark
76e14ed3 5317 return 0 unless $join_op->name eq 'null' && $join_op->targ == OP_RV2SV;
a9760014
RH
5318
5319 my $gvop = $join_op->first;
5320 return 0 unless $gvop->name eq 'gvsv';
5321 return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop));
5322
5323 return 0 unless ${$join_op->sibling} eq ${$op->last};
21b7468a 5324 return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/;
a9760014
RH
5325 }
5326 elsif ($type eq 'concat') {
5327 return $self->pure_string($op->first)
5328 && $self->pure_string($op->last);
5329 }
d989cdac
SM
5330 elsif (is_scalar($op) || $type =~ /^[ah]elem$/) {
5331 return 1;
5332 }
fedf30e1
DM
5333 elsif ($type eq "null" and $op->can('first') and not null $op->first) {
5334 my $first = $op->first;
5335
5336 return 1 if $first->name eq "multideref";
5337 return 1 if $first->name eq "aelemfast_lex";
5338
5339 if ( $first->name eq "null"
5340 and $first->can('first')
5341 and not null $first->first
5342 and $first->first->name eq "aelemfast"
5343 )
5344 {
5345 return 1;
5346 }
a9760014
RH
5347 }
5348
fedf30e1 5349 return 0;
a9760014
RH
5350}
5351
061bc525 5352sub code_list {
ba0372a0 5353 my ($self,$op,$cv) = @_;
061bc525
FC
5354
5355 # localise stuff relating to the current sub
5356 $cv and
5357 local($self->{'curcv'}) = $cv,
5358 local($self->{'curcvlex'}),
5359 local(@$self{qw'curstash warnings hints hinthash curcop'})
5360 = @$self{qw'curstash warnings hints hinthash curcop'};
5361
5362 my $re;
3e18cd1c 5363 for ($op = $op->first->sibling; !null($op); $op = $op->sibling) {
59d42aa0 5364 if ($op->name eq 'null' and $op->flags & OPf_SPECIAL) {
061bc525
FC
5365 my $scope = $op->first;
5366 # 0 context (last arg to scopeop) means statement context, so
5367 # the contents of the block will not be wrapped in do{...}.
5368 my $block = scopeop($scope->first->name eq "enter", $self,
5369 $scope, 0);
5370 # next op is the source code of the block
5371 $op = $op->sibling;
5372 $re .= ($self->const_sv($op)->PV =~ m|^(\(\?\??\{)|)[0];
5373 my $multiline = $block =~ /\n/;
5374 $re .= $multiline ? "\n\t" : ' ';
5375 $re .= $block;
5376 $re .= $multiline ? "\n\b})" : " })";
59d42aa0 5377 } else {
ba0372a0 5378 $re = re_dq_disambiguate($re, $self->re_dq($op));
061bc525
FC
5379 }
5380 }
5381 $re;
5382}
5383
a9760014 5384sub regcomp {
6e90668e 5385 my $self = shift;
ba0372a0 5386 my($op, $cx) = @_;
6e90668e 5387 my $kid = $op->first;
3f872cb9
GS
5388 $kid = $kid->first if $kid->name eq "regcmaybe";
5389 $kid = $kid->first if $kid->name eq "regcreset";
bae5b54e
FC
5390 my $kname = $kid->name;
5391 if ($kname eq "null" and !null($kid->first)
131b3ad0
DM
5392 and $kid->first->name eq 'pushmark')
5393 {
5394 my $str = '';
5395 $kid = $kid->first->sibling;
5396 while (!null($kid)) {
03b22f1b 5397 my $first = $str;
ba0372a0 5398 my $last = $self->re_dq($kid);
03b22f1b 5399 $str = re_dq_disambiguate($first, $last);
131b3ad0
DM
5400 $kid = $kid->sibling;
5401 }
5402 return $str, 1;
5403 }
5404
bae5b54e
FC
5405 return ($self->re_dq($kid), 1)
5406 if $kname =~ /^(?:rv2|pad)av/ or $self->pure_string($kid);
a9760014
RH
5407 return ($self->deparse($kid, $cx), 0);
5408}
5409
5410sub pp_regcomp {
5411 my ($self, $op, $cx) = @_;
5412 return (($self->regcomp($op, $cx, 0))[0]);
6e90668e
SM
5413}
5414
c3ae113d
FC
5415sub re_flags {
5416 my ($self, $op) = @_;
5417 my $flags = '';
5418 my $pmflags = $op->pmflags;
3b91d897
FC
5419 if (!$pmflags) {
5420 my $re = $op->pmregexp;
5421 if ($$re) {
5422 $pmflags = $re->compflags;
5423 }
5424 }
c3ae113d
FC
5425 $flags .= "g" if $pmflags & PMf_GLOBAL;
5426 $flags .= "i" if $pmflags & PMf_FOLD;
5427 $flags .= "m" if $pmflags & PMf_MULTILINE;
5428 $flags .= "o" if $pmflags & PMf_KEEP;
5429 $flags .= "s" if $pmflags & PMf_SINGLELINE;
5430 $flags .= "x" if $pmflags & PMf_EXTENDED;
334afb3e 5431 $flags .= "x" if $pmflags & PMf_EXTENDED_MORE;
c3ae113d
FC
5432 $flags .= "p" if $pmflags & RXf_PMf_KEEPCOPY;
5433 if (my $charset = $pmflags & RXf_PMf_CHARSET) {
5434 # Hardcoding this is fragile, but B does not yet export the
5435 # constants we need.
fde14af1 5436 $flags .= qw(d l u a aa)[$charset >> 7]
c3ae113d
FC
5437 }
5438 # The /d flag is indicated by 0; only show it if necessary.
5439 elsif ($self->{hinthash} and
5440 $self->{hinthash}{reflags_charset}
dff5ffe4 5441 || $self->{hinthash}{feature_unicode}
149758b3
NC
5442 or $self->{hints} & $feature::hint_mask
5443 && ($self->{hints} & $feature::hint_mask)
5444 != $feature::hint_mask
dff5ffe4 5445 && do {
dff5ffe4
FC
5446 $self->{hints} & $feature::hint_uni8bit;
5447 }
5448 ) {
c3ae113d
FC
5449 $flags .= 'd';
5450 }
5451 $flags;
5452}
5453
6e90668e
SM
5454# osmic acid -- see osmium tetroxide
5455
5456my %matchwords;
5457map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs',
d989cdac 5458 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic',
54421dd4 5459 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi', 'soup', 'soupmix');
6e90668e 5460
59d42aa0
FC
5461# When deparsing a regular expression with code blocks, we have to look in
5462# various places to find the blocks.
5463#
5464# For qr/(?{...})/ without interpolation, the CV is under $qr->qr_anoncv
5465# and the code list (list of blocks and constants, maybe vars) is under
5466# $cv->ROOT->first->code_list:
5467# ./perl -Ilib -MB -e 'use O "Concise", B::svref_2object(sub {qr/(?{die})/})->ROOT->first->first->sibling->pmregexp->qr_anoncv->object_2svref'
5468#
5469# For qr/$a(?{...})/ with interpolation, the code list is more accessible,
5470# under $pmop->code_list, but the $cv is something you have to dig for in
5471# the regcomp op’s kids:
5472# ./perl -Ilib -mO=Concise -e 'qr/$a(?{die})/'
5473#
5474# For m// and split //, things are much simpler. There is no CV. The code
5475# list is under $pmop->code_list.
5476
90be192f 5477sub matchop {
6e90668e 5478 my $self = shift;
90be192f 5479 my($op, $cx, $name, $delim) = @_;
6e90668e 5480 my $kid = $op->first;
9d2c6865 5481 my ($binop, $var, $re) = ("", "", "");
6e90668e 5482 if ($op->flags & OPf_STACKED) {
9d2c6865
SM
5483 $binop = 1;
5484 $var = $self->deparse($kid, 20);
6e90668e
SM
5485 $kid = $kid->sibling;
5486 }
9e32885a
FC
5487 # not $name; $name will be 'm' for both match and split
5488 elsif ($op->name eq 'match' and my $targ = $op->targ) {
05a502dc
FC
5489 $binop = 1;
5490 $var = $self->padname($targ);
5491 }
a9760014 5492 my $quote = 1;
86e39c78 5493 my $pmflags = $op->pmflags;
a539498a 5494 my $rhs_bound_to_defsv;
59d42aa0
FC
5495 my ($cv, $bregexp);
5496 my $have_kid = !null $kid;
5497 # Check for code blocks first
5498 if (not null my $code_list = $op->code_list) {
ba0372a0 5499 $re = $self->code_list($code_list,
59d42aa0
FC
5500 $op->name eq 'qr'
5501 ? $self->padval(
5502 $kid->first # ex-list
5503 ->first # pushmark
5504 ->sibling # entersub
5505 ->first # ex-list
5506 ->first # pushmark
5507 ->sibling # srefgen
5508 ->first # ex-list
5509 ->first # anoncode
5510 ->targ
5511 )
5512 : undef);
5513 } elsif (${$bregexp = $op->pmregexp} && ${$cv = $bregexp->qr_anoncv}) {
061bc525
FC
5514 my $patop = $cv->ROOT # leavesub
5515 ->first # qr
3e18cd1c 5516 ->code_list;# list
ba0372a0 5517 $re = $self->code_list($patop, $cv);
59d42aa0 5518 } elsif (!$have_kid) {
ba0372a0 5519 $re = re_uninterp(escape_re(re_unback($op->precomp)));
a9760014 5520 } elsif ($kid->name ne 'regcomp') {
ff97752d 5521 carp("found ".$kid->name." where regcomp expected");
6e90668e 5522 } else {
ba0372a0 5523 ($re, $quote) = $self->regcomp($kid, 21);
59d42aa0
FC
5524 }
5525 if ($have_kid and $kid->name eq 'regcomp') {
7fb31b92 5526 my $matchop = $kid->first;
d02d1323 5527 if ($matchop->name eq 'regcreset') {
7fb31b92
DM
5528 $matchop = $matchop->first;
5529 }
5e5a1632
FC
5530 if ($matchop->name =~ /^(?:match|transr?|subst)\z/
5531 && $matchop->flags & OPf_SPECIAL) {
5532 $rhs_bound_to_defsv = 1;
5533 }
6e90668e
SM
5534 }
5535 my $flags = "";
5992ca2b 5536 $flags .= "c" if $pmflags & PMf_CONTINUE;
c3ae113d
FC
5537 $flags .= $self->re_flags($op);
5538 $flags = join '', sort split //, $flags;
6e90668e 5539 $flags = $matchwords{$flags} if $matchwords{$flags};
5992ca2b 5540 if ($pmflags & PMf_ONCE) { # only one kind of delimiter works here
6e90668e 5541 $re =~ s/\?/\\?/g;
7741ceed 5542 $re = $self->keyword("m") . "?$re?"; # explicit 'm' is required
a9760014 5543 } elsif ($quote) {
7741ceed 5544 $re = single_delim($name, $delim, $re, $self);
9d2c6865 5545 }
a9760014 5546 $re = $re . $flags if $quote;
9d2c6865 5547 if ($binop) {
a539498a
FC
5548 return
5549 $self->maybe_parens(
5550 $rhs_bound_to_defsv
5551 ? "$var =~ (\$_ =~ $re)"
5552 : "$var =~ $re",
5553 $cx, 20
5554 );
9d2c6865
SM
5555 } else {
5556 return $re;
6e90668e 5557 }
6e90668e
SM
5558}
5559
90be192f
SM
5560sub pp_match { matchop(@_, "m", "/") }
5561sub pp_pushre { matchop(@_, "m", "/") }
5562sub pp_qr { matchop(@_, "qr", "") }
6e90668e 5563
84ed0108
FC
5564sub pp_runcv { unop(@_, "__SUB__"); }
5565
6e90668e 5566sub pp_split {
d8cdf573
FC
5567 maybe_targmy(@_, \&split);
5568}
5569sub split {
6e90668e 5570 my $self = shift;
9d2c6865 5571 my($op, $cx) = @_;
6e90668e
SM
5572 my($kid, @exprs, $ary, $expr);
5573 $kid = $op->first;
c6e79e55
SM
5574
5575 # For our kid (an OP_PUSHRE), pmreplroot is never actually the
5576 # root of a replacement; it's either empty, or abused to point to
5577 # the GV for an array we split into (an optimization to save
5578 # assignment overhead). Depending on whether we're using ithreads,
5579 # this OP* holds either a GV* or a PADOFFSET. Luckily, B.xs
5580 # figures out for us which it is.
3eaf8b6c 5581 my $replroot = $kid->pmreplroot;
c6e79e55 5582 my $gv = 0;
ef7999f1 5583 my $stacked = $op->flags & OPf_STACKED;
c6e79e55
SM
5584 if (ref($replroot) eq "B::GV") {
5585 $gv = $replroot;
5586 } elsif (!ref($replroot) and $replroot > 0) {
5587 $gv = $self->padval($replroot);
fd017c00
FC
5588 } elsif ($kid->targ) {
5589 $ary = $self->padname($kid->targ)
ef7999f1
FC
5590 } elsif ($stacked) {
5591 $ary = $self->deparse($op->last, 7);
6e90668e 5592 }
de183bbb
FC
5593 $ary = $self->maybe_local(@_,
5594 $self->stash_variable('@',
5595 $self->gv_name($gv),
5596 $cx))
5597 if $gv;
c6e79e55 5598
ef7999f1
FC
5599 # Skip the last kid when OPf_STACKED is set, since it is the array
5600 # on the left.
5601 for (; !null($stacked ? $kid->sibling : $kid); $kid = $kid->sibling) {
9d2c6865 5602 push @exprs, $self->deparse($kid, 6);
6e90668e 5603 }
fcd95d64 5604
f86ea535 5605 # handle special case of split(), and split(' ') that compiles to /\s+/
06fc6867 5606 # Under 5.10, the reflags may be undef if the split regexp isn't a constant
3a1b438d 5607 # Under 5.17.5-5.17.9, the special flag is on split itself.
fcd95d64 5608 $kid = $op->first;
5255171e 5609 if ( $op->flags & OPf_SPECIAL
3a1b438d
YO
5610 or (
5611 $kid->flags & OPf_SPECIAL
5612 and ( $] < 5.009 ? $kid->pmflags & PMf_SKIPWHITE()
5613 : ($kid->reflags || 0) & RXf_SKIPWHITE()
5614 )
5615 )
5616 ) {
f86ea535 5617 $exprs[0] = "' '";
fcd95d64
DD
5618 }
5619
6e90668e
SM
5620 $expr = "split(" . join(", ", @exprs) . ")";
5621 if ($ary) {
9d2c6865 5622 return $self->maybe_parens("$ary = $expr", $cx, 7);
6e90668e
SM
5623 } else {
5624 return $expr;
5625 }
5626}
5627
5628# oxime -- any of various compounds obtained chiefly by the action of
5629# hydroxylamine on aldehydes and ketones and characterized by the
5630# bivalent grouping C=NOH [Webster's Tenth]
5631
5632my %substwords;
5633map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em',
5634 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me',
5635 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem',
ddc6eb27 5636 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi', 'rogue',
4f4d7508
DC
5637 'sir', 'rise', 'smore', 'more', 'seer', 'rome', 'gore', 'grim', 'grime',
5638 'or', 'rose', 'rosie');
6e90668e
SM
5639
5640sub pp_subst {
5641 my $self = shift;
9d2c6865 5642 my($op, $cx) = @_;
6e90668e 5643 my $kid = $op->first;
9d2c6865 5644 my($binop, $var, $re, $repl) = ("", "", "", "");
6e90668e 5645 if ($op->flags & OPf_STACKED) {
9d2c6865
SM
5646 $binop = 1;
5647 $var = $self->deparse($kid, 20);
6e90668e
SM
5648 $kid = $kid->sibling;
5649 }
05a502dc
FC
5650 elsif (my $targ = $op->targ) {
5651 $binop = 1;
5652 $var = $self->padname($targ);
5653 }
d989cdac 5654 my $flags = "";
86e39c78 5655 my $pmflags = $op->pmflags;
6e90668e 5656 if (null($op->pmreplroot)) {
ef90d20a 5657 $repl = $kid;
6e90668e
SM
5658 $kid = $kid->sibling;
5659 } else {
5660 $repl = $op->pmreplroot->first; # skip substcont
ef90d20a
FC
5661 }
5662 while ($repl->name eq "entereval") {
6e90668e
SM
5663 $repl = $repl->first;
5664 $flags .= "e";
ef90d20a 5665 }
9f125c4a
FC
5666 {
5667 local $self->{in_subst_repl} = 1;
5668 if ($pmflags & PMf_EVAL) {
d989cdac 5669 $repl = $self->deparse($repl->first, 0);
9f125c4a 5670 } else {
bd0865ec 5671 $repl = $self->dq($repl);
9f125c4a 5672 }
6e90668e 5673 }
87ebe743 5674 if (not null my $code_list = $op->code_list) {
ba0372a0 5675 $re = $self->code_list($code_list);
87ebe743 5676 } elsif (null $kid) {
ba0372a0 5677 $re = re_uninterp(escape_re(re_unback($op->precomp)));
6e90668e 5678 } else {
ba0372a0 5679 ($re) = $self->regcomp($kid, 1);
a798dbf2 5680 }
86e39c78
FC
5681 $flags .= "r" if $pmflags & PMf_NONDESTRUCT;
5682 $flags .= "e" if $pmflags & PMf_EVAL;
c3ae113d
FC
5683 $flags .= $self->re_flags($op);
5684 $flags = join '', sort split //, $flags;
6e90668e 5685 $flags = $substwords{$flags} if $substwords{$flags};
7741ceed 5686 my $core_s = $self->keyword("s"); # maybe CORE::s
9d2c6865 5687 if ($binop) {
7741ceed 5688 return $self->maybe_parens("$var =~ $core_s"
9d2c6865
SM
5689 . double_delim($re, $repl) . $flags,
5690 $cx, 20);
5691 } else {
7741ceed 5692 return "$core_s". double_delim($re, $repl) . $flags;
9d2c6865 5693 }
a798dbf2
MB
5694}
5695
73582821
AC
5696sub is_lexical_subs {
5697 my (@ops) = shift;
5698 for my $op (@ops) {
5699 return 0 if $op->name !~ /\A(?:introcv|clonecv)\z/;
5700 }
5701 return 1;
5702}
5703
d4f1bfe7
FC
5704# Pretend these two ops do not exist. The perl parser adds them to the
5705# beginning of any block containing my-sub declarations, whereas we handle
5706# the subs in pad_subs and next_todo.
5707*pp_clonecv = *pp_introcv;
73582821
AC
5708sub pp_introcv {
5709 my $self = shift;
5710 my($op, $cx) = @_;
5711 # For now, deparsing doesn't worry about the distinction between introcv
5712 # and clonecv, so pretend this op doesn't exist:
5713 return '';
5714}
5715
73582821
AC
5716sub pp_padcv {
5717 my $self = shift;
5718 my($op, $cx) = @_;
5719 return $self->padany($op);
5720}
5721
9187b6e4
FC
5722my %lvref_funnies = (
5723 OPpLVREF_SV, => '$',
5724 OPpLVREF_AV, => '@',
5725 OPpLVREF_HV, => '%',
5726 OPpLVREF_CV, => '&',
5727);
5728
5729sub pp_refassign {
5730 my ($self, $op, $cx) = @_;
5731 my $left;
5732 if ($op->private & OPpLVREF_ELEM) {
3028eff1 5733 $left = $op->first->sibling;
9187b6e4
FC
5734 $left = maybe_local(@_, elem($self, $left, undef,
5735 $left->targ == OP_AELEM
5736 ? qw([ ] padav)
5737 : qw({ } padhv)));
5738 } elsif ($op->flags & OPf_STACKED) {
5739 $left = maybe_local(@_,
5740 $lvref_funnies{$op->private & OPpLVREF_TYPE}
5741 . $self->deparse($op->first->sibling));
5742 } else {
5743 $left = &pp_padsv;
5744 }
5745 my $right = $self->deparse_binop_right($op, $op->first, 7);
5746 return $self->maybe_parens("\\$left = $right", $cx, 7);
5747}
5748
5749sub pp_lvref {
5750 my ($self, $op, $cx) = @_;
5751 my $code;
5752 if ($op->private & OPpLVREF_ELEM) {
5753 $code = $op->first->name =~ /av\z/ ? &pp_aelem : &pp_helem;
5754 } elsif ($op->flags & OPf_STACKED) {
5755 $code = maybe_local(@_,
5756 $lvref_funnies{$op->private & OPpLVREF_TYPE}
5757 . $self->deparse($op->first));
5758 } else {
5759 $code = &pp_padsv;
5760 }
5761 "\\$code";
5762}
5763
5764sub pp_lvrefslice {
5765 my ($self, $op, $cx) = @_;
5766 '\\' . ($op->last->name =~ /av\z/ ? &pp_aslice : &pp_hslice);
5767}
5768
5769sub pp_lvavref {
5770 my ($self, $op, $cx) = @_;
5771 '\\(' . ($op->flags & OPf_STACKED
5772 ? maybe_local(@_, rv2x(@_, "\@"))
5773 : &pp_padsv) . ')'
5774}
5775
a798dbf2 57761;
f6f9bdb7
SM
5777__END__
5778
5779=head1 NAME
5780
5781B::Deparse - Perl compiler backend to produce perl code
5782
5783=head1 SYNOPSIS
5784
d989cdac 5785B<perl> B<-MO=Deparse>[B<,-d>][B<,-f>I<FILE>][B<,-p>][B<,-q>][B<,-l>]
646bba82 5786 [B<,-s>I<LETTERS>][B<,-x>I<LEVEL>] I<prog.pl>
f6f9bdb7
SM
5787
5788=head1 DESCRIPTION
5789
5790B::Deparse is a backend module for the Perl compiler that generates
5791perl source code, based on the internal compiled structure that perl
d4963d04 5792itself creates after parsing a program. The output of B::Deparse won't
f6f9bdb7
SM
5793be exactly the same as the original source, since perl doesn't keep
5794track of comments or whitespace, and there isn't a one-to-one
5795correspondence between perl's syntactical constructions and their
d4963d04 5796compiled form, but it will often be close. When you use the B<-p>
9d2c6865
SM
5797option, the output also includes parentheses even when they are not
5798required by precedence, which can make it easy to see if perl is
5799parsing your expressions the way you intended.
f6f9bdb7 5800
d989cdac
SM
5801While B::Deparse goes to some lengths to try to figure out what your
5802original program was doing, some parts of the language can still trip
d4963d04 5803it up; it still fails even on some parts of Perl's own test suite. If
d989cdac
SM
5804you encounter a failure other than the most common ones described in
5805the BUGS section below, you can help contribute to B::Deparse's
5806ongoing development by submitting a bug report with a small
5807example.
f6f9bdb7
SM
5808
5809=head1 OPTIONS
5810
9d2c6865
SM
5811As with all compiler backend options, these must follow directly after
5812the '-MO=Deparse', separated by a comma but not any white space.
f6f9bdb7
SM
5813
5814=over 4
5815
d989cdac
SM
5816=item B<-d>
5817
5818Output data values (when they appear as constants) using Data::Dumper.
5819Without this option, B::Deparse will use some simple routines of its
d4963d04 5820own for the same purpose. Currently, Data::Dumper is better for some
d989cdac
SM
5821kinds of data (such as complex structures with sharing and
5822self-reference) while the built-in routines are better for others
5823(such as odd floating-point values).
5824
5825=item B<-f>I<FILE>
5826
5827Normally, B::Deparse deparses the main code of a program, and all the subs
d4963d04
FC
5828defined in the same file. To include subs defined in
5829other files, pass the B<-f> option with the filename.
5830You can pass the B<-f> option several times, to
d989cdac
SM
5831include more than one secondary file. (Most of the time you don't want to
5832use it at all.) You can also use this option to include subs which are
5833defined in the scope of a B<#line> directive with two parameters.
5834
bd0865ec
GS
5835=item B<-l>
5836
5837Add '#line' declarations to the output based on the line and file
5838locations of the original code.
5839
9d2c6865
SM
5840=item B<-p>
5841
d4963d04 5842Print extra parentheses. Without this option, B::Deparse includes
9d2c6865 5843parentheses in its output only when they are needed, based on the
d4963d04
FC
5844structure of your program. With B<-p>, it uses parentheses (almost)
5845whenever they would be legal. This can be useful if you are used to
5846LISP, or if you want to see how perl parses your input. If you say
9d2c6865 5847
d989cdac 5848 if ($var & 0x7f == 65) {print "Gimme an A!"}
9d2c6865
SM
5849 print ($which ? $a : $b), "\n";
5850 $name = $ENV{USER} or "Bob";
5851
5852C<B::Deparse,-p> will print
5853
5854 if (($var & 0)) {
5855 print('Gimme an A!')
5856 };
5857 (print(($which ? $a : $b)), '???');
5858 (($name = $ENV{'USER'}) or '???')
5859
5860which probably isn't what you intended (the C<'???'> is a sign that
5861perl optimized away a constant value).
5862
acaaef34
RGS
5863=item B<-P>
5864
d4963d04
FC
5865Disable prototype checking. With this option, all function calls are
5866deparsed as if no prototype was defined for them. In other words,
acaaef34
RGS
5867
5868 perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
5869
5870will print
5871
5872 sub foo (\@) {
5873 1;
5874 }
5875 &foo(\@x);
5876
5877making clear how the parameters are actually passed to C<foo>.
5878
bd0865ec
GS
5879=item B<-q>
5880
5881Expand double-quoted strings into the corresponding combinations of
d4963d04 5882concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
bd0865ec
GS
5883instance, print
5884
5885 print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
5886
5887as
5888
5889 print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
5890 . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
5891
5892Note that the expanded form represents the way perl handles such
5893constructions internally -- this option actually turns off the reverse
d4963d04 5894translation that B::Deparse usually does. On the other hand, note that
bd0865ec
GS
5895C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
5896of $y into a string before doing the assignment.
5897
9d2c6865
SM
5898=item B<-s>I<LETTERS>
5899
d4963d04
FC
5900Tweak the style of B::Deparse's output. The letters should follow
5901directly after the 's', with no space or punctuation. The following
f4a44678 5902options are available:
9d2c6865
SM
5903
5904=over 4
5905
5906=item B<C>
5907
d4963d04 5908Cuddle C<elsif>, C<else>, and C<continue> blocks. For example, print
9d2c6865
SM
5909
5910 if (...) {
5911 ...
5912 } else {
5913 ...
5914 }
5915
5916instead of
5917
5918 if (...) {
5919 ...
5920 }
5921 else {
5922 ...
5923 }
5924
5925The default is not to cuddle.
5926
f4a44678
SM
5927=item B<i>I<NUMBER>
5928
d4963d04 5929Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
f4a44678
SM
5930
5931=item B<T>
5932
d4963d04 5933Use tabs for each 8 columns of indent. The default is to use only spaces.
f4a44678
SM
5934For instance, if the style options are B<-si4T>, a line that's indented
59353 times will be preceded by one tab and four spaces; if the options were
5936B<-si8T>, the same line would be preceded by three tabs.
5937
5938=item B<v>I<STRING>B<.>
5939
5940Print I<STRING> for the value of a constant that can't be determined
5941because it was optimized away (mnemonic: this happens when a constant
d4963d04 5942is used in B<v>oid context). The end of the string is marked by a period.
f4a44678
SM
5943The string should be a valid perl expression, generally a constant.
5944Note that unless it's a number, it probably needs to be quoted, and on
d4963d04 5945a command line quotes need to be protected from the shell. Some
f4a44678
SM
5946conventional values include 0, 1, 42, '', 'foo', and
5947'Useless use of constant omitted' (which may need to be
5948B<-sv"'Useless use of constant omitted'.">
d4963d04 5949or something similar depending on your shell). The default is '???'.
f4a44678
SM
5950If you're using B::Deparse on a module or other file that's require'd,
5951you shouldn't use a value that evaluates to false, since the customary
5952true constant at the end of a module will be in void context when the
5953file is compiled as a main program.
5954
9d2c6865
SM
5955=back
5956
58cccf98
SM
5957=item B<-x>I<LEVEL>
5958
5959Expand conventional syntax constructions into equivalent ones that expose
d4963d04
FC
5960their internal operation. I<LEVEL> should be a digit, with higher values
5961meaning more expansion. As with B<-q>, this actually involves turning off
58cccf98
SM
5962special cases in B::Deparse's normal operations.
5963
d989cdac 5964If I<LEVEL> is at least 3, C<for> loops will be translated into equivalent
646bba82 5965while loops with continue blocks; for instance
58cccf98
SM
5966
5967 for ($i = 0; $i < 10; ++$i) {
5968 print $i;
5969 }
5970
5971turns into
5972
5973 $i = 0;
5974 while ($i < 10) {
5975 print $i;
5976 } continue {
5977 ++$i
5978 }
5979
5980Note that in a few cases this translation can't be perfectly carried back
646bba82 5981into the source code -- if the loop's initializer declares a my variable,
58cccf98
SM
5982for instance, it won't have the correct scope outside of the loop.
5983
d989cdac
SM
5984If I<LEVEL> is at least 5, C<use> declarations will be translated into
5985C<BEGIN> blocks containing calls to C<require> and C<import>; for
5986instance,
5987
5988 use strict 'refs';
5989
5990turns into
5991
5992 sub BEGIN {
5993 require strict;
5994 do {
5995 'strict'->import('refs')
5996 };
5997 }
5998
5999If I<LEVEL> is at least 7, C<if> statements will be translated into
6000equivalent expressions using C<&&>, C<?:> and C<do {}>; for instance
58cccf98
SM
6001
6002 print 'hi' if $nice;
6003 if ($nice) {
6004 print 'hi';
6005 }
6006 if ($nice) {
6007 print 'hi';
6008 } else {
6009 print 'bye';
6010 }
6011
6012turns into
6013
6014 $nice and print 'hi';
6015 $nice and do { print 'hi' };
6016 $nice ? do { print 'hi' } : do { print 'bye' };
6017
6018Long sequences of elsifs will turn into nested ternary operators, which
6019B::Deparse doesn't know how to indent nicely.
6020
f6f9bdb7
SM
6021=back
6022
f4a44678
SM
6023=head1 USING B::Deparse AS A MODULE
6024
6025=head2 Synopsis
6026
6027 use B::Deparse;
6028 $deparse = B::Deparse->new("-p", "-sC");
6029 $body = $deparse->coderef2text(\&func);
6030 eval "sub func $body"; # the inverse operation
6031
6032=head2 Description
6033
6034B::Deparse can also be used on a sub-by-sub basis from other perl
6035programs.
6036
6037=head2 new
6038
6039 $deparse = B::Deparse->new(OPTIONS)
6040
6041Create an object to store the state of a deparsing operation and any
d4963d04 6042options. The options are the same as those that can be given on the
f4a44678 6043command line (see L</OPTIONS>); options that are separated by commas
7a07078a 6044after B<-MO=Deparse> should be given as separate strings.
f4a44678 6045
08c6f5ec
RH
6046=head2 ambient_pragmas
6047
bc6b2ef6 6048 $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
08c6f5ec
RH
6049
6050The compilation of a subroutine can be affected by a few compiler
d4963d04 6051directives, B<pragmas>. These are:
08c6f5ec
RH
6052
6053=over 4
6054
6055=item *
6056
6057use strict;
6058
6059=item *
6060
6061use warnings;
6062
6063=item *
6064
bc6b2ef6
Z
6065Assigning to the special variable $[
6066
6067=item *
6068
08c6f5ec
RH
6069use integer;
6070
a0405c92
RH
6071=item *
6072
6073use bytes;
6074
6075=item *
6076
6077use utf8;
6078
6079=item *
6080
6081use re;
6082
08c6f5ec
RH
6083=back
6084
6085Ordinarily, if you use B::Deparse on a subroutine which has
6086been compiled in the presence of one or more of these pragmas,
6087the output will include statements to turn on the appropriate
d4963d04 6088directives. So if you then compile the code returned by coderef2text,
08c6f5ec
RH
6089it will behave the same way as the subroutine which you deparsed.
6090
6091However, you may know that you intend to use the results in a
d4963d04 6092particular context, where some pragmas are already in scope. In
08c6f5ec
RH
6093this case, you use the B<ambient_pragmas> method to describe the
6094assumptions you wish to make.
6095
d4963d04 6096Not all of the options currently have any useful effect. See
995e581f
RH
6097L</BUGS> for more details.
6098
08c6f5ec
RH
6099The parameters it accepts are:
6100
6101=over 4
6102
6103=item strict
6104
6105Takes a string, possibly containing several values separated
d4963d04 6106by whitespace. The special values "all" and "none" mean what you'd
08c6f5ec
RH
6107expect.
6108
6109 $deparse->ambient_pragmas(strict => 'subs refs');
6110
bc6b2ef6
Z
6111=item $[
6112
6113Takes a number, the value of the array base $[.
6114Cannot be non-zero on Perl 5.15.3 or later.
6115
a0405c92
RH
6116=item bytes
6117
6118=item utf8
6119
08c6f5ec
RH
6120=item integer
6121
a0405c92 6122If the value is true, then the appropriate pragma is assumed to
08c6f5ec
RH
6123be in the ambient scope, otherwise not.
6124
a0405c92
RH
6125=item re
6126
6127Takes a string, possibly containing a whitespace-separated list of
d4963d04 6128values. The values "all" and "none" are special. It's also permissible
a0405c92
RH
6129to pass an array reference here.
6130
6131 $deparser->ambient_pragmas(re => 'eval');
6132
6133
08c6f5ec
RH
6134=item warnings
6135
6136Takes a string, possibly containing a whitespace-separated list of
d4963d04 6137values. The values "all" and "none" are special, again. It's also
08c6f5ec
RH
6138permissible to pass an array reference here.
6139
6140 $deparser->ambient_pragmas(warnings => [qw[void io]]);
6141
6142If one of the values is the string "FATAL", then all the warnings
6143in that list will be considered fatal, just as with the B<warnings>
d4963d04 6144pragma itself. Should you need to specify that some warnings are
08c6f5ec
RH
6145fatal, and others are merely enabled, you can pass the B<warnings>
6146parameter twice:
6147
6148 $deparser->ambient_pragmas(
6149 warnings => 'all',
6150 warnings => [FATAL => qw/void io/],
6151 );
6152
44ecbbd8 6153See L<warnings> for more information about lexical warnings.
08c6f5ec
RH
6154
6155=item hint_bits
6156
6157=item warning_bits
6158
6159These two parameters are used to specify the ambient pragmas in
6160the format used by the special variables $^H and ${^WARNING_BITS}.
6161
6162They exist principally so that you can write code like:
6163
6164 { my ($hint_bits, $warning_bits);
6165 BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
6166 $deparser->ambient_pragmas (
6167 hint_bits => $hint_bits,
6168 warning_bits => $warning_bits,
bc6b2ef6 6169 '$[' => 0 + $[
08c6f5ec
RH
6170 ); }
6171
6172which specifies that the ambient pragmas are exactly those which
6173are in scope at the point of calling.
6174
0ced6c29
RGS
6175=item %^H
6176
6177This parameter is used to specify the ambient pragmas which are
6178stored in the special hash %^H.
6179
08c6f5ec
RH
6180=back
6181
f4a44678
SM
6182=head2 coderef2text
6183
6184 $body = $deparse->coderef2text(\&func)
6185 $body = $deparse->coderef2text(sub ($$) { ... })
6186
6187Return source code for the body of a subroutine (a block, optionally
6188preceded by a prototype in parens), given a reference to the
d4963d04 6189sub. Because a subroutine can have no names, or more than one name,
f4a44678
SM
6190this method doesn't return a complete subroutine definition -- if you
6191want to eval the result, you should prepend "sub subname ", or "sub "
d4963d04 6192for an anonymous function constructor. Unless the sub was defined in
f4a44678
SM
6193the main:: package, the code will include a package declaration.
6194
f6f9bdb7
SM
6195=head1 BUGS
6196
995e581f
RH
6197=over 4
6198
6199=item *
6200
65eb3922
FC
6201In Perl 5.20 and earlier, the only pragmas to
6202be completely supported are: C<use warnings>,
b1b6de96 6203C<use strict>, C<use bytes>, C<use integer>
33021019 6204and C<use feature>. (C<$[>, which
bc6b2ef6 6205behaves like a pragma, is also supported.)
995e581f
RH
6206
6207Excepting those listed above, we're currently unable to guarantee that
6208B::Deparse will produce a pragma at the correct point in the program.
d989cdac
SM
6209(Specifically, pragmas at the beginning of a block often appear right
6210before the start of the block instead.)
995e581f
RH
6211Since the effects of pragmas are often lexically scoped, this can mean
6212that the pragma holds sway over a different portion of the program
6213than in the input file.
6214
6215=item *
6216
c7f67cde
RH
6217In fact, the above is a specific instance of a more general problem:
6218we can't guarantee to produce BEGIN blocks or C<use> declarations in
d4963d04 6219exactly the right place. So if you use a module which affects compilation
c7f67cde
RH
6220(such as by over-riding keywords, overloading constants or whatever)
6221then the output code might not work as intended.
6222
65eb3922
FC
6223This is the most serious problem in Perl 5.20 and earlier. Fixing this
6224required internal changes in Perl 5.22.
c7f67cde
RH
6225
6226=item *
6227
d989cdac
SM
6228Some constants don't print correctly either with or without B<-d>.
6229For instance, neither B::Deparse nor Data::Dumper know how to print
6230dual-valued scalars correctly, as in:
b7dad2dc 6231
d989cdac 6232 use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
b7dad2dc 6233
227375e1
RU
6234 use constant H => { "#" => 1 }; H->{"#"};
6235
2a9e2f8a
RH
6236=item *
6237
6238An input file that uses source filtering probably won't be deparsed into
6239runnable code, because it will still include the B<use> declaration
6240for the source filtering module, even though the code that is
6241produced is already ordinary Perl which shouldn't be filtered again.
6242
6243=item *
6244
e5fbaf13 6245Optimized-away statements are rendered as
d4963d04 6246'???'. This includes statements that
b64ba24c
RGS
6247have a compile-time side-effect, such as the obscure
6248
6249 my $x if 0;
6250
6251which is not, consequently, deparsed correctly.
6252
227375e1
RU
6253 foreach my $i (@_) { 0 }
6254 =>
6255 foreach my $i (@_) { '???' }
6256
b64ba24c
RGS
6257=item *
6258
8c1e32d8 6259Lexical (my) variables declared in scopes external to a subroutine
d4963d04 6260appear in code2ref output text as package variables. This is a tricky
c4a6f826 6261problem, as perl has no native facility for referring to a lexical variable
8c1e32d8
DN
6262defined within a different scope, although L<PadWalker> is a good start.
6263
4e3643b4
FC
6264See also L<Data::Dump::Streamer>, which combines B::Deparse and
6265L<PadWalker> to serialize closures properly.
6266
8c1e32d8
DN
6267=item *
6268
2a9e2f8a
RH
6269There are probably many more bugs on non-ASCII platforms (EBCDIC).
6270
73582821
AC
6271=item *
6272
e4d64f82
FC
6273Prior to Perl 5.22, lexical C<my> subroutines were not deparsed properly.
6274They were emitted as pure declarations, sometimes in the wrong place.
6275Lexical C<state> subroutines were not deparsed at all.
f0cf3754 6276
995e581f 6277=back
f6f9bdb7
SM
6278
6279=head1 AUTHOR
6280
d989cdac
SM
6281Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
6282by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
6283Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
6284Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael
6285Garcia-Suarez.
f6f9bdb7
SM
6286
6287=cut