2 # Copyright (C) 2000-2003 Stephen McCamant. All rights reserved.
3 # This program is free software; you can redistribute and/or modify it
4 # under the same terms as Perl itself.
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.
13 use warnings; # uses #3 and #4, since warnings uses Carp
15 use Exporter (); # use #5
17 our $VERSION = "0.65";
18 our @ISA = qw(Exporter);
19 our @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 );
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 )], );
29 use B qw(class ppname main_start main_root main_cv cstring svref_2object
30 SVf_IOK SVf_NOK SVf_POK SVf_IVisUV SVf_FAKE OPf_KIDS OPf_SPECIAL
35 ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) "
36 . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
37 "(*( )*)goto #class (#addr)\n",
40 ["#hyphseq2 (*( (x( ;)x))*)<#classsym> "
41 . "#exname#arg(?([#targarglife])?)~#flags(?(/#private)?)(x(;~->#next)x)\n"
42 , " (*( )*) goto #seq\n",
43 "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
45 ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
47 "(?(#seq)?)#noise#arg(?([#targarg])?)"],
49 ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t"
50 . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n" .
51 ($] > 5.009 ? '' : "\top_seq\t\t#seqnum\n")
52 . "\top_flags\t#flagval\n\top_private\t#privval\n"
53 . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)"
54 . "(?(\top_sv\t\t#svaddr\n)?)",
57 "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
58 $ENV{B_CONCISE_TREE_FORMAT}],
61 # Renderings, ie how Concise prints, is controlled by these vars
63 our $stylename; # selects current style from %style
64 my $order = "basic"; # how optree is walked & printed: basic, exec, tree
66 # rendering mechanics:
67 # these 'formats' are the line-rendering templates
68 # they're updated from %style when $stylename changes
69 my ($format, $gotofmt, $treefmt);
72 my $base = 36; # how <sequence#> is displayed
73 my $big_endian = 1; # more <sequence#> display
74 my $tree_style = 0; # tree-order details
75 my $banner = 1; # print banner before optree is traversed
76 my $do_main = 0; # force printing of main routine
78 # another factor: can affect all styles!
79 our @callbacks; # allow external management
81 set_style_standard("concise");
87 ($format, $gotofmt, $treefmt) = @_;
88 #warn "set_style: deprecated, use set_style_standard instead\n"; # someday
89 die "expecting 3 style-format args\n" unless @_ == 3;
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];
98 $stylename = $newstyle; # update rendering state
101 sub set_style_standard {
102 ($stylename) = @_; # update rendering state
103 die "err: style '$stylename' unknown\n" unless exists $style{$stylename};
104 set_style(@{$style{$stylename}});
111 # output handle, used with all Concise-output printing
112 our $walkHandle; # public for your convenience
113 BEGIN { $walkHandle = \*STDOUT }
115 sub walk_output { # updates $walkHandle
117 return $walkHandle unless $handle; # allow use as accessor
119 if (ref $handle eq 'SCALAR') {
121 die "no perlio in this build, can't call walk_output (\\\$scalar)\n"
122 unless $Config::Config{useperlio};
123 # in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string
124 open my $tmp, '>', $handle; # but cant re-set existing STDOUT
125 $walkHandle = $tmp; # so use my $tmp as intermediate var
128 my $iotype = ref $handle;
129 die "expecting argument/object that can print\n"
130 unless $iotype eq 'GLOB' or $iotype and $handle->can('print');
131 $walkHandle = $handle;
135 my($order, $coderef) = @_;
136 my $codeobj = svref_2object($coderef);
138 return concise_stashref(@_)
139 unless ref $codeobj eq 'B::CV';
140 concise_cv_obj($order, $codeobj);
143 sub concise_stashref {
145 foreach my $k (sort keys %$h) {
147 my $coderef = *s{CODE} or next;
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";
157 # This should have been called concise_subref, but it was exported
158 # under this name in versions before 0.56
159 sub concise_cv { concise_subref(@_); }
162 my ($order, $cv) = @_;
164 die "err: coderef has no START\n" if class($cv->START) eq "NULL";
165 sequence($cv->START);
166 if ($order eq "exec") {
167 walk_exec($cv->START);
168 } elsif ($order eq "basic") {
169 walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0);
171 print $walkHandle tree($cv->ROOT, 0);
177 sequence(main_start);
179 if ($order eq "exec") {
180 return if class(main_start) eq "NULL";
181 walk_exec(main_start);
182 } elsif ($order eq "tree") {
183 return if class(main_root) eq "NULL";
184 print $walkHandle tree(main_root, 0);
185 } elsif ($order eq "basic") {
186 return if class(main_root) eq "NULL";
187 walk_topdown(main_root,
188 sub { $_[0]->concise($_[1]) }, 0);
192 sub concise_specials {
193 my($name, $order, @cv_s) = @_;
195 if ($name eq "BEGIN") {
196 splice(@cv_s, 0, 7); # skip 7 BEGIN blocks in this file
197 } elsif ($name eq "CHECK") {
198 pop @cv_s; # skip the CHECK block that calls us
201 print $walkHandle "$name $i:\n";
203 concise_cv_obj($order, $cv);
207 my $start_sym = "\e(0"; # "\cN" sometimes also works
208 my $end_sym = "\e(B"; # "\cO" respectively
210 my @tree_decorations =
211 ([" ", "--", "+-", "|-", "| ", "`-", "-", 1],
212 [" ", "-", "+", "+", "|", "`", "", 0],
213 [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1],
214 [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0],
219 # set rendering state from options and args
220 my @options = grep(/^-/, @_);
221 my @args = grep(!/^-/, @_);
222 for my $o (@options) {
224 if ($o eq "-basic") {
226 } elsif ($o eq "-exec") {
228 } elsif ($o eq "-tree") {
232 elsif ($o eq "-compact") {
234 } elsif ($o eq "-loose") {
236 } elsif ($o eq "-vt") {
238 } elsif ($o eq "-ascii") {
242 elsif ($o =~ /^-base(\d+)$/) {
244 } elsif ($o eq "-bigendian") {
246 } elsif ($o eq "-littleendian") {
249 elsif ($o eq "-nobanner") {
251 } elsif ($o eq "-banner") {
254 elsif ($o eq "-main") {
256 } elsif ($o eq "-nomain") {
260 elsif (exists $style{substr($o, 1)}) {
261 $stylename = substr($o, 1);
262 set_style_standard($stylename);
264 warn "Option $o unrecognized";
271 my (@args) = compileOpts(@_);
273 my @newargs = compileOpts(@_); # accept new rendering options
274 warn "disregarding non-options: @newargs\n" if @newargs;
276 for my $objname (@args) {
277 next unless $objname; # skip null args to avoid noisy responses
279 if ($objname eq "BEGIN") {
280 concise_specials("BEGIN", $order,
281 B::begin_av->isa("B::AV") ?
282 B::begin_av->ARRAY : ());
283 } elsif ($objname eq "INIT") {
284 concise_specials("INIT", $order,
285 B::init_av->isa("B::AV") ?
286 B::init_av->ARRAY : ());
287 } elsif ($objname eq "CHECK") {
288 concise_specials("CHECK", $order,
289 B::check_av->isa("B::AV") ?
290 B::check_av->ARRAY : ());
291 } elsif ($objname eq "END") {
292 concise_specials("END", $order,
293 B::end_av->isa("B::AV") ?
294 B::end_av->ARRAY : ());
297 # convert function names to subrefs
300 print $walkHandle "B::Concise::compile($objname)\n"
304 $objname = "main::" . $objname unless $objname =~ /::/;
305 print $walkHandle "$objname:\n";
307 die "err: unknown function ($objname)\n"
308 unless *{$objname}{CODE};
309 $objref = \&$objname;
311 concise_subref($order, $objref);
314 if (!@args or $do_main) {
315 print $walkHandle "main program:\n" if $do_main;
316 concise_main($order);
318 return @args; # something
323 my $lastnext; # remembers op-chain, used to insert gotos
325 my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
326 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
327 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#");
329 no warnings 'qw'; # "Possible attempt to put comments..."; use #7
331 qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl
332 ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I
333 -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i<
334 > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i
335 ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy
336 uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@
337 a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s}
338 v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o
339 ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v
340 ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r
341 -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd
342 co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3
343 g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e
344 e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn
345 Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO';
347 my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
349 sub op_flags { # common flags (see BASOP.op_flags in op.h)
352 push @v, "v" if ($x & 3) == 1;
353 push @v, "s" if ($x & 3) == 2;
354 push @v, "l" if ($x & 3) == 3;
355 push @v, "K" if $x & 4;
356 push @v, "P" if $x & 8;
357 push @v, "R" if $x & 16;
358 push @v, "M" if $x & 32;
359 push @v, "S" if $x & 64;
360 push @v, "*" if $x & 128;
366 return "-" . base_n(-$x) if $x < 0;
368 do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
369 $str = reverse $str if $big_endian;
385 return "-" if not exists $sequence_num{$$op};
386 return base_n($sequence_num{$$op});
390 my($op, $sub, $level) = @_;
392 if ($op->flags & OPf_KIDS) {
393 for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
394 walk_topdown($kid, $sub, $level + 1);
397 if (class($op) eq "PMOP") {
398 my $maybe_root = $op->pmreplroot;
399 if (ref($maybe_root) and $maybe_root->isa("B::OP")) {
400 # It really is the root of the replacement, not something
401 # else stored here for lack of space elsewhere
402 walk_topdown($maybe_root, $sub, $level + 1);
408 my($ar, $level) = @_;
410 if (ref($l) eq "ARRAY") {
411 walklines($l, $level + 1);
419 my($top, $level) = @_;
422 my @todo = ([$top, \@lines]);
423 while (@todo and my($op, $targ) = @{shift @todo}) {
424 for (; $$op; $op = $op->next) {
425 last if $opsseen{$$op}++;
427 my $name = $op->name;
428 if (class($op) eq "LOGOP") {
431 push @todo, [$op->other, $ar];
432 } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
435 push @todo, [$op->pmreplstart, $ar];
436 } elsif ($name =~ /^enter(loop|iter)$/) {
438 $labels{${$op->nextop}} = "NEXT";
439 $labels{${$op->lastop}} = "LAST";
440 $labels{${$op->redoop}} = "REDO";
442 $labels{$op->nextop->seq} = "NEXT";
443 $labels{$op->lastop->seq} = "LAST";
444 $labels{$op->redoop->seq} = "REDO";
449 walklines(\@lines, 0);
452 # The structure of this routine is purposely modeled after op.c's peep()
456 return if class($op) eq "NULL" or exists $sequence_num{$$op};
457 for (; $$op; $op = $op->next) {
458 last if exists $sequence_num{$$op};
459 my $name = $op->name;
460 if ($name =~ /^(null|scalar|lineseq|scope)$/) {
461 next if $oldop and $ {$op->next};
463 $sequence_num{$$op} = $seq_max++;
464 if (class($op) eq "LOGOP") {
465 my $other = $op->other;
466 $other = $other->next while $other->name eq "null";
468 } elsif (class($op) eq "LOOP") {
469 my $redoop = $op->redoop;
470 $redoop = $redoop->next while $redoop->name eq "null";
472 my $nextop = $op->nextop;
473 $nextop = $nextop->next while $nextop->name eq "null";
475 my $lastop = $op->lastop;
476 $lastop = $lastop->next while $lastop->name eq "null";
478 } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
479 my $replstart = $op->pmreplstart;
480 $replstart = $replstart->next while $replstart->name eq "null";
481 sequence($replstart);
488 sub fmt_line { # generate text-line for op.
489 my($hr, $op, $text, $level) = @_;
491 $_->($hr, $op, \$text, \$level, $stylename) for @callbacks;
493 return '' if $hr->{SKIP}; # suppress line if a callback said so
494 return '' if $hr->{goto} and $hr->{goto} eq '-'; # no goto nowhere
496 # spec: (?(text1#varText2)?)
497 $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
498 $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
500 # spec: (x(exec_text;basic_text)x)
501 $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
504 $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
506 # spec: (*(text1;text2)*)
507 $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
509 # convert #Var to tag=>val form: Var\t#var
510 $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs;
513 $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
515 $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg; # populate #var's
516 $text =~ s/[ \t]*~+[ \t]*/ /g; # squeeze tildes
518 return "$text\n" if $text ne "";
519 return $text; # suppress empty lines
522 our %priv; # used to display each opcode's BASEOP.op_private values
524 $priv{$_}{128} = "LVINTRO"
525 for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv",
526 "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv",
527 "padav", "padhv", "enteriter");
528 $priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite");
529 $priv{"aassign"}{64} = "COMMON";
530 $priv{"aassign"}{32} = "PHASH" if $] < 5.009;
531 $priv{"sassign"}{64} = "BKWARD";
532 $priv{$_}{64} = "RTIME" for ("match", "subst", "substcont");
533 @{$priv{"trans"}}{1,2,4,8,16,64} = ("<UTF", ">UTF", "IDENT", "SQUASH", "DEL",
535 $priv{"repeat"}{64} = "DOLIST";
536 $priv{"leaveloop"}{64} = "CONT";
537 @{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV")
538 for (qw(rv2gv rv2sv padsv aelem helem));
539 @{$priv{"entersub"}}{16,32,64} = ("DBG","TARG","NOMOD");
540 @{$priv{$_}}{4,8,128} = ("INARGS","AMPER","NO()") for ("entersub", "rv2cv");
541 $priv{"gv"}{32} = "EARLYCV";
542 $priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER";
543 $priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv",
545 $priv{$_}{16} = "TARGMY"
546 for (map(($_,"s$_"),"chop", "chomp"),
547 map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo",
548 "add", "subtract", "negate"), "pow", "concat", "stringify",
549 "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or",
550 "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt",
551 "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf",
552 "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock",
553 "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename",
554 "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system",
555 "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority",
556 "setpriority", "time", "sleep");
557 $priv{$_}{4} = "REVERSED" for ("enteriter", "iter");
558 @{$priv{"const"}}{4,8,16,32,64,128} = ("SHORT","STRICT","ENTERED",'$[',"BARE","WARN");
559 $priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM";
560 $priv{"list"}{64} = "GUESSED";
561 $priv{"delete"}{64} = "SLICE";
562 $priv{"exists"}{64} = "SUB";
563 $priv{$_}{64} = "LOCALE"
564 for ("sort", "prtf", "sprintf", "slt", "sle", "seq", "sne", "sgt", "sge",
565 "scmp", "lc", "uc", "lcfirst", "ucfirst");
566 @{$priv{"sort"}}{1,2,4,8,16} = ("NUM", "INT", "REV", "INPLACE","DESC");
567 $priv{"threadsv"}{64} = "SVREFd";
568 @{$priv{$_}}{16,32,64,128} = ("INBIN","INCR","OUTBIN","OUTCR")
569 for ("open", "backtick");
570 $priv{"exit"}{128} = "VMS";
571 $priv{$_}{2} = "FTACCESS"
572 for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec");
574 # Stacked filetests are post 5.8.x
575 $priv{$_}{4} = "FTSTACKED"
576 for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec",
577 "ftis", "fteowned", "ftrowned", "ftzero", "ftsize", "ftmtime",
578 "ftatime", "ftctime", "ftsock", "ftchr", "ftblk", "ftfile", "ftdir",
579 "ftpipe", "ftlink", "ftsuid", "ftsgid", "ftsvtx", "fttty", "fttext",
581 # Lexical $_ is post 5.8.x
582 $priv{$_}{2} = "GREPLEX"
583 for ("mapwhile", "mapstart", "grepwhile", "grepstart");
589 for my $flag (128, 96, 64, 32, 16, 8, 4, 2, 1) {
590 if ($priv{$name}{$flag} and $x & $flag and $x >= $flag) {
592 push @s, $priv{$name}{$flag};
596 return join(",", @s);
601 $hr->{svclass} = class($sv);
602 $hr->{svclass} = "UV"
603 if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV;
604 $hr->{svaddr} = sprintf("%#x", $$sv);
605 if ($hr->{svclass} eq "GV") {
607 my $stash = $gv->STASH->NAME;
608 if ($stash eq "main") {
611 $stash = $stash . "::";
613 $hr->{svval} = "*$stash" . $gv->SAFENAME;
614 return "*$stash" . $gv->SAFENAME;
616 while (class($sv) eq "RV") {
617 $hr->{svval} .= "\\";
620 if (class($sv) eq "SPECIAL") {
621 $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv];
622 } elsif ($sv->FLAGS & SVf_NOK) {
623 $hr->{svval} .= $sv->NV;
624 } elsif ($sv->FLAGS & SVf_IOK) {
625 $hr->{svval} .= $sv->int_value;
626 } elsif ($sv->FLAGS & SVf_POK) {
627 $hr->{svval} .= cstring($sv->PV);
628 } elsif (class($sv) eq "HV") {
629 $hr->{svval} .= 'HASH';
632 $hr->{svval} = 'undef' unless defined $hr->{svval};
633 my $out = $hr->{svclass};
634 return $out .= " $hr->{svval}" ;
639 my ($op, $level, $format) = @_;
641 $h{exname} = $h{name} = $op->name;
642 $h{NAME} = uc $h{name};
643 $h{class} = class($op);
644 $h{extarg} = $h{targ} = $op->targ;
645 $h{extarg} = "" unless $h{extarg};
646 if ($h{name} eq "null" and $h{targ}) {
647 # targ holds the old type
648 $h{exname} = "ex-" . substr(ppname($h{targ}), 3);
650 } elsif ($op->name =~ /^leave(sub(lv)?|write)?$/) {
651 # targ potentially holds a reference count
652 if ($op->private & 64) {
653 my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
654 $h{targarglife} = $h{targarg} = "$h{targ} $refs";
657 my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}];
658 if (defined $padname and class($padname) ne "SPECIAL") {
659 $h{targarg} = $padname->PVX;
660 if ($padname->FLAGS & SVf_FAKE) {
662 $h{targarglife} = "$h{targarg}:FAKE";
664 # These changes relate to the jumbo closure fix.
665 # See changes 19939 and 20005
667 $fake .= 'a' if $padname->IVX & 1; # PAD_FAKELEX_ANON
668 $fake .= 'm' if $padname->IVX & 2; # PAD_FAKELEX_MULTI
669 $fake .= ':' . $padname->NVX if $curcv->CvFLAGS & CVf_ANON;
670 $h{targarglife} = "$h{targarg}:FAKE:$fake";
674 my $intro = $padname->NVX - $cop_seq_base;
675 my $finish = int($padname->IVX) - $cop_seq_base;
676 $finish = "end" if $finish == 999999999 - $cop_seq_base;
677 $h{targarglife} = "$h{targarg}:$intro,$finish";
680 $h{targarglife} = $h{targarg} = "t" . $h{targ};
684 $h{svclass} = $h{svaddr} = $h{svval} = "";
685 if ($h{class} eq "PMOP") {
686 my $precomp = $op->precomp;
687 if (defined $precomp) {
688 $precomp = cstring($precomp); # Escape literal control sequences
689 $precomp = "/$precomp/";
693 my $pmreplroot = $op->pmreplroot;
695 if (ref($pmreplroot) eq "B::GV") {
696 # with C<@stash_array = split(/pat/, str);>,
697 # *stash_array is stored in /pat/'s pmreplroot.
698 $h{arg} = "($precomp => \@" . $pmreplroot->NAME . ")";
699 } elsif (!ref($pmreplroot) and $pmreplroot) {
700 # same as the last case, except the value is actually a
701 # pad offset for where the GV is kept (this happens under
703 my $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$pmreplroot];
704 $h{arg} = "($precomp => \@" . $gv->NAME . ")";
705 } elsif ($ {$op->pmreplstart}) {
707 $pmreplstart = "replstart->" . seq($op->pmreplstart);
708 $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")";
710 $h{arg} = "($precomp)";
712 } elsif ($h{class} eq "PVOP" and $h{name} ne "trans") {
713 $h{arg} = '("' . $op->pv . '")';
714 $h{svval} = '"' . $op->pv . '"';
715 } elsif ($h{class} eq "COP") {
716 my $label = $op->label;
717 $h{coplabel} = $label;
718 $label = $label ? "$label: " : "";
721 $loc .= ":" . $op->line;
722 my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
723 my $arybase = $op->arybase;
724 $arybase = $arybase ? ' $[=' . $arybase : "";
725 $h{arg} = "($label$stash $cseq $loc$arybase)";
726 } elsif ($h{class} eq "LOOP") {
727 $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
728 . " redo->" . seq($op->redoop) . ")";
729 } elsif ($h{class} eq "LOGOP") {
731 $h{arg} = "(other->" . seq($op->other) . ")";
732 } elsif ($h{class} eq "SVOP") {
733 unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
735 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->targ];
736 $h{arg} = "[" . concise_sv($sv, \%h) . "]";
737 $h{targarglife} = $h{targarg} = "";
739 $h{arg} = "(" . concise_sv($op->sv, \%h) . ")";
742 } elsif ($h{class} eq "PADOP") {
743 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->padix];
744 $h{arg} = "[" . concise_sv($sv, \%h) . "]";
746 $h{seq} = $h{hyphseq} = seq($op);
747 $h{seq} = "" if $h{seq} eq "-";
750 $h{static} = $op->static;
751 $h{label} = $labels{$$op};
753 $h{seqnum} = $op->seq;
754 $h{label} = $labels{$op->seq};
756 $h{next} = $op->next;
757 $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
758 $h{nextaddr} = sprintf("%#x", $ {$op->next});
759 $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
760 $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
761 $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
763 $h{classsym} = $opclass{$h{class}};
764 $h{flagval} = $op->flags;
765 $h{flags} = op_flags($op->flags);
766 $h{privval} = $op->private;
767 $h{private} = private_flags($h{name}, $op->private);
768 $h{addr} = sprintf("%#x", $$op);
769 $h{typenum} = $op->type;
770 $h{noise} = $linenoise[$op->type];
772 return fmt_line(\%h, $op, $format, $level);
776 my($op, $level) = @_;
777 if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
778 # insert a 'goto' line
779 my $synth = {"seq" => seq($lastnext), "class" => class($lastnext),
780 "addr" => sprintf("%#x", $$lastnext),
781 "goto" => seq($lastnext), # simplify goto '-' removal
783 print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
785 $lastnext = $op->next;
786 print $walkHandle concise_op($op, $level, $format);
789 # B::OP::terse (see Terse.pm) now just calls this
791 my($op, $level) = @_;
793 # This isn't necessarily right, but there's no easy way to get
794 # from an OP to the right CV. This is a limitation of the
795 # ->terse() interface style, and there isn't much to do about
796 # it. In particular, we can die in concise_op if the main pad
797 # isn't long enough, or has the wrong kind of entries, compared to
798 # the pad a sub was compiled with. The fix for that would be to
799 # make a backwards compatible "terse" format that never even
800 # looked at the pad, just like the old B::Terse. I don't think
801 # that's worth the effort, though.
802 $curcv = main_cv unless $curcv;
804 if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
806 my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
807 "addr" => sprintf("%#x", $$lastnext)};
809 fmt_line($h, $op, $style{"terse"}[1], $level+1);
811 $lastnext = $op->next;
813 concise_op($op, $level, $style{"terse"}[0]);
819 my $style = $tree_decorations[$tree_style];
820 my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
821 my $name = concise_op($op, $level, $treefmt);
822 if (not $op->flags & OPf_KIDS) {
826 for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
827 push @lines, tree($kid, $level+1);
830 for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
831 $lines[$i] = $space . $lines[$i];
834 $lines[$i] = $last . $lines[$i];
836 if (substr($lines[$i], 0, 1) eq " ") {
837 $lines[$i] = $nokid . $lines[$i];
839 $lines[$i] = $kid . $lines[$i];
842 $lines[$i] = $kids . $lines[$i];
844 $lines[0] = $single . $lines[0];
846 return("$name$lead" . shift @lines,
847 map(" " x (length($name)+$size) . $_, @lines));
850 # *** Warning: fragile kludge ahead ***
851 # Because the B::* modules run in the same interpreter as the code
852 # they're compiling, their presence tends to distort the view we have of
853 # the code we're looking at. In particular, perl gives sequence numbers
854 # to COPs. If the program we're looking at were run on its own, this
855 # would start at 1. Because all of B::Concise and all the modules it
856 # uses are compiled first, though, by the time we get to the user's
857 # program the sequence number is already pretty high, which could be
858 # distracting if you're trying to tell OPs apart. Therefore we'd like to
859 # subtract an offset from all the sequence numbers we display, to
860 # restore the simpler view of the world. The trick is to know what that
861 # offset will be, when we're still compiling B::Concise! If we
862 # hardcoded a value, it would have to change every time B::Concise or
863 # other modules we use do. To help a little, what we do here is compile
864 # a little code at the end of the module, and compute the base sequence
865 # number for the user's program as being a small offset later, so all we
866 # have to worry about are changes in the offset.
868 # [For 5.8.x and earlier perl is generating sequence numbers for all ops,
869 # and using them to reference labels]
872 # When you say "perl -MO=Concise -e '$a'", the output should look like:
874 # 4 <@> leave[t1] vKP/REFC ->(end)
876 #^ smallest OP sequence number should be 1
877 # 2 <;> nextstate(main 1 -e:1) v ->3
878 # ^ smallest COP sequence number should be 1
879 # - <1> ex-rv2sv vK/1 ->4
880 # 3 <$> gvsv(*a) s ->4
882 # If the second of the marked numbers there isn't 1, it means you need
883 # to update the corresponding magic number in the next line.
884 # Remember, this needs to stay the last things in the module.
886 # Why is this different for MacOS? Does it matter?
887 my $cop_seq_mnum = $^O eq 'MacOS' ? 12 : 11;
888 $cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum;
896 B::Concise - Walk Perl syntax tree, printing concise info about ops
900 perl -MO=Concise[,OPTIONS] foo.pl
902 use B::Concise qw(set_style add_callback);
906 This compiler backend prints the internal OPs of a Perl program's syntax
907 tree in one of several space-efficient text formats suitable for debugging
908 the inner workings of perl or other compiler backends. It can print OPs in
909 the order they appear in the OP tree, in the order they will execute, or
910 in a text approximation to their tree structure, and the format of the
911 information displyed is customizable. Its function is similar to that of
912 perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
913 sophisticated and flexible.
917 Here's an example of 2 outputs (aka 'renderings'), using the
918 -exec and -basic (i.e. default) formatting conventions on the same code
921 % perl -MO=Concise,-exec -e '$a = $b + 42'
923 2 <;> nextstate(main 1 -e:1) v
929 8 <@> leave[1 ref] vKP/REFC
931 Each line corresponds to an opcode. The opcode marked with '*' is used
932 in a few examples below.
934 The 1st column is the op's sequence number, starting at 1, and is
935 displayed in base 36 by default. This rendering is in -exec (i.e.
938 The symbol between angle brackets indicates the op's type, for
939 example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is
940 used in threaded perls. (see L</"OP class abbreviations">).
942 The opname, as in B<'add[t1]'>, which may be followed by op-specific
943 information in parentheses or brackets (ex B<'[t1]'>).
945 The op-flags (ex B<'sK/2'>) follow, and are described in (L</"OP flags
948 % perl -MO=Concise -e '$a = $b + 42'
949 8 <@> leave[1 ref] vKP/REFC ->(end)
951 2 <;> nextstate(main 1 -e:1) v ->3
952 7 <2> sassign vKS/2 ->8
953 * 5 <2> add[t1] sK/2 ->6
954 - <1> ex-rv2sv sK/1 ->4
956 4 <$> const(IV 42) s ->5
957 - <1> ex-rv2sv sKRM*/1 ->7
960 The default rendering is top-down, so they're not in execution order.
961 This form reflects the way the stack is used to parse and evaluate
962 expressions; the add operates on the two terms below it in the tree.
964 Nullops appear as C<ex-opname>, where I<opname> is an op that has been
965 optimized away by perl. They're displayed with a sequence-number of
966 '-', because they are not executed (they don't appear in previous
967 example), they're printed here because they reflect the parse.
969 The arrow points to the sequence number of the next op; they're not
970 displayed in -exec mode, for obvious reasons.
972 Note that because this rendering was done on a non-threaded perl, the
973 PADOPs in the previous examples are now SVOPs, and some (but not all)
974 of the square brackets have been replaced by round ones. This is a
975 subtle feature to provide some visual distinction between renderings
976 on threaded and un-threaded perls.
981 Arguments that don't start with a hyphen are taken to be the names of
982 subroutines to print the OPs of; if no such functions are specified,
983 the main body of the program (outside any subroutines, and not
984 including use'd or require'd files) is rendered. Passing C<BEGIN>,
985 C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding
986 special blocks to be printed.
988 Options affect how things are rendered (ie printed). They're presented
989 here by their visual effect, 1st being strongest. They're grouped
990 according to how they interrelate; within each group the options are
991 mutually exclusive (unless otherwise stated).
993 =head2 Options for Opcode Ordering
995 These options control the 'vertical display' of opcodes. The display
996 'order' is also called 'mode' elsewhere in this document.
1002 Print OPs in the order they appear in the OP tree (a preorder
1003 traversal, starting at the root). The indentation of each OP shows its
1004 level in the tree, and the '->' at the end of the line indicates the
1005 next opcode in execution order. This mode is the default, so the flag
1006 is included simply for completeness.
1010 Print OPs in the order they would normally execute (for the majority
1011 of constructs this is a postorder traversal of the tree, ending at the
1012 root). In most cases the OP that usually follows a given OP will
1013 appear directly below it; alternate paths are shown by indentation. In
1014 cases like loops when control jumps out of a linear path, a 'goto'
1019 Print OPs in a text approximation of a tree, with the root of the tree
1020 at the left and 'left-to-right' order of children transformed into
1021 'top-to-bottom'. Because this mode grows both to the right and down,
1022 it isn't suitable for large programs (unless you have a very wide
1027 =head2 Options for Line-Style
1029 These options select the line-style (or just style) used to render
1030 each opcode, and dictates what info is actually printed into each line.
1036 Use the author's favorite set of formatting conventions. This is the
1041 Use formatting conventions that emulate the output of B<B::Terse>. The
1042 basic mode is almost indistinguishable from the real B<B::Terse>, and the
1043 exec mode looks very similar, but is in a more logical order and lacks
1044 curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
1045 is only vaguely reminiscent of B<B::Terse>.
1049 Use formatting conventions in which the name of each OP, rather than being
1050 written out in full, is represented by a one- or two-character abbreviation.
1051 This is mainly a joke.
1055 Use formatting conventions reminiscent of B<B::Debug>; these aren't
1056 very concise at all.
1060 Use formatting conventions read from the environment variables
1061 C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
1065 =head2 Options for tree-specific formatting
1071 Use a tree format in which the minimum amount of space is used for the
1072 lines connecting nodes (one character in most cases). This squeezes out
1073 a few precious columns of screen real estate.
1077 Use a tree format that uses longer edges to separate OP nodes. This format
1078 tends to look better than the compact one, especially in ASCII, and is
1083 Use tree connecting characters drawn from the VT100 line-drawing set.
1084 This looks better if your terminal supports it.
1088 Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
1089 look as clean as the VT100 characters, but they'll work with almost any
1090 terminal (or the horizontal scrolling mode of less(1)) and are suitable
1091 for text documentation or email. This is the default.
1095 These are pairwise exclusive, i.e. compact or loose, vt or ascii.
1097 =head2 Options controlling sequence numbering
1103 Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
1104 digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
1105 for 37 will be 'A', and so on until 62. Values greater than 62 are not
1106 currently supported. The default is 36.
1110 Print sequence numbers with the most significant digit first. This is the
1111 usual convention for Arabic numerals, and the default.
1113 =item B<-littleendian>
1115 Print seqence numbers with the least significant digit first. This is
1116 obviously mutually exclusive with bigendian.
1120 =head2 Other options
1122 These are pairwise exclusive.
1128 Include the main program in the output, even if subroutines were also
1129 specified. This rendering is normally suppressed when a subroutine
1130 name or reference is given.
1134 This restores the default behavior after you've changed it with '-main'
1135 (it's not normally needed). If no subroutine name/ref is given, main is
1136 rendered, regardless of this flag.
1140 Renderings usually include a banner line identifying the function name
1141 or stringified subref. This suppresses the printing of the banner.
1143 TBC: Remove the stringified coderef; while it provides a 'cookie' for
1144 each function rendered, the cookies used should be 1,2,3.. not a
1145 random hex-address. It also complicates string comparison of two
1150 restores default banner behavior.
1152 =item B<-banneris> => subref
1154 TBC: a hookpoint (and an option to set it) for a user-supplied
1155 function to produce a banner appropriate for users needs. It's not
1156 ideal, because the rendering-state variables, which are a natural
1157 candidate for use in concise.t, are unavailable to the user.
1161 =head2 Option Stickiness
1163 If you invoke Concise more than once in a program, you should know that
1164 the options are 'sticky'. This means that the options you provide in
1165 the first call will be remembered for the 2nd call, unless you
1166 re-specify or change them.
1168 =head1 ABBREVIATIONS
1170 The concise style uses symbols to convey maximum info with minimal
1171 clutter (like hex addresses). With just a little practice, you can
1172 start to see the flowers, not just the branches, in the trees.
1174 =head2 OP class abbreviations
1176 These symbols appear before the op-name, and indicate the
1177 B:: namespace that represents the ops in your Perl code.
1179 0 OP (aka BASEOP) An OP with no children
1180 1 UNOP An OP with one child
1181 2 BINOP An OP with two children
1182 | LOGOP A control branch OP
1183 @ LISTOP An OP that could have lots of children
1184 / PMOP An OP with a regular expression
1185 $ SVOP An OP with an SV
1186 " PVOP An OP with a string
1187 { LOOP An OP that holds pointers for a loop
1188 ; COP An OP that marks the start of a statement
1189 # PADOP An OP with a GV on the pad
1191 =head2 OP flags abbreviations
1193 OP flags are either public or private. The public flags alter the
1194 behavior of each opcode in consistent ways, and are represented by 0
1195 or more single characters.
1197 v OPf_WANT_VOID Want nothing (void context)
1198 s OPf_WANT_SCALAR Want single value (scalar context)
1199 l OPf_WANT_LIST Want list of any length (list context)
1201 K OPf_KIDS There is a firstborn child.
1202 P OPf_PARENS This operator was parenthesized.
1203 (Or block needs explicit scope entry.)
1204 R OPf_REF Certified reference.
1205 (Return container, not containee).
1206 M OPf_MOD Will modify (lvalue).
1207 S OPf_STACKED Some arg is arriving on the stack.
1208 * OPf_SPECIAL Do something weird for this op (see op.h)
1210 Private flags, if any are set for an opcode, are displayed after a '/'
1212 8 <@> leave[1 ref] vKP/REFC ->(end)
1213 7 <2> sassign vKS/2 ->8
1215 They're opcode specific, and occur less often than the public ones, so
1216 they're represented by short mnemonics instead of single-chars; see
1217 L<op.h> for gory details, or try this quick 2-liner:
1219 $> perl -MB::Concise -de 1
1220 DB<1> |x \%B::Concise::priv
1222 =head1 FORMATTING SPECIFICATIONS
1224 For each line-style ('concise', 'terse', 'linenoise', etc.) there are
1225 3 format-specs which control how OPs are rendered.
1227 The first is the 'default' format, which is used in both basic and exec
1228 modes to print all opcodes. The 2nd, goto-format, is used in exec
1229 mode when branches are encountered. They're not real opcodes, and are
1230 inserted to look like a closing curly brace. The tree-format is tree
1233 When a line is rendered, the correct format-spec is copied and scanned
1234 for the following items; data is substituted in, and other
1235 manipulations like basic indenting are done, for each opcode rendered.
1237 There are 3 kinds of items that may be populated; special patterns,
1238 #vars, and literal text, which is copied verbatim. (Yes, it's a set
1241 =head2 Special Patterns
1243 These items are the primitives used to perform indenting, and to
1244 select text from amongst alternatives.
1248 =item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
1250 Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
1252 =item B<(*(>I<text>B<)*)>
1254 Generates one copy of I<text> for each indentation level.
1256 =item B<(*(>I<text1>B<;>I<text2>B<)*)>
1258 Generates one fewer copies of I<text1> than the indentation level, followed
1259 by one copy of I<text2> if the indentation level is more than 0.
1261 =item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
1263 If the value of I<var> is true (not empty or zero), generates the
1264 value of I<var> surrounded by I<text1> and I<Text2>, otherwise
1269 Any number of tildes and surrounding whitespace will be collapsed to
1276 These #vars represent opcode properties that you may want as part of
1277 your rendering. The '#' is intended as a private sigil; a #var's
1278 value is interpolated into the style-line, much like "read $this".
1280 These vars take 3 forms:
1286 A property named 'var' is assumed to exist for the opcodes, and is
1287 interpolated into the rendering.
1289 =item B<#>I<var>I<N>
1291 Generates the value of I<var>, left justified to fill I<N> spaces.
1292 Note that this means while you can have properties 'foo' and 'foo2',
1293 you cannot render 'foo2', but you could with 'foo2a'. You would be
1294 wise not to rely on this behavior going forward ;-)
1298 This ucfirst form of #var generates a tag-value form of itself for
1299 display; it converts '#Var' into a 'Var => #var' style, which is then
1300 handled as described above. (Imp-note: #Vars cannot be used for
1301 conditional-fills, because the => #var transform is done after the check
1306 The following variables are 'defined' by B::Concise; when they are
1307 used in a style, their respective values are plugged into the
1308 rendering of each opcode.
1310 Only some of these are used by the standard styles, the others are
1311 provided for you to delve into optree mechanics, should you wish to
1312 add a new style (see L</add_style> below) that uses them. You can
1313 also add new ones using L<add_callback>.
1319 The address of the OP, in hexadecimal.
1323 The OP-specific information of the OP (such as the SV for an SVOP, the
1324 non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
1328 The B-determined class of the OP, in all caps.
1332 A single symbol abbreviating the class of the OP.
1336 The label of the statement or block the OP is the start of, if any.
1340 The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
1344 The target of the OP, or nothing for a nulled OP.
1348 The address of the OP's first child, in hexadecimal.
1352 The OP's flags, abbreviated as a series of symbols.
1356 The numeric value of the OP's flags.
1360 The sequence number of the OP, or a hyphen if it doesn't have one.
1364 'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
1365 mode, or empty otherwise.
1369 The address of the OP's last child, in hexadecimal.
1377 The OP's name, in all caps.
1381 The sequence number of the OP's next OP.
1385 The address of the OP's next OP, in hexadecimal.
1389 A one- or two-character abbreviation for the OP's name.
1393 The OP's private flags, rendered with abbreviated names if possible.
1397 The numeric value of the OP's private flags.
1401 The sequence number of the OP. Note that this is a sequence number
1402 generated by B::Concise.
1406 5.8.x and earlier only. 5.9 and later do not provide this.
1408 The real sequence number of the OP, as a regular number and not adjusted
1409 to be relative to the start of the real program. (This will generally be
1410 a fairly large number because all of B<B::Concise> is compiled before
1415 Whether or not the op has been optimised by the peephole optimiser.
1417 Only available in 5.9 and later.
1421 Whether or not the op is statically defined. This flag is used by the
1422 B::C compiler backend and indicates that the op should not be freed.
1424 Only available in 5.9 and later.
1428 The address of the OP's next youngest sibling, in hexadecimal.
1432 The address of the OP's SV, if it has an SV, in hexadecimal.
1436 The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
1440 The value of the OP's SV, if it has one, in a short human-readable format.
1444 The numeric value of the OP's targ.
1448 The name of the variable the OP's targ refers to, if any, otherwise the
1449 letter t followed by the OP's targ in decimal.
1451 =item B<#targarglife>
1453 Same as B<#targarg>, but followed by the COP sequence numbers that delimit
1454 the variable's lifetime (or 'end' for a variable in an open scope) for a
1459 The numeric value of the OP's type, in decimal.
1463 =head1 Using B::Concise outside of the O framework
1465 The common (and original) usage of B::Concise was for command-line
1466 renderings of simple code, as given in EXAMPLE. But you can also use
1467 B<B::Concise> from your code, and call compile() directly, and
1468 repeatedly. By doing so, you can avoid the compile-time only
1469 operation of O.pm, and even use the debugger to step through
1470 B::Concise::compile() itself.
1472 Once you're doing this, you may alter Concise output by adding new
1473 rendering styles, and by optionally adding callback routines which
1474 populate new variables, if such were referenced from those (just
1477 =head2 Example: Altering Concise Renderings
1479 use B::Concise qw(set_style add_callback);
1480 add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
1483 my ($h, $op, $format, $level, $stylename) = @_;
1484 $h->{variable} = some_func($op);
1486 $walker = B::Concise::compile(@options,@subnames,@subrefs);
1491 B<set_style> accepts 3 arguments, and updates the three format-specs
1492 comprising a line-style (basic-exec, goto, tree). It has one minor
1493 drawback though; it doesn't register the style under a new name. This
1494 can become an issue if you render more than once and switch styles.
1495 Thus you may prefer to use add_style() and/or set_style_standard()
1498 =head2 set_style_standard($name)
1500 This restores one of the standard line-styles: C<terse>, C<concise>,
1501 C<linenoise>, C<debug>, C<env>, into effect. It also accepts style
1502 names previously defined with add_style().
1506 This subroutine accepts a new style name and three style arguments as
1507 above, and creates, registers, and selects the newly named style. It is
1508 an error to re-add a style; call set_style_standard() to switch between
1511 =head2 add_callback()
1513 If your newly minted styles refer to any new #variables, you'll need
1514 to define a callback subroutine that will populate (or modify) those
1515 variables. They are then available for use in the style you've
1518 The callbacks are called for each opcode visited by Concise, in the
1519 same order as they are added. Each subroutine is passed five
1522 1. A hashref, containing the variable names and values which are
1523 populated into the report-line for the op
1524 2. the op, as a B<B::OP> object
1525 3. a reference to the format string
1526 4. the formatting (indent) level
1527 5. the selected stylename
1529 To define your own variables, simply add them to the hash, or change
1530 existing values if you need to. The level and format are passed in as
1531 references to scalars, but it is unlikely that they will need to be
1532 changed or even used.
1534 =head2 Running B::Concise::compile()
1536 B<compile> accepts options as described above in L</OPTIONS>, and
1537 arguments, which are either coderefs, or subroutine names.
1539 It constructs and returns a $treewalker coderef, which when invoked,
1540 traverses, or walks, and renders the optrees of the given arguments to
1541 STDOUT. You can reuse this, and can change the rendering style used
1542 each time; thereafter the coderef renders in the new style.
1544 B<walk_output> lets you change the print destination from STDOUT to
1545 another open filehandle, or into a string passed as a ref (unless
1546 you've built perl with -Uuseperlio).
1548 my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1
1549 walk_output(\my $buf);
1550 $walker->(); # 1 renders -terse
1551 set_style_standard('concise'); # 2
1552 $walker->(); # 2 renders -concise
1553 $walker->(@new); # 3 renders whatever
1554 print "3 different renderings: terse, concise, and @new: $buf\n";
1556 When $walker is called, it traverses the subroutines supplied when it
1557 was created, and renders them using the current style. You can change
1558 the style afterwards in several different ways:
1560 1. call C<compile>, altering style or mode/order
1561 2. call C<set_style_standard>
1562 3. call $walker, passing @new options
1564 Passing new options to the $walker is the easiest way to change
1565 amongst any pre-defined styles (the ones you add are automatically
1566 recognized as options), and is the only way to alter rendering order
1567 without calling compile again. Note however that rendering state is
1568 still shared amongst multiple $walker objects, so they must still be
1569 used in a coordinated manner.
1571 =head2 B::Concise::reset_sequence()
1573 This function (not exported) lets you reset the sequence numbers (note
1574 that they're numbered arbitrarily, their goal being to be human
1575 readable). Its purpose is mostly to support testing, i.e. to compare
1576 the concise output from two identical anonymous subroutines (but
1577 different instances). Without the reset, B::Concise, seeing that
1578 they're separate optrees, generates different sequence numbers in
1583 All detected errors, (invalid arguments, internal errors, etc.) are
1584 resolved with a die($message). Use an eval if you wish to catch these
1585 errors and continue processing.
1587 In particular, B<compile> will die if you've asked for a non-existent
1588 function-name, a non-existent coderef, or a non-CODE reference.
1592 Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.