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