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