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