This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update B::Concise for OPpMAY_RETURN_CONSTANT
[perl5.git] / ext / B / B / Concise.pm
CommitLineData
c99ca59a 1package B::Concise;
c27ea44e 2# Copyright (C) 2000-2003 Stephen McCamant. All rights reserved.
c99ca59a
SM
3# This program is free software; you can redistribute and/or modify it
4# under the same terms as Perl itself.
5
8ec8fbef
SM
6# Note: we need to keep track of how many use declarations/BEGIN
7# blocks this module uses, so we can avoid printing them when user
8# asks for the BEGIN blocks in her program. Update the comments and
9# the count in concise_specials if you add or delete one. The
10# -MO=Concise counts as use #1.
78ad9108 11
8ec8fbef
SM
12use strict; # use #2
13use warnings; # uses #3 and #4, since warnings uses Carp
78ad9108 14
8ec8fbef
SM
15use Exporter (); # use #5
16
fced3bbf 17our $VERSION = "0.992";
78ad9108 18our @ISA = qw(Exporter);
cc02ea56
JC
19our @EXPORT_OK = qw( set_style set_style_standard add_callback
20 concise_subref concise_cv concise_main
21 add_style walk_output compile reset_sequence );
22our %EXPORT_TAGS =
23 ( io => [qw( walk_output compile reset_sequence )],
24 style => [qw( add_style set_style_standard )],
25 cb => [qw( add_callback )],
26 mech => [qw( concise_subref concise_cv concise_main )], );
78ad9108 27
8ec8fbef 28# use #6
c99ca59a 29use B qw(class ppname main_start main_root main_cv cstring svref_2object
6a077020 30 SVf_IOK SVf_NOK SVf_POK SVf_IVisUV SVf_FAKE OPf_KIDS OPf_SPECIAL
4df7f6af 31 CVf_ANON PAD_FAKELEX_ANON PAD_FAKELEX_MULTI SVf_ROK);
c99ca59a 32
f95e3c3c 33my %style =
c99ca59a 34 ("terse" =>
c3caa09d
SM
35 ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) "
36 . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
c99ca59a
SM
37 "(*( )*)goto #class (#addr)\n",
38 "#class pp_#name"],
39 "concise" =>
d5ec2987
NC
40 ["#hyphseq2 (*( (x( ;)x))*)<#classsym> #exname#arg(?([#targarglife])?)"
41 . "~#flags(?(/#private)?)(?(:#hints)?)(x(;~->#next)x)\n"
cc02ea56 42 , " (*( )*) goto #seq\n",
c99ca59a
SM
43 "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
44 "linenoise" =>
45 ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
46 "gt_#seq ",
47 "(?(#seq)?)#noise#arg(?([#targarg])?)"],
48 "debug" =>
a854082c
MH
49 ["#class (#addr)\n\top_next\t\t#nextaddr\n\t(?(op_other\t#otheraddr\n\t)?)"
50 . "op_sibling\t#sibaddr\n\t"
35633035 51 . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n"
d5ec2987 52 . "\top_flags\t#flagval\n\top_private\t#privval\t#hintsval\n"
c99ca59a
SM
53 . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)"
54 . "(?(\top_sv\t\t#svaddr\n)?)",
55 " GOTO #addr\n",
56 "#addr"],
57 "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
58 $ENV{B_CONCISE_TREE_FORMAT}],
59 );
60
724aa791
JC
61# Renderings, ie how Concise prints, is controlled by these vars
62# primary:
63our $stylename; # selects current style from %style
64my $order = "basic"; # how optree is walked & printed: basic, exec, tree
65
66# rendering mechanics:
67# these 'formats' are the line-rendering templates
68# they're updated from %style when $stylename changes
69my ($format, $gotofmt, $treefmt);
70
71# lesser players:
72my $base = 36; # how <sequence#> is displayed
73my $big_endian = 1; # more <sequence#> display
74my $tree_style = 0; # tree-order details
75my $banner = 1; # print banner before optree is traversed
cc02ea56 76my $do_main = 0; # force printing of main routine
f18deeb9 77my $show_src; # show source code
724aa791 78
cc02ea56 79# another factor: can affect all styles!
724aa791
JC
80our @callbacks; # allow external management
81
82set_style_standard("concise");
83
c99ca59a 84my $curcv;
c27ea44e 85my $cop_seq_base;
78ad9108
PJ
86
87sub set_style {
88 ($format, $gotofmt, $treefmt) = @_;
724aa791 89 #warn "set_style: deprecated, use set_style_standard instead\n"; # someday
f95e3c3c
JC
90 die "expecting 3 style-format args\n" unless @_ == 3;
91}
92
93sub add_style {
94 my ($newstyle,@args) = @_;
95 die "style '$newstyle' already exists, choose a new name\n"
96 if exists $style{$newstyle};
97 die "expecting 3 style-format args\n" unless @args == 3;
98 $style{$newstyle} = [@args];
724aa791 99 $stylename = $newstyle; # update rendering state
78ad9108
PJ
100}
101
31b49ad4 102sub set_style_standard {
724aa791 103 ($stylename) = @_; # update rendering state
f95e3c3c
JC
104 die "err: style '$stylename' unknown\n" unless exists $style{$stylename};
105 set_style(@{$style{$stylename}});
31b49ad4
SM
106}
107
78ad9108
PJ
108sub add_callback {
109 push @callbacks, @_;
110}
c99ca59a 111
f95e3c3c 112# output handle, used with all Concise-output printing
cc02ea56
JC
113our $walkHandle; # public for your convenience
114BEGIN { $walkHandle = \*STDOUT }
f95e3c3c
JC
115
116sub walk_output { # updates $walkHandle
117 my $handle = shift;
cc02ea56
JC
118 return $walkHandle unless $handle; # allow use as accessor
119
f95e3c3c 120 if (ref $handle eq 'SCALAR') {
2ce64696
JC
121 require Config;
122 die "no perlio in this build, can't call walk_output (\\\$scalar)\n"
123 unless $Config::Config{useperlio};
f95e3c3c 124 # in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string
2ce64696 125 open my $tmp, '>', $handle; # but cant re-set existing STDOUT
f95e3c3c 126 $walkHandle = $tmp; # so use my $tmp as intermediate var
cc02ea56 127 return $walkHandle;
f95e3c3c 128 }
cc02ea56 129 my $iotype = ref $handle;
f95e3c3c 130 die "expecting argument/object that can print\n"
cc02ea56
JC
131 unless $iotype eq 'GLOB' or $iotype and $handle->can('print');
132 $walkHandle = $handle;
f95e3c3c
JC
133}
134
8ec8fbef 135sub concise_subref {
c0939cee 136 my($order, $coderef, $name) = @_;
f95e3c3c 137 my $codeobj = svref_2object($coderef);
cc02ea56 138
c0939cee 139 return concise_stashref(@_)
35f75594 140 unless ref($codeobj) =~ '^B::(?:CV|FM)\z';
c0939cee 141 concise_cv_obj($order, $codeobj, $name);
8ec8fbef
SM
142}
143
cc02ea56
JC
144sub concise_stashref {
145 my($order, $h) = @_;
6cc5d258 146 local *s;
cc02ea56 147 foreach my $k (sort keys %$h) {
6cc5d258
JC
148 next unless defined $h->{$k};
149 *s = $h->{$k};
cc02ea56
JC
150 my $coderef = *s{CODE} or next;
151 reset_sequence();
152 print "FUNC: ", *s, "\n";
153 my $codeobj = svref_2object($coderef);
154 next unless ref $codeobj eq 'B::CV';
6cc5d258
JC
155 eval { concise_cv_obj($order, $codeobj, $k) };
156 warn "err $@ on $codeobj" if $@;
cc02ea56
JC
157 }
158}
159
8ec8fbef
SM
160# This should have been called concise_subref, but it was exported
161# under this name in versions before 0.56
c0939cee 162*concise_cv = \&concise_subref;
8ec8fbef
SM
163
164sub concise_cv_obj {
c0939cee
JC
165 my ($order, $cv, $name) = @_;
166 # name is either a string, or a CODE ref (copy of $cv arg??)
167
c99ca59a 168 $curcv = $cv;
d51cf0c9 169
2018a5c3 170 if (ref($cv->XSUBANY) =~ /B::(\w+)/) {
d51cf0c9
JC
171 print $walkHandle "$name is a constant sub, optimized to a $1\n";
172 return;
173 }
c0939cee
JC
174 if ($cv->XSUB) {
175 print $walkHandle "$name is XS code\n";
176 return;
177 }
178 if (class($cv->START) eq "NULL") {
179 no strict 'refs';
180 if (ref $name eq 'CODE') {
181 print $walkHandle "coderef $name has no START\n";
182 }
183 elsif (exists &$name) {
e75702e9 184 print $walkHandle "$name exists in stash, but has no START\n";
c0939cee
JC
185 }
186 else {
187 print $walkHandle "$name not in symbol table\n";
188 }
189 return;
190 }
c27ea44e 191 sequence($cv->START);
c99ca59a
SM
192 if ($order eq "exec") {
193 walk_exec($cv->START);
c0939cee
JC
194 }
195 elsif ($order eq "basic") {
196 # walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0);
197 my $root = $cv->ROOT;
198 unless (ref $root eq 'B::NULL') {
199 walk_topdown($root, sub { $_[0]->concise($_[1]) }, 0);
200 } else {
201 print $walkHandle "B::NULL encountered doing ROOT on $cv. avoiding disaster\n";
202 }
c99ca59a 203 } else {
f95e3c3c 204 print $walkHandle tree($cv->ROOT, 0);
c99ca59a
SM
205 }
206}
207
31b49ad4
SM
208sub concise_main {
209 my($order) = @_;
210 sequence(main_start);
211 $curcv = main_cv;
212 if ($order eq "exec") {
213 return if class(main_start) eq "NULL";
214 walk_exec(main_start);
215 } elsif ($order eq "tree") {
216 return if class(main_root) eq "NULL";
f95e3c3c 217 print $walkHandle tree(main_root, 0);
31b49ad4
SM
218 } elsif ($order eq "basic") {
219 return if class(main_root) eq "NULL";
220 walk_topdown(main_root,
221 sub { $_[0]->concise($_[1]) }, 0);
222 }
223}
224
8ec8fbef
SM
225sub concise_specials {
226 my($name, $order, @cv_s) = @_;
227 my $i = 1;
228 if ($name eq "BEGIN") {
c0939cee 229 splice(@cv_s, 0, 8); # skip 7 BEGIN blocks in this file. NOW 8 ??
8ec8fbef
SM
230 } elsif ($name eq "CHECK") {
231 pop @cv_s; # skip the CHECK block that calls us
232 }
f95e3c3c
JC
233 for my $cv (@cv_s) {
234 print $walkHandle "$name $i:\n";
8ec8fbef 235 $i++;
c0939cee 236 concise_cv_obj($order, $cv, $name);
8ec8fbef
SM
237 }
238}
239
c99ca59a
SM
240my $start_sym = "\e(0"; # "\cN" sometimes also works
241my $end_sym = "\e(B"; # "\cO" respectively
242
f95e3c3c 243my @tree_decorations =
c99ca59a
SM
244 ([" ", "--", "+-", "|-", "| ", "`-", "-", 1],
245 [" ", "-", "+", "+", "|", "`", "", 0],
246 [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1],
247 [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0],
248 );
78ad9108 249
9e0f9750
JC
250my @render_packs; # collect -stash=<packages>
251
cc02ea56
JC
252sub compileOpts {
253 # set rendering state from options and args
c0939cee
JC
254 my (@options,@args);
255 if (@_) {
256 @options = grep(/^-/, @_);
257 @args = grep(!/^-/, @_);
258 }
c99ca59a 259 for my $o (@options) {
cc02ea56 260 # mode/order
c99ca59a
SM
261 if ($o eq "-basic") {
262 $order = "basic";
263 } elsif ($o eq "-exec") {
264 $order = "exec";
265 } elsif ($o eq "-tree") {
266 $order = "tree";
cc02ea56
JC
267 }
268 # tree-specific
269 elsif ($o eq "-compact") {
c99ca59a
SM
270 $tree_style |= 1;
271 } elsif ($o eq "-loose") {
272 $tree_style &= ~1;
273 } elsif ($o eq "-vt") {
274 $tree_style |= 2;
275 } elsif ($o eq "-ascii") {
276 $tree_style &= ~2;
cc02ea56
JC
277 }
278 # sequence numbering
279 elsif ($o =~ /^-base(\d+)$/) {
c99ca59a
SM
280 $base = $1;
281 } elsif ($o eq "-bigendian") {
282 $big_endian = 1;
283 } elsif ($o eq "-littleendian") {
284 $big_endian = 0;
cc02ea56 285 }
9e0f9750 286 # miscellaneous, presentation
cc02ea56 287 elsif ($o eq "-nobanner") {
724aa791 288 $banner = 0;
cc02ea56
JC
289 } elsif ($o eq "-banner") {
290 $banner = 1;
291 }
292 elsif ($o eq "-main") {
293 $do_main = 1;
294 } elsif ($o eq "-nomain") {
295 $do_main = 0;
f18deeb9
JC
296 } elsif ($o eq "-src") {
297 $show_src = 1;
9e0f9750
JC
298 }
299 elsif ($o =~ /^-stash=(.*)/) {
300 my $pkg = $1;
301 no strict 'refs';
902fde96 302 if (! %{$pkg.'::'}) {
f667a15a
NC
303 eval "require $pkg";
304 } else {
305 require Config;
306 if (!$Config::Config{usedl}
307 && keys %{$pkg.'::'} == 1
308 && $pkg->can('bootstrap')) {
b7b1e41b 309 # It is something that we're statically linked to, but hasn't
f667a15a
NC
310 # yet been used.
311 eval "require $pkg";
312 }
313 }
9e0f9750 314 push @render_packs, $pkg;
724aa791 315 }
cc02ea56 316 # line-style options
724aa791 317 elsif (exists $style{substr($o, 1)}) {
f95e3c3c 318 $stylename = substr($o, 1);
724aa791 319 set_style_standard($stylename);
c99ca59a
SM
320 } else {
321 warn "Option $o unrecognized";
322 }
323 }
cc02ea56
JC
324 return (@args);
325}
326
327sub compile {
328 my (@args) = compileOpts(@_);
c27ea44e 329 return sub {
cc02ea56
JC
330 my @newargs = compileOpts(@_); # accept new rendering options
331 warn "disregarding non-options: @newargs\n" if @newargs;
332
333 for my $objname (@args) {
59910b6d
JC
334 next unless $objname; # skip null args to avoid noisy responses
335
cc02ea56
JC
336 if ($objname eq "BEGIN") {
337 concise_specials("BEGIN", $order,
c0939cee
JC
338 B::begin_av->isa("B::AV") ?
339 B::begin_av->ARRAY : ());
cc02ea56
JC
340 } elsif ($objname eq "INIT") {
341 concise_specials("INIT", $order,
c0939cee
JC
342 B::init_av->isa("B::AV") ?
343 B::init_av->ARRAY : ());
cc02ea56
JC
344 } elsif ($objname eq "CHECK") {
345 concise_specials("CHECK", $order,
c0939cee
JC
346 B::check_av->isa("B::AV") ?
347 B::check_av->ARRAY : ());
676456c2
AG
348 } elsif ($objname eq "UNITCHECK") {
349 concise_specials("UNITCHECK", $order,
350 B::unitcheck_av->isa("B::AV") ?
351 B::unitcheck_av->ARRAY : ());
cc02ea56
JC
352 } elsif ($objname eq "END") {
353 concise_specials("END", $order,
c0939cee
JC
354 B::end_av->isa("B::AV") ?
355 B::end_av->ARRAY : ());
cc02ea56
JC
356 }
357 else {
358 # convert function names to subrefs
cc02ea56
JC
359 if (ref $objname) {
360 print $walkHandle "B::Concise::compile($objname)\n"
361 if $banner;
35f75594
FC
362 concise_subref($order, ($objname)x2);
363 next;
8ec8fbef 364 } else {
cc02ea56 365 $objname = "main::" . $objname unless $objname =~ /::/;
cc02ea56 366 no strict 'refs';
35f75594
FC
367 my $glob = \*$objname;
368 unless (*$glob{CODE} || *$glob{FORMAT}) {
369 print $walkHandle "$objname:\n" if $banner;
c0939cee
JC
370 print $walkHandle "err: unknown function ($objname)\n";
371 return;
372 }
35f75594
FC
373 if (my $objref = *$glob{CODE}) {
374 print $walkHandle "$objname:\n" if $banner;
375 concise_subref($order, $objref, $objname);
376 }
377 if (my $objref = *$glob{FORMAT}) {
378 print $walkHandle "$objname (FORMAT):\n"
379 if $banner;
380 concise_subref($order, $objref, $objname);
381 }
8ec8fbef 382 }
c99ca59a
SM
383 }
384 }
9e0f9750
JC
385 for my $pkg (@render_packs) {
386 no strict 'refs';
387 concise_stashref($order, \%{$pkg.'::'});
388 }
389
390 if (!@args or $do_main or @render_packs) {
f95e3c3c 391 print $walkHandle "main program:\n" if $do_main;
31b49ad4 392 concise_main($order);
c99ca59a 393 }
cc02ea56 394 return @args; # something
c99ca59a
SM
395 }
396}
397
398my %labels;
724aa791 399my $lastnext; # remembers op-chain, used to insert gotos
c99ca59a
SM
400
401my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
402 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
051f02e9 403 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#");
c99ca59a 404
8ec8fbef 405no warnings 'qw'; # "Possible attempt to put comments..."; use #7
35fc55f1
RH
406my @linenoise =
407 qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl
c99ca59a
SM
408 ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I
409 -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i<
410 > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i
411 ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy
412 uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@
413 a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s}
414 v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o
415 ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v
416 ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r
417 -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd
418 co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3
419 g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e
420 e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn
c27ea44e 421 Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO';
c99ca59a
SM
422
423my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
424
19e169bf 425sub op_flags { # common flags (see BASOP.op_flags in op.h)
c99ca59a
SM
426 my($x) = @_;
427 my(@v);
428 push @v, "v" if ($x & 3) == 1;
429 push @v, "s" if ($x & 3) == 2;
430 push @v, "l" if ($x & 3) == 3;
431 push @v, "K" if $x & 4;
432 push @v, "P" if $x & 8;
433 push @v, "R" if $x & 16;
434 push @v, "M" if $x & 32;
435 push @v, "S" if $x & 64;
436 push @v, "*" if $x & 128;
437 return join("", @v);
438}
439
440sub base_n {
441 my $x = shift;
442 return "-" . base_n(-$x) if $x < 0;
443 my $str = "";
444 do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
445 $str = reverse $str if $big_endian;
446 return $str;
447}
448
c27ea44e
SM
449my %sequence_num;
450my $seq_max = 1;
451
f95e3c3c
JC
452sub reset_sequence {
453 # reset the sequence
454 %sequence_num = ();
455 $seq_max = 1;
cc02ea56 456 $lastnext = 0;
f95e3c3c
JC
457}
458
c27ea44e
SM
459sub seq {
460 my($op) = @_;
461 return "-" if not exists $sequence_num{$$op};
462 return base_n($sequence_num{$$op});
463}
c99ca59a
SM
464
465sub walk_topdown {
466 my($op, $sub, $level) = @_;
467 $sub->($op, $level);
468 if ($op->flags & OPf_KIDS) {
469 for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
470 walk_topdown($kid, $sub, $level + 1);
471 }
472 }
98517ccb 473 if (class($op) eq "PMOP") {
c6e79e55
SM
474 my $maybe_root = $op->pmreplroot;
475 if (ref($maybe_root) and $maybe_root->isa("B::OP")) {
476 # It really is the root of the replacement, not something
477 # else stored here for lack of space elsewhere
478 walk_topdown($maybe_root, $sub, $level + 1);
479 }
c99ca59a
SM
480 }
481}
482
483sub walklines {
484 my($ar, $level) = @_;
485 for my $l (@$ar) {
486 if (ref($l) eq "ARRAY") {
487 walklines($l, $level + 1);
488 } else {
489 $l->concise($level);
490 }
491 }
492}
493
494sub walk_exec {
495 my($top, $level) = @_;
496 my %opsseen;
497 my @lines;
498 my @todo = ([$top, \@lines]);
499 while (@todo and my($op, $targ) = @{shift @todo}) {
500 for (; $$op; $op = $op->next) {
501 last if $opsseen{$$op}++;
502 push @$targ, $op;
503 my $name = $op->name;
62e36f8a 504 if (class($op) eq "LOGOP") {
c99ca59a
SM
505 my $ar = [];
506 push @$targ, $ar;
507 push @todo, [$op->other, $ar];
508 } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
509 my $ar = [];
510 push @$targ, $ar;
511 push @todo, [$op->pmreplstart, $ar];
512 } elsif ($name =~ /^enter(loop|iter)$/) {
35633035
DM
513 $labels{${$op->nextop}} = "NEXT";
514 $labels{${$op->lastop}} = "LAST";
515 $labels{${$op->redoop}} = "REDO";
c99ca59a
SM
516 }
517 }
518 }
519 walklines(\@lines, 0);
520}
521
c27ea44e
SM
522# The structure of this routine is purposely modeled after op.c's peep()
523sub sequence {
524 my($op) = @_;
525 my $oldop = 0;
526 return if class($op) eq "NULL" or exists $sequence_num{$$op};
527 for (; $$op; $op = $op->next) {
528 last if exists $sequence_num{$$op};
529 my $name = $op->name;
530 if ($name =~ /^(null|scalar|lineseq|scope)$/) {
531 next if $oldop and $ {$op->next};
532 } else {
533 $sequence_num{$$op} = $seq_max++;
534 if (class($op) eq "LOGOP") {
535 my $other = $op->other;
536 $other = $other->next while $other->name eq "null";
537 sequence($other);
538 } elsif (class($op) eq "LOOP") {
539 my $redoop = $op->redoop;
540 $redoop = $redoop->next while $redoop->name eq "null";
541 sequence($redoop);
542 my $nextop = $op->nextop;
543 $nextop = $nextop->next while $nextop->name eq "null";
544 sequence($nextop);
545 my $lastop = $op->lastop;
546 $lastop = $lastop->next while $lastop->name eq "null";
547 sequence($lastop);
548 } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
549 my $replstart = $op->pmreplstart;
550 $replstart = $replstart->next while $replstart->name eq "null";
551 sequence($replstart);
552 }
553 }
554 $oldop = $op;
555 }
556}
557
724aa791 558sub fmt_line { # generate text-line for op.
cc02ea56
JC
559 my($hr, $op, $text, $level) = @_;
560
561 $_->($hr, $op, \$text, \$level, $stylename) for @callbacks;
562
724aa791 563 return '' if $hr->{SKIP}; # suppress line if a callback said so
cc02ea56 564 return '' if $hr->{goto} and $hr->{goto} eq '-'; # no goto nowhere
f95e3c3c 565
cc02ea56 566 # spec: (?(text1#varText2)?)
c99ca59a 567 $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
f95e3c3c
JC
568 $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
569
cc02ea56 570 # spec: (x(exec_text;basic_text)x)
c99ca59a 571 $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
cc02ea56
JC
572
573 # spec: (*(text)*)
c99ca59a 574 $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
cc02ea56
JC
575
576 # spec: (*(text1;text2)*)
c99ca59a 577 $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
cc02ea56
JC
578
579 # convert #Var to tag=>val form: Var\t#var
580 $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs;
581
582 # spec: #varN
724aa791
JC
583 $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
584
cc02ea56
JC
585 $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg; # populate #var's
586 $text =~ s/[ \t]*~+[ \t]*/ /g; # squeeze tildes
f18deeb9
JC
587
588 $text = "# $hr->{src}\n$text" if $show_src and $hr->{src};
589
f95e3c3c 590 chomp $text;
efef081e 591 return "$text\n" if $text ne "" and $order ne "tree";
f95e3c3c 592 return $text; # suppress empty lines
c99ca59a
SM
593}
594
19e169bf
JC
595our %priv; # used to display each opcode's BASEOP.op_private values
596
c99ca59a 597$priv{$_}{128} = "LVINTRO"
8c1a7e35
DIM
598 for qw(pos substr vec threadsv gvsv rv2sv rv2hv rv2gv rv2av rv2arylen
599 aelem helem aslice hslice padsv padav padhv enteriter entersub
600 padrange pushmark);
601$priv{$_}{64} = "REFC" for qw(leave leavesub leavesublv leavewrite);
a373464f 602$priv{$_}{128} = "LV" for qw(leave leaveloop);
8c1a7e35
DIM
603@{$priv{aassign}}{32,64} = qw(STATE COMMON);
604@{$priv{sassign}}{32,64,128} = qw(STATE BKWARD CV2GV);
605$priv{$_}{64} = "RTIME" for qw(match subst substcont qr);
606@{$priv{$_}}{1,2,4,8,16,64} = qw(<UTF >UTF IDENT SQUASH DEL COMPL GROWS)
607 for qw(trans transr);
608$priv{repeat}{64} = "DOLIST";
609$priv{leaveloop}{64} = "CONT";
8c1a7e35
DIM
610@{$priv{$_}}{32,64,96} = qw(DREFAV DREFHV DREFSV)
611 for qw(rv2gv rv2sv padsv aelem helem);
612$priv{$_}{16} = "STATE" for qw(padav padhv padsv);
613@{$priv{rv2gv}}{4,16} = qw(NOINIT FAKE);
614@{$priv{entersub}}{1,4,16,32,64} = qw(INARGS TARG DBG DEREF);
c2072cec 615@{$priv{rv2cv}}{64,8,128} = qw(CONST AMPER NO());
8c1a7e35
DIM
616$priv{gv}{32} = "EARLYCV";
617$priv{$_}{16} = "LVDEFER" for qw(aelem helem);
618$priv{$_}{16} = "OURINTR" for qw(gvsv rv2sv rv2av rv2hv r2gv enteriter);
619$priv{$_}{8} = "LVSUB"
620 for qw(rv2av rv2gv rv2hv padav padhv aelem helem aslice hslice
621 av2arylen keys rkeys substr pos vec);
95a31aad 622$priv{$_}{4} = "SLICEWARN"
2186f873 623 for qw(rv2hv rv2av padav padhv hslice aslice);
8c1a7e35
DIM
624@{$priv{$_}}{32,64} = qw(BOOL BOOL?) for qw(rv2hv padhv);
625$priv{substr}{16} = "REPL1ST";
c99ca59a 626$priv{$_}{16} = "TARGMY"
8c1a7e35
DIM
627 for map(($_,"s$_"), qw(chop chomp)),
628 map(($_,"i_$_"), qw(postinc postdec multiply divide modulo add
629 subtract negate)),
630 qw(pow concat stringify left_shift right_shift bit_and bit_xor
631 bit_or complement atan2 sin cos rand exp log sqrt int hex oct
632 abs length index rindex sprintf ord chr crypt quotemeta join
633 push unshift flock chdir chown chroot unlink chmod utime rename
634 link symlink mkdir rmdir wait waitpid system exec kill getppid
635 getpgrp setpgrp getpriority setpriority time sleep);
636$priv{$_}{4} = "REVERSED" for qw(enteriter iter);
51bed69a 637@{$priv{const}}{2,4,8,16,64} = qw(NOVER SHORT STRICT ENTERED BARE);
8c1a7e35
DIM
638$priv{$_}{64} = "LINENUM" for qw(flip flop);
639$priv{list}{64} = "GUESSED";
640$priv{delete}{64} = "SLICE";
641$priv{exists}{64} = "SUB";
642@{$priv{sort}}{1,2,4,8,16,32,64} = qw(NUM INT REV INPLACE DESC QSORT STABLE);
643$priv{reverse}{8} = "INPLACE";
644$priv{threadsv}{64} = "SVREFd";
645@{$priv{$_}}{16,32,64,128} = qw(INBIN INCR OUTBIN OUTCR)
646 for qw(open backtick);
400e72c5 647$priv{$_}{32} = "HUSH" for qw(nextstate dbstate);
feaeca78 648$priv{$_}{2} = "FTACCESS"
8c1a7e35
DIM
649 for qw(ftrread ftrwrite ftrexec fteread ftewrite fteexec);
650@{$priv{entereval}}{2,4,8,16} = qw(HAS_HH UNI BYTES COPHH);
651@{$priv{$_}}{4,8,16} = qw(FTSTACKED FTSTACKING FTAFTERt)
652 for qw(ftrread ftrwrite ftrexec fteread ftewrite fteexec ftis fteowned
653 ftrowned ftzero ftsize ftmtime ftatime ftctime ftsock ftchr
654 ftblk ftfile ftdir ftpipe ftlink ftsuid ftsgid ftsvtx fttty
655 fttext ftbinary);
35633035 656$priv{$_}{2} = "GREPLEX"
8c1a7e35
DIM
657 for qw(mapwhile mapstart grepwhile grepstart);
658$priv{$_}{128} = "+1" for qw(caller wantarray runcv);
659@{$priv{coreargs}}{1,2,64,128} = qw(DREF1 DREF2 $MOD MARK);
660$priv{$_}{128} = "UTF" for qw(last redo next goto dump);
661$priv{split}{128} = "IMPLIM";
c99ca59a 662
d5ec2987
NC
663our %hints; # used to display each COP's op_hints values
664
665# strict refs, subs, vars
894ea76b 666@hints{2,512,1024,32,64,128} = ('$', '&', '*', 'x$', 'x&', 'x*');
e1dccc0d
Z
667# integers, locale, bytes
668@hints{1,4,8,16} = ('i', 'l', 'b');
8b850bd5
NC
669# block scope, localise %^H, $^OPEN (in), $^OPEN (out)
670@hints{256,131072,262144,524288} = ('{','%','<','>');
d5ec2987
NC
671# overload new integer, float, binary, string, re
672@hints{4096,8192,16384,32768,65536} = ('I', 'F', 'B', 'S', 'R');
673# taint and eval
674@hints{1048576,2097152} = ('T', 'E');
584420f0
RGS
675# filetest access, UTF-8
676@hints{4194304,8388608} = ('X', 'U');
d5ec2987
NC
677
678sub _flags {
679 my($hash, $x) = @_;
c99ca59a 680 my @s;
d5ec2987
NC
681 for my $flag (sort {$b <=> $a} keys %$hash) {
682 if ($hash->{$flag} and $x & $flag and $x >= $flag) {
c99ca59a 683 $x -= $flag;
d5ec2987 684 push @s, $hash->{$flag};
c99ca59a
SM
685 }
686 }
687 push @s, $x if $x;
688 return join(",", @s);
689}
690
d5ec2987
NC
691sub private_flags {
692 my($name, $x) = @_;
693 _flags($priv{$name}, $x);
694}
695
696sub hints_flags {
697 my($x) = @_;
698 _flags(\%hints, $x);
699}
700
c27ea44e 701sub concise_sv {
2db5ca0a 702 my($sv, $hr, $preferpv) = @_;
c27ea44e 703 $hr->{svclass} = class($sv);
31b49ad4
SM
704 $hr->{svclass} = "UV"
705 if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV;
5b493bdf 706 Carp::cluck("bad concise_sv: $sv") unless $sv and $$sv;
c27ea44e 707 $hr->{svaddr} = sprintf("%#x", $$sv);
50786ba8 708 if ($hr->{svclass} eq "GV" && $sv->isGV_with_GP()) {
c27ea44e 709 my $gv = $sv;
7b696247
FC
710 my $stash = $gv->STASH;
711 if (class($stash) eq "SPECIAL") {
712 $stash = "<none>";
713 }
714 else {
715 $stash = $stash->NAME;
716 }
717 if ($stash eq "main") {
c27ea44e
SM
718 $stash = "";
719 } else {
720 $stash = $stash . "::";
721 }
722 $hr->{svval} = "*$stash" . $gv->SAFENAME;
723 return "*$stash" . $gv->SAFENAME;
724 } else {
4df7f6af
NC
725 if ($] >= 5.011) {
726 while (class($sv) eq "IV" && $sv->FLAGS & SVf_ROK) {
727 $hr->{svval} .= "\\";
728 $sv = $sv->RV;
729 }
730 } else {
731 while (class($sv) eq "RV") {
732 $hr->{svval} .= "\\";
733 $sv = $sv->RV;
734 }
c27ea44e
SM
735 }
736 if (class($sv) eq "SPECIAL") {
40b5b14f 737 $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv];
8d919b0a
FC
738 } elsif ($preferpv
739 && ($sv->FLAGS & SVf_POK || class($sv) eq "REGEXP")) {
2db5ca0a 740 $hr->{svval} .= cstring($sv->PV);
c27ea44e 741 } elsif ($sv->FLAGS & SVf_NOK) {
40b5b14f 742 $hr->{svval} .= $sv->NV;
c27ea44e 743 } elsif ($sv->FLAGS & SVf_IOK) {
31b49ad4 744 $hr->{svval} .= $sv->int_value;
8d919b0a 745 } elsif ($sv->FLAGS & SVf_POK || class($sv) eq "REGEXP") {
40b5b14f 746 $hr->{svval} .= cstring($sv->PV);
31b49ad4
SM
747 } elsif (class($sv) eq "HV") {
748 $hr->{svval} .= 'HASH';
c27ea44e 749 }
cc02ea56
JC
750
751 $hr->{svval} = 'undef' unless defined $hr->{svval};
752 my $out = $hr->{svclass};
753 return $out .= " $hr->{svval}" ;
c27ea44e
SM
754 }
755}
756
f18deeb9
JC
757my %srclines;
758
759sub fill_srclines {
9e0f9750
JC
760 my $fullnm = shift;
761 if ($fullnm eq '-e') {
762 $srclines{$fullnm} = [ $fullnm, "-src not supported for -e" ];
763 return;
6cc5d258 764 }
9e0f9750 765 open (my $fh, '<', $fullnm)
6cc5d258 766 or warn "# $fullnm: $!, (chdirs not supported by this feature yet)\n"
f18deeb9
JC
767 and return;
768 my @l = <$fh>;
769 chomp @l;
9e0f9750
JC
770 unshift @l, $fullnm; # like @{_<$fullnm} in debug, array starts at 1
771 $srclines{$fullnm} = \@l;
f18deeb9
JC
772}
773
c99ca59a
SM
774sub concise_op {
775 my ($op, $level, $format) = @_;
776 my %h;
777 $h{exname} = $h{name} = $op->name;
778 $h{NAME} = uc $h{name};
779 $h{class} = class($op);
780 $h{extarg} = $h{targ} = $op->targ;
781 $h{extarg} = "" unless $h{extarg};
782 if ($h{name} eq "null" and $h{targ}) {
8ec8fbef 783 # targ holds the old type
c99ca59a
SM
784 $h{exname} = "ex-" . substr(ppname($h{targ}), 3);
785 $h{extarg} = "";
8ec8fbef
SM
786 } elsif ($op->name =~ /^leave(sub(lv)?|write)?$/) {
787 # targ potentially holds a reference count
788 if ($op->private & 64) {
789 my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
790 $h{targarglife} = $h{targarg} = "$h{targ} $refs";
791 }
c99ca59a 792 } elsif ($h{targ}) {
a7fd8ef6
DM
793 my $count = $h{name} eq 'padrange' ? ($op->private & 127) : 1;
794 my (@targarg, @targarglife);
795 for my $i (0..$count-1) {
796 my ($targarg, $targarglife);
797 my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}+$i];
798 if (defined $padname and class($padname) ne "SPECIAL") {
799 $targarg = $padname->PVX;
800 if ($padname->FLAGS & SVf_FAKE) {
801 # These changes relate to the jumbo closure fix.
802 # See changes 19939 and 20005
803 my $fake = '';
804 $fake .= 'a'
805 if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_ANON;
806 $fake .= 'm'
807 if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_MULTI;
808 $fake .= ':' . $padname->PARENT_PAD_INDEX
809 if $curcv->CvFLAGS & CVf_ANON;
810 $targarglife = "$targarg:FAKE:$fake";
811 }
812 else {
813 my $intro = $padname->COP_SEQ_RANGE_LOW - $cop_seq_base;
814 my $finish = int($padname->COP_SEQ_RANGE_HIGH) - $cop_seq_base;
815 $finish = "end" if $finish == 999999999 - $cop_seq_base;
816 $targarglife = "$targarg:$intro,$finish";
817 }
818 } else {
819 $targarglife = $targarg = "t" . ($h{targ}+$i);
127212b2 820 }
a7fd8ef6
DM
821 push @targarg, $targarg;
822 push @targarglife, $targarglife;
c99ca59a 823 }
a7fd8ef6
DM
824 $h{targarg} = join '; ', @targarg;
825 $h{targarglife} = join '; ', @targarglife;
c99ca59a
SM
826 }
827 $h{arg} = "";
828 $h{svclass} = $h{svaddr} = $h{svval} = "";
829 if ($h{class} eq "PMOP") {
2721a2ca 830 my $extra = '';
c99ca59a 831 my $precomp = $op->precomp;
7a9b44b9 832 if (defined $precomp) {
c27ea44e
SM
833 $precomp = cstring($precomp); # Escape literal control sequences
834 $precomp = "/$precomp/";
835 } else {
836 $precomp = "";
7a9b44b9 837 }
2721a2ca
DM
838 if ($op->name eq 'subst') {
839 if (class($op->pmreplstart) ne "NULL") {
840 undef $lastnext;
841 $extra = " replstart->" . seq($op->pmreplstart);
842 }
843 }
844 elsif ($op->name eq 'pushre') {
b2a3cfdd 845 # with C<@stash_array = split(/pat/, str);>,
c6e79e55 846 # *stash_array is stored in /pat/'s pmreplroot.
2721a2ca
DM
847 my $gv = $op->pmreplroot;
848 if (!ref($gv)) {
849 # threaded: the value is actually a pad offset for where
850 # the GV is kept (op_pmtargetoff)
851 if ($gv) {
852 $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$gv]->NAME;
853 }
854 }
855 else {
856 # unthreaded: its a GV (if it exists)
857 $gv = (ref($gv) eq "B::GV") ? $gv->NAME : undef;
858 }
859 $extra = " => \@$gv" if $gv;
c99ca59a 860 }
2721a2ca 861 $h{arg} = "($precomp$extra)";
bb16bae8 862 } elsif ($h{class} eq "PVOP" and $h{name} !~ '^transr?\z') {
c99ca59a
SM
863 $h{arg} = '("' . $op->pv . '")';
864 $h{svval} = '"' . $op->pv . '"';
865 } elsif ($h{class} eq "COP") {
866 my $label = $op->label;
c3caa09d 867 $h{coplabel} = $label;
c99ca59a
SM
868 $label = $label ? "$label: " : "";
869 my $loc = $op->file;
9e0f9750 870 my $pathnm = $loc;
c99ca59a 871 $loc =~ s[.*/][];
9e0f9750
JC
872 my $ln = $op->line;
873 $loc .= ":$ln";
c99ca59a 874 my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
e1dccc0d 875 $h{arg} = "($label$stash $cseq $loc)";
f18deeb9 876 if ($show_src) {
9e0f9750 877 fill_srclines($pathnm) unless exists $srclines{$pathnm};
e9c69003
NC
878 # Would love to retain Jim's use of // but this code needs to be
879 # portable to 5.8.x
880 my $line = $srclines{$pathnm}[$ln];
881 $line = "-src unavailable under -e" unless defined $line;
882 $h{src} = "$ln: $line";
f18deeb9 883 }
c99ca59a
SM
884 } elsif ($h{class} eq "LOOP") {
885 $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
886 . " redo->" . seq($op->redoop) . ")";
887 } elsif ($h{class} eq "LOGOP") {
888 undef $lastnext;
889 $h{arg} = "(other->" . seq($op->other) . ")";
a854082c 890 $h{otheraddr} = sprintf("%#x", $ {$op->other});
5b493bdf
JC
891 }
892 elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") {
6a077020 893 unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
5b493bdf 894 my $idx = ($h{class} eq "SVOP") ? $op->targ : $op->padix;
2db5ca0a 895 my $preferpv = $h{name} eq "method_named";
5b493bdf
JC
896 if ($h{class} eq "PADOP" or !${$op->sv}) {
897 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$idx];
2db5ca0a 898 $h{arg} = "[" . concise_sv($sv, \%h, $preferpv) . "]";
6a077020
DM
899 $h{targarglife} = $h{targarg} = "";
900 } else {
2db5ca0a 901 $h{arg} = "(" . concise_sv($op->sv, \%h, $preferpv) . ")";
6a077020 902 }
c99ca59a
SM
903 }
904 }
905 $h{seq} = $h{hyphseq} = seq($op);
906 $h{seq} = "" if $h{seq} eq "-";
35633035
DM
907 $h{opt} = $op->opt;
908 $h{label} = $labels{$$op};
c99ca59a
SM
909 $h{next} = $op->next;
910 $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
911 $h{nextaddr} = sprintf("%#x", $ {$op->next});
912 $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
913 $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
914 $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
915
916 $h{classsym} = $opclass{$h{class}};
917 $h{flagval} = $op->flags;
918 $h{flags} = op_flags($op->flags);
919 $h{privval} = $op->private;
920 $h{private} = private_flags($h{name}, $op->private);
51bed69a
FC
921 if ($op->folded) {
922 $h{private} &&= "$h{private},";
923 $h{private} .= "FOLD";
924 }
d5ec2987
NC
925 if ($op->can("hints")) {
926 $h{hintsval} = $op->hints;
927 $h{hints} = hints_flags($h{hintsval});
928 } else {
929 $h{hintsval} = $h{hints} = '';
930 }
c99ca59a 931 $h{addr} = sprintf("%#x", $$op);
c99ca59a
SM
932 $h{typenum} = $op->type;
933 $h{noise} = $linenoise[$op->type];
f95e3c3c 934
cc02ea56 935 return fmt_line(\%h, $op, $format, $level);
c99ca59a
SM
936}
937
938sub B::OP::concise {
939 my($op, $level) = @_;
940 if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
724aa791 941 # insert a 'goto' line
cc02ea56
JC
942 my $synth = {"seq" => seq($lastnext), "class" => class($lastnext),
943 "addr" => sprintf("%#x", $$lastnext),
944 "goto" => seq($lastnext), # simplify goto '-' removal
945 };
946 print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
c99ca59a
SM
947 }
948 $lastnext = $op->next;
f95e3c3c 949 print $walkHandle concise_op($op, $level, $format);
c99ca59a
SM
950}
951
31b49ad4
SM
952# B::OP::terse (see Terse.pm) now just calls this
953sub b_terse {
954 my($op, $level) = @_;
955
956 # This isn't necessarily right, but there's no easy way to get
957 # from an OP to the right CV. This is a limitation of the
958 # ->terse() interface style, and there isn't much to do about
959 # it. In particular, we can die in concise_op if the main pad
960 # isn't long enough, or has the wrong kind of entries, compared to
961 # the pad a sub was compiled with. The fix for that would be to
962 # make a backwards compatible "terse" format that never even
963 # looked at the pad, just like the old B::Terse. I don't think
964 # that's worth the effort, though.
965 $curcv = main_cv unless $curcv;
966
967 if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
724aa791 968 # insert a 'goto'
31b49ad4
SM
969 my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
970 "addr" => sprintf("%#x", $$lastnext)};
cc02ea56
JC
971 print # $walkHandle
972 fmt_line($h, $op, $style{"terse"}[1], $level+1);
31b49ad4
SM
973 }
974 $lastnext = $op->next;
cc02ea56
JC
975 print # $walkHandle
976 concise_op($op, $level, $style{"terse"}[0]);
31b49ad4
SM
977}
978
c99ca59a
SM
979sub tree {
980 my $op = shift;
981 my $level = shift;
982 my $style = $tree_decorations[$tree_style];
983 my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
984 my $name = concise_op($op, $level, $treefmt);
985 if (not $op->flags & OPf_KIDS) {
986 return $name . "\n";
987 }
988 my @lines;
989 for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
990 push @lines, tree($kid, $level+1);
991 }
992 my $i;
993 for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
994 $lines[$i] = $space . $lines[$i];
995 }
996 if ($i > 0) {
997 $lines[$i] = $last . $lines[$i];
998 while ($i-- > 1) {
999 if (substr($lines[$i], 0, 1) eq " ") {
1000 $lines[$i] = $nokid . $lines[$i];
1001 } else {
f95e3c3c 1002 $lines[$i] = $kid . $lines[$i];
c99ca59a
SM
1003 }
1004 }
1005 $lines[$i] = $kids . $lines[$i];
1006 } else {
1007 $lines[0] = $single . $lines[0];
1008 }
1009 return("$name$lead" . shift @lines,
1010 map(" " x (length($name)+$size) . $_, @lines));
1011}
1012
213a1a26
SM
1013# *** Warning: fragile kludge ahead ***
1014# Because the B::* modules run in the same interpreter as the code
2814eb74
PJ
1015# they're compiling, their presence tends to distort the view we have of
1016# the code we're looking at. In particular, perl gives sequence numbers
1017# to COPs. If the program we're looking at were run on its own, this
1018# would start at 1. Because all of B::Concise and all the modules it
1019# uses are compiled first, though, by the time we get to the user's
1020# program the sequence number is already pretty high, which could be
1021# distracting if you're trying to tell OPs apart. Therefore we'd like to
1022# subtract an offset from all the sequence numbers we display, to
1023# restore the simpler view of the world. The trick is to know what that
1024# offset will be, when we're still compiling B::Concise! If we
213a1a26 1025# hardcoded a value, it would have to change every time B::Concise or
2814eb74
PJ
1026# other modules we use do. To help a little, what we do here is compile
1027# a little code at the end of the module, and compute the base sequence
1028# number for the user's program as being a small offset later, so all we
1029# have to worry about are changes in the offset.
7252851f
NC
1030
1031# [For 5.8.x and earlier perl is generating sequence numbers for all ops,
1032# and using them to reference labels]
1033
1034
213a1a26
SM
1035# When you say "perl -MO=Concise -e '$a'", the output should look like:
1036
1037# 4 <@> leave[t1] vKP/REFC ->(end)
1038# 1 <0> enter ->2
1039 #^ smallest OP sequence number should be 1
1040# 2 <;> nextstate(main 1 -e:1) v ->3
1041 # ^ smallest COP sequence number should be 1
1042# - <1> ex-rv2sv vK/1 ->4
1043# 3 <$> gvsv(*a) s ->4
1044
c27ea44e
SM
1045# If the second of the marked numbers there isn't 1, it means you need
1046# to update the corresponding magic number in the next line.
1047# Remember, this needs to stay the last things in the module.
e69a2255 1048
c27ea44e 1049# Why is this different for MacOS? Does it matter?
8ec8fbef 1050my $cop_seq_mnum = $^O eq 'MacOS' ? 12 : 11;
e69a2255 1051$cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum;
c99ca59a
SM
1052
10531;
1054
1055__END__
1056
1057=head1 NAME
1058
1059B::Concise - Walk Perl syntax tree, printing concise info about ops
1060
1061=head1 SYNOPSIS
1062
1063 perl -MO=Concise[,OPTIONS] foo.pl
1064
78ad9108
PJ
1065 use B::Concise qw(set_style add_callback);
1066
c99ca59a
SM
1067=head1 DESCRIPTION
1068
1069This compiler backend prints the internal OPs of a Perl program's syntax
1070tree in one of several space-efficient text formats suitable for debugging
1071the inner workings of perl or other compiler backends. It can print OPs in
1072the order they appear in the OP tree, in the order they will execute, or
1073in a text approximation to their tree structure, and the format of the
3c4b39be 1074information displayed is customizable. Its function is similar to that of
c99ca59a
SM
1075perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
1076sophisticated and flexible.
1077
f8a679e6
RGS
1078=head1 EXAMPLE
1079
f9f861ec
JC
1080Here's two outputs (or 'renderings'), using the -exec and -basic
1081(i.e. default) formatting conventions on the same code snippet.
19e169bf
JC
1082
1083 % perl -MO=Concise,-exec -e '$a = $b + 42'
1084 1 <0> enter
1085 2 <;> nextstate(main 1 -e:1) v
1086 3 <#> gvsv[*b] s
1087 4 <$> const[IV 42] s
1088 * 5 <2> add[t3] sK/2
1089 6 <#> gvsv[*a] s
1090 7 <2> sassign vKS/2
1091 8 <@> leave[1 ref] vKP/REFC
1092
f9f861ec
JC
1093In this -exec rendering, each opcode is executed in the order shown.
1094The add opcode, marked with '*', is discussed in more detail.
19e169bf
JC
1095
1096The 1st column is the op's sequence number, starting at 1, and is
f9f861ec
JC
1097displayed in base 36 by default. Here they're purely linear; the
1098sequences are very helpful when looking at code with loops and
1099branches.
19e169bf
JC
1100
1101The symbol between angle brackets indicates the op's type, for
1102example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is
1103used in threaded perls. (see L</"OP class abbreviations">).
1104
f9f861ec 1105The opname, as in B<'add[t1]'>, may be followed by op-specific
19e169bf
JC
1106information in parentheses or brackets (ex B<'[t1]'>).
1107
f9f861ec 1108The op-flags (ex B<'sK/2'>) are described in (L</"OP flags
19e169bf 1109abbreviations">).
f8a679e6
RGS
1110
1111 % perl -MO=Concise -e '$a = $b + 42'
8ec8fbef 1112 8 <@> leave[1 ref] vKP/REFC ->(end)
f8a679e6
RGS
1113 1 <0> enter ->2
1114 2 <;> nextstate(main 1 -e:1) v ->3
1115 7 <2> sassign vKS/2 ->8
19e169bf 1116 * 5 <2> add[t1] sK/2 ->6
f8a679e6
RGS
1117 - <1> ex-rv2sv sK/1 ->4
1118 3 <$> gvsv(*b) s ->4
1119 4 <$> const(IV 42) s ->5
1120 - <1> ex-rv2sv sKRM*/1 ->7
1121 6 <$> gvsv(*a) s ->7
1122
19e169bf
JC
1123The default rendering is top-down, so they're not in execution order.
1124This form reflects the way the stack is used to parse and evaluate
1125expressions; the add operates on the two terms below it in the tree.
f8a679e6 1126
19e169bf
JC
1127Nullops appear as C<ex-opname>, where I<opname> is an op that has been
1128optimized away by perl. They're displayed with a sequence-number of
1129'-', because they are not executed (they don't appear in previous
1130example), they're printed here because they reflect the parse.
f8a679e6 1131
19e169bf
JC
1132The arrow points to the sequence number of the next op; they're not
1133displayed in -exec mode, for obvious reasons.
f8a679e6 1134
19e169bf
JC
1135Note that because this rendering was done on a non-threaded perl, the
1136PADOPs in the previous examples are now SVOPs, and some (but not all)
1137of the square brackets have been replaced by round ones. This is a
1138subtle feature to provide some visual distinction between renderings
1139on threaded and un-threaded perls.
f8a679e6 1140
f8a679e6 1141
c99ca59a
SM
1142=head1 OPTIONS
1143
1144Arguments that don't start with a hyphen are taken to be the names of
710ba574
FC
1145subroutines or formats to render; if no
1146such functions are specified, the main
9e0f9750
JC
1147body of the program (outside any subroutines, and not including use'd
1148or require'd files) is rendered. Passing C<BEGIN>, C<UNITCHECK>,
1149C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding
1150special blocks to be printed. Arguments must follow options.
c99ca59a 1151
724aa791
JC
1152Options affect how things are rendered (ie printed). They're presented
1153here by their visual effect, 1st being strongest. They're grouped
1154according to how they interrelate; within each group the options are
1155mutually exclusive (unless otherwise stated).
1156
1157=head2 Options for Opcode Ordering
1158
1159These options control the 'vertical display' of opcodes. The display
1160'order' is also called 'mode' elsewhere in this document.
1161
c99ca59a
SM
1162=over 4
1163
1164=item B<-basic>
1165
1166Print OPs in the order they appear in the OP tree (a preorder
1167traversal, starting at the root). The indentation of each OP shows its
19e169bf
JC
1168level in the tree, and the '->' at the end of the line indicates the
1169next opcode in execution order. This mode is the default, so the flag
1170is included simply for completeness.
c99ca59a
SM
1171
1172=item B<-exec>
1173
1174Print OPs in the order they would normally execute (for the majority
1175of constructs this is a postorder traversal of the tree, ending at the
1176root). In most cases the OP that usually follows a given OP will
1177appear directly below it; alternate paths are shown by indentation. In
1178cases like loops when control jumps out of a linear path, a 'goto'
1179line is generated.
1180
1181=item B<-tree>
1182
1183Print OPs in a text approximation of a tree, with the root of the tree
1184at the left and 'left-to-right' order of children transformed into
1185'top-to-bottom'. Because this mode grows both to the right and down,
1186it isn't suitable for large programs (unless you have a very wide
1187terminal).
1188
724aa791
JC
1189=back
1190
1191=head2 Options for Line-Style
1192
1193These options select the line-style (or just style) used to render
1194each opcode, and dictates what info is actually printed into each line.
1195
1196=over 4
1197
1198=item B<-concise>
1199
1200Use the author's favorite set of formatting conventions. This is the
1201default, of course.
1202
1203=item B<-terse>
1204
1205Use formatting conventions that emulate the output of B<B::Terse>. The
1206basic mode is almost indistinguishable from the real B<B::Terse>, and the
1207exec mode looks very similar, but is in a more logical order and lacks
1208curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
1209is only vaguely reminiscent of B<B::Terse>.
1210
1211=item B<-linenoise>
1212
1213Use formatting conventions in which the name of each OP, rather than being
1214written out in full, is represented by a one- or two-character abbreviation.
1215This is mainly a joke.
1216
1217=item B<-debug>
1218
1219Use formatting conventions reminiscent of B<B::Debug>; these aren't
1220very concise at all.
1221
1222=item B<-env>
1223
1224Use formatting conventions read from the environment variables
1225C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
1226
1227=back
1228
1229=head2 Options for tree-specific formatting
1230
1231=over 4
1232
c99ca59a
SM
1233=item B<-compact>
1234
1235Use a tree format in which the minimum amount of space is used for the
1236lines connecting nodes (one character in most cases). This squeezes out
1237a few precious columns of screen real estate.
1238
1239=item B<-loose>
1240
1241Use a tree format that uses longer edges to separate OP nodes. This format
1242tends to look better than the compact one, especially in ASCII, and is
1243the default.
1244
1245=item B<-vt>
1246
1247Use tree connecting characters drawn from the VT100 line-drawing set.
1248This looks better if your terminal supports it.
1249
1250=item B<-ascii>
1251
1252Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
1253look as clean as the VT100 characters, but they'll work with almost any
1254terminal (or the horizontal scrolling mode of less(1)) and are suitable
1255for text documentation or email. This is the default.
1256
724aa791 1257=back
c99ca59a 1258
724aa791
JC
1259These are pairwise exclusive, i.e. compact or loose, vt or ascii.
1260
1261=head2 Options controlling sequence numbering
1262
1263=over 4
c99ca59a
SM
1264
1265=item B<-base>I<n>
1266
1267Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
1268digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
1269for 37 will be 'A', and so on until 62. Values greater than 62 are not
1270currently supported. The default is 36.
1271
1272=item B<-bigendian>
1273
1274Print sequence numbers with the most significant digit first. This is the
1275usual convention for Arabic numerals, and the default.
1276
1277=item B<-littleendian>
1278
1c2e8cca 1279Print sequence numbers with the least significant digit first. This is
724aa791 1280obviously mutually exclusive with bigendian.
c99ca59a 1281
724aa791 1282=back
c99ca59a 1283
724aa791 1284=head2 Other options
c99ca59a 1285
f18deeb9
JC
1286=over 4
1287
1288=item B<-src>
1289
e6665613
JC
1290With this option, the rendering of each statement (starting with the
1291nextstate OP) will be preceded by the 1st line of source code that
1292generates it. For example:
f18deeb9
JC
1293
1294 1 <0> enter
1295 # 1: my $i;
1296 2 <;> nextstate(main 1 junk.pl:1) v:{
1297 3 <0> padsv[$i:1,10] vM/LVINTRO
1298 # 3: for $i (0..9) {
1299 4 <;> nextstate(main 3 junk.pl:3) v:{
1300 5 <0> pushmark s
1301 6 <$> const[IV 0] s
1302 7 <$> const[IV 9] s
1303 8 <{> enteriter(next->j last->m redo->9)[$i:1,10] lKS
1304 k <0> iter s
1305 l <|> and(other->9) vK/1
1306 # 4: print "line ";
1307 9 <;> nextstate(main 2 junk.pl:4) v
1308 a <0> pushmark s
1309 b <$> const[PV "line "] s
1310 c <@> print vK
1311 # 5: print "$i\n";
e6665613 1312 ...
f18deeb9 1313
9e0f9750
JC
1314=item B<-stash="somepackage">
1315
1316With this, "somepackage" will be required, then the stash is
1317inspected, and each function is rendered.
1318
f18deeb9
JC
1319=back
1320
1321The following options are pairwise exclusive.
cc02ea56 1322
724aa791 1323=over 4
c99ca59a 1324
724aa791 1325=item B<-main>
c99ca59a 1326
724aa791 1327Include the main program in the output, even if subroutines were also
cc02ea56
JC
1328specified. This rendering is normally suppressed when a subroutine
1329name or reference is given.
1330
1331=item B<-nomain>
1332
1333This restores the default behavior after you've changed it with '-main'
1334(it's not normally needed). If no subroutine name/ref is given, main is
1335rendered, regardless of this flag.
1336
1337=item B<-nobanner>
1338
1339Renderings usually include a banner line identifying the function name
1340or stringified subref. This suppresses the printing of the banner.
1341
1342TBC: Remove the stringified coderef; while it provides a 'cookie' for
1343each function rendered, the cookies used should be 1,2,3.. not a
1344random hex-address. It also complicates string comparison of two
1345different trees.
c99ca59a 1346
724aa791 1347=item B<-banner>
c99ca59a 1348
cc02ea56
JC
1349restores default banner behavior.
1350
1351=item B<-banneris> => subref
1352
1353TBC: a hookpoint (and an option to set it) for a user-supplied
1354function to produce a banner appropriate for users needs. It's not
1355ideal, because the rendering-state variables, which are a natural
1356candidate for use in concise.t, are unavailable to the user.
c99ca59a 1357
724aa791 1358=back
c99ca59a 1359
724aa791 1360=head2 Option Stickiness
c99ca59a 1361
724aa791
JC
1362If you invoke Concise more than once in a program, you should know that
1363the options are 'sticky'. This means that the options you provide in
1364the first call will be remembered for the 2nd call, unless you
1365re-specify or change them.
c99ca59a 1366
cc02ea56
JC
1367=head1 ABBREVIATIONS
1368
1369The concise style uses symbols to convey maximum info with minimal
1370clutter (like hex addresses). With just a little practice, you can
1371start to see the flowers, not just the branches, in the trees.
1372
1373=head2 OP class abbreviations
1374
1375These symbols appear before the op-name, and indicate the
1376B:: namespace that represents the ops in your Perl code.
1377
1378 0 OP (aka BASEOP) An OP with no children
1379 1 UNOP An OP with one child
1380 2 BINOP An OP with two children
1381 | LOGOP A control branch OP
1382 @ LISTOP An OP that could have lots of children
1383 / PMOP An OP with a regular expression
1384 $ SVOP An OP with an SV
1385 " PVOP An OP with a string
1386 { LOOP An OP that holds pointers for a loop
1387 ; COP An OP that marks the start of a statement
1388 # PADOP An OP with a GV on the pad
1389
1390=head2 OP flags abbreviations
1391
19e169bf
JC
1392OP flags are either public or private. The public flags alter the
1393behavior of each opcode in consistent ways, and are represented by 0
1394or more single characters.
cc02ea56
JC
1395
1396 v OPf_WANT_VOID Want nothing (void context)
1397 s OPf_WANT_SCALAR Want single value (scalar context)
1398 l OPf_WANT_LIST Want list of any length (list context)
19e169bf 1399 Want is unknown
cc02ea56
JC
1400 K OPf_KIDS There is a firstborn child.
1401 P OPf_PARENS This operator was parenthesized.
1402 (Or block needs explicit scope entry.)
1403 R OPf_REF Certified reference.
1404 (Return container, not containee).
1405 M OPf_MOD Will modify (lvalue).
1406 S OPf_STACKED Some arg is arriving on the stack.
1407 * OPf_SPECIAL Do something weird for this op (see op.h)
1408
19e169bf
JC
1409Private flags, if any are set for an opcode, are displayed after a '/'
1410
1411 8 <@> leave[1 ref] vKP/REFC ->(end)
1412 7 <2> sassign vKS/2 ->8
1413
1414They're opcode specific, and occur less often than the public ones, so
1415they're represented by short mnemonics instead of single-chars; see
00baac8f 1416F<op.h> for gory details, or try this quick 2-liner:
19e169bf
JC
1417
1418 $> perl -MB::Concise -de 1
1419 DB<1> |x \%B::Concise::priv
1420
c99ca59a
SM
1421=head1 FORMATTING SPECIFICATIONS
1422
724aa791
JC
1423For each line-style ('concise', 'terse', 'linenoise', etc.) there are
14243 format-specs which control how OPs are rendered.
1425
1426The first is the 'default' format, which is used in both basic and exec
1427modes to print all opcodes. The 2nd, goto-format, is used in exec
1428mode when branches are encountered. They're not real opcodes, and are
1429inserted to look like a closing curly brace. The tree-format is tree
1430specific.
1431
cc02ea56
JC
1432When a line is rendered, the correct format-spec is copied and scanned
1433for the following items; data is substituted in, and other
1434manipulations like basic indenting are done, for each opcode rendered.
1435
1436There are 3 kinds of items that may be populated; special patterns,
1437#vars, and literal text, which is copied verbatim. (Yes, it's a set
1438of s///g steps.)
1439
1440=head2 Special Patterns
1441
1442These items are the primitives used to perform indenting, and to
1443select text from amongst alternatives.
c99ca59a
SM
1444
1445=over 4
1446
1447=item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
1448
1449Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
1450
1451=item B<(*(>I<text>B<)*)>
1452
1453Generates one copy of I<text> for each indentation level.
1454
1455=item B<(*(>I<text1>B<;>I<text2>B<)*)>
1456
1457Generates one fewer copies of I<text1> than the indentation level, followed
1458by one copy of I<text2> if the indentation level is more than 0.
1459
1460=item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
1461
1462If the value of I<var> is true (not empty or zero), generates the
1463value of I<var> surrounded by I<text1> and I<Text2>, otherwise
1464nothing.
1465
cc02ea56
JC
1466=item B<~>
1467
1468Any number of tildes and surrounding whitespace will be collapsed to
1469a single space.
1470
1471=back
1472
1473=head2 # Variables
1474
1475These #vars represent opcode properties that you may want as part of
1476your rendering. The '#' is intended as a private sigil; a #var's
1477value is interpolated into the style-line, much like "read $this".
1478
1479These vars take 3 forms:
1480
1481=over 4
1482
c99ca59a
SM
1483=item B<#>I<var>
1484
cc02ea56
JC
1485A property named 'var' is assumed to exist for the opcodes, and is
1486interpolated into the rendering.
c99ca59a
SM
1487
1488=item B<#>I<var>I<N>
1489
cc02ea56
JC
1490Generates the value of I<var>, left justified to fill I<N> spaces.
1491Note that this means while you can have properties 'foo' and 'foo2',
1492you cannot render 'foo2', but you could with 'foo2a'. You would be
1493wise not to rely on this behavior going forward ;-)
c99ca59a 1494
cc02ea56 1495=item B<#>I<Var>
c99ca59a 1496
cc02ea56
JC
1497This ucfirst form of #var generates a tag-value form of itself for
1498display; it converts '#Var' into a 'Var => #var' style, which is then
1499handled as described above. (Imp-note: #Vars cannot be used for
1500conditional-fills, because the => #var transform is done after the check
1501for #Var's value).
c99ca59a
SM
1502
1503=back
1504
cc02ea56
JC
1505The following variables are 'defined' by B::Concise; when they are
1506used in a style, their respective values are plugged into the
1507rendering of each opcode.
1508
1509Only some of these are used by the standard styles, the others are
1510provided for you to delve into optree mechanics, should you wish to
1511add a new style (see L</add_style> below) that uses them. You can
00baac8f 1512also add new ones using L</add_callback>.
c99ca59a
SM
1513
1514=over 4
1515
1516=item B<#addr>
1517
cc02ea56 1518The address of the OP, in hexadecimal.
c99ca59a
SM
1519
1520=item B<#arg>
1521
1522The OP-specific information of the OP (such as the SV for an SVOP, the
cc02ea56 1523non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
c99ca59a
SM
1524
1525=item B<#class>
1526
1527The B-determined class of the OP, in all caps.
1528
f8a679e6 1529=item B<#classsym>
c99ca59a
SM
1530
1531A single symbol abbreviating the class of the OP.
1532
c3caa09d
SM
1533=item B<#coplabel>
1534
1535The label of the statement or block the OP is the start of, if any.
1536
c99ca59a
SM
1537=item B<#exname>
1538
1539The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
1540
1541=item B<#extarg>
1542
1543The target of the OP, or nothing for a nulled OP.
1544
1545=item B<#firstaddr>
1546
19e169bf 1547The address of the OP's first child, in hexadecimal.
c99ca59a
SM
1548
1549=item B<#flags>
1550
1551The OP's flags, abbreviated as a series of symbols.
1552
1553=item B<#flagval>
1554
1555The numeric value of the OP's flags.
1556
d5ec2987
NC
1557=item B<#hints>
1558
1559The COP's hint flags, rendered with abbreviated names if possible. An empty
4f948f3a
RGS
1560string if this is not a COP. Here are the symbols used:
1561
1562 $ strict refs
1563 & strict subs
1564 * strict vars
d1718a7c
FC
1565 x$ explicit use/no strict refs
1566 x& explicit use/no strict subs
1567 x* explicit use/no strict vars
4f948f3a
RGS
1568 i integers
1569 l locale
1570 b bytes
4f948f3a
RGS
1571 { block scope
1572 % localise %^H
1573 < open in
1574 > open out
1575 I overload int
1576 F overload float
1577 B overload binary
1578 S overload string
1579 R overload re
1580 T taint
1581 E eval
1582 X filetest access
1583 U utf-8
d5ec2987
NC
1584
1585=item B<#hintsval>
1586
1587The numeric value of the COP's hint flags, or an empty string if this is not
1588a COP.
1589
f8a679e6 1590=item B<#hyphseq>
c99ca59a
SM
1591
1592The sequence number of the OP, or a hyphen if it doesn't have one.
1593
1594=item B<#label>
1595
1596'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
1597mode, or empty otherwise.
1598
1599=item B<#lastaddr>
1600
19e169bf 1601The address of the OP's last child, in hexadecimal.
c99ca59a
SM
1602
1603=item B<#name>
1604
1605The OP's name.
1606
1607=item B<#NAME>
1608
1609The OP's name, in all caps.
1610
1611=item B<#next>
1612
1613The sequence number of the OP's next OP.
1614
1615=item B<#nextaddr>
1616
19e169bf 1617The address of the OP's next OP, in hexadecimal.
c99ca59a
SM
1618
1619=item B<#noise>
1620
c27ea44e 1621A one- or two-character abbreviation for the OP's name.
c99ca59a
SM
1622
1623=item B<#private>
1624
1625The OP's private flags, rendered with abbreviated names if possible.
1626
1627=item B<#privval>
1628
1629The numeric value of the OP's private flags.
1630
1631=item B<#seq>
1632
2814eb74
PJ
1633The sequence number of the OP. Note that this is a sequence number
1634generated by B::Concise.
c99ca59a 1635
7252851f
NC
1636=item B<#seqnum>
1637
16385.8.x and earlier only. 5.9 and later do not provide this.
1639
1640The real sequence number of the OP, as a regular number and not adjusted
1641to be relative to the start of the real program. (This will generally be
1642a fairly large number because all of B<B::Concise> is compiled before
1643your program is).
1644
2814eb74 1645=item B<#opt>
c99ca59a 1646
b84c7839 1647Whether or not the op has been optimized by the peephole optimizer.
2814eb74 1648
7252851f
NC
1649Only available in 5.9 and later.
1650
c99ca59a
SM
1651=item B<#sibaddr>
1652
19e169bf 1653The address of the OP's next youngest sibling, in hexadecimal.
c99ca59a
SM
1654
1655=item B<#svaddr>
1656
19e169bf 1657The address of the OP's SV, if it has an SV, in hexadecimal.
c99ca59a
SM
1658
1659=item B<#svclass>
1660
1661The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
1662
1663=item B<#svval>
1664
1665The value of the OP's SV, if it has one, in a short human-readable format.
1666
1667=item B<#targ>
1668
1669The numeric value of the OP's targ.
1670
1671=item B<#targarg>
1672
1673The name of the variable the OP's targ refers to, if any, otherwise the
1674letter t followed by the OP's targ in decimal.
1675
1676=item B<#targarglife>
1677
1678Same as B<#targarg>, but followed by the COP sequence numbers that delimit
1679the variable's lifetime (or 'end' for a variable in an open scope) for a
1680variable.
1681
1682=item B<#typenum>
1683
1684The numeric value of the OP's type, in decimal.
1685
1686=back
1687
f9f861ec
JC
1688=head1 One-Liner Command tips
1689
1690=over 4
1691
1692=item perl -MO=Concise,bar foo.pl
1693
1694Renders only bar() from foo.pl. To see main, drop the ',bar'. To see
1695both, add ',-main'
1696
1697=item perl -MDigest::MD5=md5 -MO=Concise,md5 -e1
1698
1699Identifies md5 as an XS function. The export is needed so that BC can
1700find it in main.
1701
1702=item perl -MPOSIX -MO=Concise,_POSIX_ARG_MAX -e1
1703
1704Identifies _POSIX_ARG_MAX as a constant sub, optimized to an IV.
1705Although POSIX isn't entirely consistent across platforms, this is
1706likely to be present in virtually all of them.
1707
1708=item perl -MPOSIX -MO=Concise,a -e 'print _POSIX_SAVED_IDS'
1709
1710This renders a print statement, which includes a call to the function.
1711It's identical to rendering a file with a use call and that single
1712statement, except for the filename which appears in the nextstate ops.
1713
1714=item perl -MPOSIX -MO=Concise,a -e 'sub a{_POSIX_SAVED_IDS}'
1715
1716This is B<very> similar to previous, only the first two ops differ. This
1717subroutine rendering is more representative, insofar as a single main
1718program will have many subs.
1719
6cc5d258
JC
1720=item perl -MB::Concise -e 'B::Concise::compile("-exec","-src", \%B::Concise::)->()'
1721
1722This renders all functions in the B::Concise package with the source
1723lines. It eschews the O framework so that the stashref can be passed
9e0f9750
JC
1724directly to B::Concise::compile(). See -stash option for a more
1725convenient way to render a package.
f9f861ec 1726
d5e42f17 1727=back
f9f861ec 1728
78ad9108
PJ
1729=head1 Using B::Concise outside of the O framework
1730
cc02ea56
JC
1731The common (and original) usage of B::Concise was for command-line
1732renderings of simple code, as given in EXAMPLE. But you can also use
1733B<B::Concise> from your code, and call compile() directly, and
724aa791 1734repeatedly. By doing so, you can avoid the compile-time only
cc02ea56
JC
1735operation of O.pm, and even use the debugger to step through
1736B::Concise::compile() itself.
f95e3c3c 1737
cc02ea56
JC
1738Once you're doing this, you may alter Concise output by adding new
1739rendering styles, and by optionally adding callback routines which
1740populate new variables, if such were referenced from those (just
1741added) styles.
f95e3c3c 1742
724aa791 1743=head2 Example: Altering Concise Renderings
78ad9108
PJ
1744
1745 use B::Concise qw(set_style add_callback);
cc02ea56 1746 add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
78ad9108 1747 add_callback
f95e3c3c
JC
1748 ( sub {
1749 my ($h, $op, $format, $level, $stylename) = @_;
78ad9108 1750 $h->{variable} = some_func($op);
cc02ea56
JC
1751 });
1752 $walker = B::Concise::compile(@options,@subnames,@subrefs);
1753 $walker->();
78ad9108 1754
f95e3c3c
JC
1755=head2 set_style()
1756
724aa791
JC
1757B<set_style> accepts 3 arguments, and updates the three format-specs
1758comprising a line-style (basic-exec, goto, tree). It has one minor
1759drawback though; it doesn't register the style under a new name. This
1760can become an issue if you render more than once and switch styles.
1761Thus you may prefer to use add_style() and/or set_style_standard()
1762instead.
1763
1764=head2 set_style_standard($name)
1765
1766This restores one of the standard line-styles: C<terse>, C<concise>,
1767C<linenoise>, C<debug>, C<env>, into effect. It also accepts style
1768names previously defined with add_style().
f95e3c3c 1769
345e2394 1770=head2 add_style ()
78ad9108 1771
f95e3c3c
JC
1772This subroutine accepts a new style name and three style arguments as
1773above, and creates, registers, and selects the newly named style. It is
1774an error to re-add a style; call set_style_standard() to switch between
1775several styles.
1776
345e2394 1777=head2 add_callback ()
f95e3c3c 1778
19e169bf
JC
1779If your newly minted styles refer to any new #variables, you'll need
1780to define a callback subroutine that will populate (or modify) those
1781variables. They are then available for use in the style you've
1782chosen.
f95e3c3c
JC
1783
1784The callbacks are called for each opcode visited by Concise, in the
1785same order as they are added. Each subroutine is passed five
1786parameters.
1787
1788 1. A hashref, containing the variable names and values which are
1789 populated into the report-line for the op
1790 2. the op, as a B<B::OP> object
1791 3. a reference to the format string
1792 4. the formatting (indent) level
1793 5. the selected stylename
78ad9108
PJ
1794
1795To define your own variables, simply add them to the hash, or change
1796existing values if you need to. The level and format are passed in as
1797references to scalars, but it is unlikely that they will need to be
1798changed or even used.
1799
724aa791 1800=head2 Running B::Concise::compile()
f95e3c3c
JC
1801
1802B<compile> accepts options as described above in L</OPTIONS>, and
1803arguments, which are either coderefs, or subroutine names.
1804
cc02ea56
JC
1805It constructs and returns a $treewalker coderef, which when invoked,
1806traverses, or walks, and renders the optrees of the given arguments to
1807STDOUT. You can reuse this, and can change the rendering style used
1808each time; thereafter the coderef renders in the new style.
f95e3c3c
JC
1809
1810B<walk_output> lets you change the print destination from STDOUT to
19e169bf
JC
1811another open filehandle, or into a string passed as a ref (unless
1812you've built perl with -Uuseperlio).
f95e3c3c 1813
555bd962
BG
1814 my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1
1815 walk_output(\my $buf);
1816 $walker->(); # 1 renders -terse
1817 set_style_standard('concise'); # 2
1818 $walker->(); # 2 renders -concise
1819 $walker->(@new); # 3 renders whatever
1820 print "3 different renderings: terse, concise, and @new: $buf\n";
cc02ea56
JC
1821
1822When $walker is called, it traverses the subroutines supplied when it
1823was created, and renders them using the current style. You can change
1824the style afterwards in several different ways:
1825
1826 1. call C<compile>, altering style or mode/order
1827 2. call C<set_style_standard>
1828 3. call $walker, passing @new options
1829
1830Passing new options to the $walker is the easiest way to change
1831amongst any pre-defined styles (the ones you add are automatically
1832recognized as options), and is the only way to alter rendering order
1833without calling compile again. Note however that rendering state is
1834still shared amongst multiple $walker objects, so they must still be
1835used in a coordinated manner.
f95e3c3c
JC
1836
1837=head2 B::Concise::reset_sequence()
1838
1839This function (not exported) lets you reset the sequence numbers (note
1840that they're numbered arbitrarily, their goal being to be human
1841readable). Its purpose is mostly to support testing, i.e. to compare
1842the concise output from two identical anonymous subroutines (but
1843different instances). Without the reset, B::Concise, seeing that
1844they're separate optrees, generates different sequence numbers in
1845the output.
1846
1847=head2 Errors
1848
9a3b3024
JC
1849Errors in rendering (non-existent function-name, non-existent coderef)
1850are written to the STDOUT, or wherever you've set it via
1851walk_output().
31b49ad4 1852
9a3b3024
JC
1853Errors using the various *style* calls, and bad args to walk_output(),
1854result in die(). Use an eval if you wish to catch these errors and
1855continue processing.
78ad9108 1856
c99ca59a
SM
1857=head1 AUTHOR
1858
31b49ad4 1859Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.
c99ca59a
SM
1860
1861=cut