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