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 = "1.003";
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
32 OPpSPLIT_ASSIGN OPpSPLIT_LEX
33 CVf_ANON CVf_LEXICAL CVf_NAMED
34 PAD_FAKELEX_ANON PAD_FAKELEX_MULTI SVf_ROK);
38 ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) "
39 . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
40 "(*( )*)goto #class (#addr)\n",
43 ["#hyphseq2 (*( (x( ;)x))*)<#classsym> #exname#arg(?([#targarglife])?)"
44 . "~#flags(?(/#private)?)(?(:#hints)?)(x(;~->#next)x)\n"
45 , " (*( )*) goto #seq\n",
46 "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
48 ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
50 "(?(#seq)?)#noise#arg(?([#targarg])?)"],
52 ["#class (#addr)\n\top_next\t\t#nextaddr\n\t(?(op_other\t#otheraddr\n\t)?)"
53 . "op_sibling\t#sibaddr\n\t"
54 . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n"
55 . "\top_flags\t#flagval\n\top_private\t#privval\t#hintsval\n"
56 . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)"
57 . "(?(\top_sv\t\t#svaddr\n)?)",
60 "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
61 $ENV{B_CONCISE_TREE_FORMAT}],
64 # Renderings, ie how Concise prints, is controlled by these vars
66 our $stylename; # selects current style from %style
67 my $order = "basic"; # how optree is walked & printed: basic, exec, tree
69 # rendering mechanics:
70 # these 'formats' are the line-rendering templates
71 # they're updated from %style when $stylename changes
72 my ($format, $gotofmt, $treefmt);
75 my $base = 36; # how <sequence#> is displayed
76 my $big_endian = 1; # more <sequence#> display
77 my $tree_style = 0; # tree-order details
78 my $banner = 1; # print banner before optree is traversed
79 my $do_main = 0; # force printing of main routine
80 my $show_src; # show source code
82 # another factor: can affect all styles!
83 our @callbacks; # allow external management
85 set_style_standard("concise");
91 ($format, $gotofmt, $treefmt) = @_;
92 #warn "set_style: deprecated, use set_style_standard instead\n"; # someday
93 die "expecting 3 style-format args\n" unless @_ == 3;
97 my ($newstyle,@args) = @_;
98 die "style '$newstyle' already exists, choose a new name\n"
99 if exists $style{$newstyle};
100 die "expecting 3 style-format args\n" unless @args == 3;
101 $style{$newstyle} = [@args];
102 $stylename = $newstyle; # update rendering state
105 sub set_style_standard {
106 ($stylename) = @_; # update rendering state
107 die "err: style '$stylename' unknown\n" unless exists $style{$stylename};
108 set_style(@{$style{$stylename}});
115 # output handle, used with all Concise-output printing
116 our $walkHandle; # public for your convenience
117 BEGIN { $walkHandle = \*STDOUT }
119 sub walk_output { # updates $walkHandle
121 return $walkHandle unless $handle; # allow use as accessor
123 if (ref $handle eq 'SCALAR') {
125 die "no perlio in this build, can't call walk_output (\\\$scalar)\n"
126 unless $Config::Config{useperlio};
127 # in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string
128 open my $tmp, '>', $handle; # but cant re-set existing STDOUT
129 $walkHandle = $tmp; # so use my $tmp as intermediate var
132 my $iotype = ref $handle;
133 die "expecting argument/object that can print\n"
134 unless $iotype eq 'GLOB' or $iotype and $handle->can('print');
135 $walkHandle = $handle;
139 my($order, $coderef, $name) = @_;
140 my $codeobj = svref_2object($coderef);
142 return concise_stashref(@_)
143 unless ref($codeobj) =~ '^B::(?:CV|FM)\z';
144 concise_cv_obj($order, $codeobj, $name);
147 sub concise_stashref {
149 my $name = svref_2object($h)->NAME;
150 foreach my $k (sort keys %$h) {
151 next unless defined $h->{$k};
152 my $coderef = ref $h->{$k} eq 'CODE' ? $h->{$k}
153 : ref\$h->{$k} eq 'GLOB' ? *{$h->{$k}}{CODE} || next
156 print "FUNC: *", $name, "::", $k, "\n";
157 my $codeobj = svref_2object($coderef);
158 next unless ref $codeobj eq 'B::CV';
159 eval { concise_cv_obj($order, $codeobj, $k) };
160 warn "err $@ on $codeobj" if $@;
164 # This should have been called concise_subref, but it was exported
165 # under this name in versions before 0.56
166 *concise_cv = \&concise_subref;
169 my ($order, $cv, $name) = @_;
170 # name is either a string, or a CODE ref (copy of $cv arg??)
174 if (ref($cv->XSUBANY) =~ /B::(\w+)/) {
175 print $walkHandle "$name is a constant sub, optimized to a $1\n";
179 print $walkHandle "$name is XS code\n";
182 if (class($cv->START) eq "NULL") {
184 if (ref $name eq 'CODE') {
185 print $walkHandle "coderef $name has no START\n";
187 elsif (exists &$name) {
188 print $walkHandle "$name exists in stash, but has no START\n";
191 print $walkHandle "$name not in symbol table\n";
195 sequence($cv->START);
196 if ($order eq "exec") {
197 walk_exec($cv->START);
199 elsif ($order eq "basic") {
200 # walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0);
201 my $root = $cv->ROOT;
202 unless (ref $root eq 'B::NULL') {
203 walk_topdown($root, sub { $_[0]->concise($_[1]) }, 0);
205 print $walkHandle "B::NULL encountered doing ROOT on $cv. avoiding disaster\n";
208 print $walkHandle tree($cv->ROOT, 0);
214 sequence(main_start);
216 if ($order eq "exec") {
217 return if class(main_start) eq "NULL";
218 walk_exec(main_start);
219 } elsif ($order eq "tree") {
220 return if class(main_root) eq "NULL";
221 print $walkHandle tree(main_root, 0);
222 } elsif ($order eq "basic") {
223 return if class(main_root) eq "NULL";
224 walk_topdown(main_root,
225 sub { $_[0]->concise($_[1]) }, 0);
229 sub concise_specials {
230 my($name, $order, @cv_s) = @_;
232 if ($name eq "BEGIN") {
233 splice(@cv_s, 0, 8); # skip 7 BEGIN blocks in this file. NOW 8 ??
234 } elsif ($name eq "CHECK") {
235 pop @cv_s; # skip the CHECK block that calls us
238 print $walkHandle "$name $i:\n";
240 concise_cv_obj($order, $cv, $name);
244 my $start_sym = "\e(0"; # "\cN" sometimes also works
245 my $end_sym = "\e(B"; # "\cO" respectively
247 my @tree_decorations =
248 ([" ", "--", "+-", "|-", "| ", "`-", "-", 1],
249 [" ", "-", "+", "+", "|", "`", "", 0],
250 [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1],
251 [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0],
254 my @render_packs; # collect -stash=<packages>
257 # set rendering state from options and args
260 @options = grep(/^-/, @_);
261 @args = grep(!/^-/, @_);
263 for my $o (@options) {
265 if ($o eq "-basic") {
267 } elsif ($o eq "-exec") {
269 } elsif ($o eq "-tree") {
273 elsif ($o eq "-compact") {
275 } elsif ($o eq "-loose") {
277 } elsif ($o eq "-vt") {
279 } elsif ($o eq "-ascii") {
283 elsif ($o =~ /^-base(\d+)$/) {
285 } elsif ($o eq "-bigendian") {
287 } elsif ($o eq "-littleendian") {
290 # miscellaneous, presentation
291 elsif ($o eq "-nobanner") {
293 } elsif ($o eq "-banner") {
296 elsif ($o eq "-main") {
298 } elsif ($o eq "-nomain") {
300 } elsif ($o eq "-src") {
303 elsif ($o =~ /^-stash=(.*)/) {
306 if (! %{$pkg.'::'}) {
310 if (!$Config::Config{usedl}
311 && keys %{$pkg.'::'} == 1
312 && $pkg->can('bootstrap')) {
313 # It is something that we're statically linked to, but hasn't
318 push @render_packs, $pkg;
321 elsif (exists $style{substr($o, 1)}) {
322 $stylename = substr($o, 1);
323 set_style_standard($stylename);
325 warn "Option $o unrecognized";
332 my (@args) = compileOpts(@_);
334 my @newargs = compileOpts(@_); # accept new rendering options
335 warn "disregarding non-options: @newargs\n" if @newargs;
337 for my $objname (@args) {
338 next unless $objname; # skip null args to avoid noisy responses
340 if ($objname eq "BEGIN") {
341 concise_specials("BEGIN", $order,
342 B::begin_av->isa("B::AV") ?
343 B::begin_av->ARRAY : ());
344 } elsif ($objname eq "INIT") {
345 concise_specials("INIT", $order,
346 B::init_av->isa("B::AV") ?
347 B::init_av->ARRAY : ());
348 } elsif ($objname eq "CHECK") {
349 concise_specials("CHECK", $order,
350 B::check_av->isa("B::AV") ?
351 B::check_av->ARRAY : ());
352 } elsif ($objname eq "UNITCHECK") {
353 concise_specials("UNITCHECK", $order,
354 B::unitcheck_av->isa("B::AV") ?
355 B::unitcheck_av->ARRAY : ());
356 } elsif ($objname eq "END") {
357 concise_specials("END", $order,
358 B::end_av->isa("B::AV") ?
359 B::end_av->ARRAY : ());
362 # convert function names to subrefs
364 print $walkHandle "B::Concise::compile($objname)\n"
366 concise_subref($order, ($objname)x2);
369 $objname = "main::" . $objname unless $objname =~ /::/;
371 my $glob = \*$objname;
372 unless (*$glob{CODE} || *$glob{FORMAT}) {
373 print $walkHandle "$objname:\n" if $banner;
374 print $walkHandle "err: unknown function ($objname)\n";
377 if (my $objref = *$glob{CODE}) {
378 print $walkHandle "$objname:\n" if $banner;
379 concise_subref($order, $objref, $objname);
381 if (my $objref = *$glob{FORMAT}) {
382 print $walkHandle "$objname (FORMAT):\n"
384 concise_subref($order, $objref, $objname);
389 for my $pkg (@render_packs) {
391 concise_stashref($order, \%{$pkg.'::'});
394 if (!@args or $do_main or @render_packs) {
395 print $walkHandle "main program:\n" if $do_main;
396 concise_main($order);
398 return @args; # something
403 my $lastnext; # remembers op-chain, used to insert gotos
405 my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
406 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
407 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#",
408 'METHOP' => '.', UNOP_AUX => '+');
410 no warnings 'qw'; # "Possible attempt to put comments..."; use #7
412 qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl
413 ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I
414 -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i<
415 > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i
416 ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy
417 uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@
418 a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s}
419 v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o
420 ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v
421 ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r
422 -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd
423 co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3
424 g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e
425 e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn
426 Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO';
428 my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
430 sub op_flags { # common flags (see BASOP.op_flags in op.h)
433 push @v, "v" if ($x & 3) == 1;
434 push @v, "s" if ($x & 3) == 2;
435 push @v, "l" if ($x & 3) == 3;
436 push @v, "K" if $x & 4;
437 push @v, "P" if $x & 8;
438 push @v, "R" if $x & 16;
439 push @v, "M" if $x & 32;
440 push @v, "S" if $x & 64;
441 push @v, "*" if $x & 128;
447 return "-" . base_n(-$x) if $x < 0;
449 do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
450 $str = reverse $str if $big_endian;
466 return "-" if not exists $sequence_num{$$op};
467 return base_n($sequence_num{$$op});
471 my($op, $sub, $level) = @_;
473 if ($op->flags & OPf_KIDS) {
474 for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
475 walk_topdown($kid, $sub, $level + 1);
478 if (class($op) eq "PMOP") {
479 my $maybe_root = $op->code_list;
480 if ( ref($maybe_root) and $maybe_root->isa("B::OP")
481 and not $op->flags & OPf_KIDS) {
482 walk_topdown($maybe_root, $sub, $level + 1);
484 $maybe_root = $op->pmreplroot;
485 if (ref($maybe_root) and $maybe_root->isa("B::OP")) {
486 # It really is the root of the replacement, not something
487 # else stored here for lack of space elsewhere
488 walk_topdown($maybe_root, $sub, $level + 1);
494 my($ar, $level) = @_;
496 if (ref($l) eq "ARRAY") {
497 walklines($l, $level + 1);
505 my($top, $level) = @_;
508 my @todo = ([$top, \@lines]);
509 while (@todo and my($op, $targ) = @{shift @todo}) {
510 for (; $$op; $op = $op->next) {
511 last if $opsseen{$$op}++;
513 my $name = $op->name;
514 if (class($op) eq "LOGOP") {
517 push @todo, [$op->other, $ar];
518 } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
521 push @todo, [$op->pmreplstart, $ar];
522 } elsif ($name =~ /^enter(loop|iter)$/) {
523 $labels{${$op->nextop}} = "NEXT";
524 $labels{${$op->lastop}} = "LAST";
525 $labels{${$op->redoop}} = "REDO";
529 walklines(\@lines, 0);
532 # The structure of this routine is purposely modeled after op.c's peep()
536 return if class($op) eq "NULL" or exists $sequence_num{$$op};
537 for (; $$op; $op = $op->next) {
538 last if exists $sequence_num{$$op};
539 my $name = $op->name;
540 $sequence_num{$$op} = $seq_max++;
541 if (class($op) eq "LOGOP") {
542 sequence($op->other);
543 } elsif (class($op) eq "LOOP") {
544 sequence($op->redoop);
545 sequence( $op->nextop);
546 sequence($op->lastop);
547 } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
548 sequence($op->pmreplstart);
554 sub fmt_line { # generate text-line for op.
555 my($hr, $op, $text, $level) = @_;
557 $_->($hr, $op, \$text, \$level, $stylename) for @callbacks;
559 return '' if $hr->{SKIP}; # suppress line if a callback said so
560 return '' if $hr->{goto} and $hr->{goto} eq '-'; # no goto nowhere
562 # spec: (?(text1#varText2)?)
563 $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
564 $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
566 # spec: (x(exec_text;basic_text)x)
567 $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
570 $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
572 # spec: (*(text1;text2)*)
573 $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
575 # convert #Var to tag=>val form: Var\t#var
576 $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs;
579 $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
581 $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg; # populate #var's
582 $text =~ s/[ \t]*~+[ \t]*/ /g; # squeeze tildes
584 $text = "# $hr->{src}\n$text" if $show_src and $hr->{src};
587 return "$text\n" if $text ne "" and $order ne "tree";
588 return $text; # suppress empty lines
593 # use require rather than use here to avoid disturbing tests that dump
595 require B::Op_private;
599 our %hints; # used to display each COP's op_hints values
601 # strict refs, subs, vars
602 @hints{0x2,0x200,0x400,0x20,0x40,0x80} = ('$', '&', '*', 'x$', 'x&', 'x*');
603 # integers, locale, bytes
604 @hints{0x1,0x4,0x8,0x10} = ('i', 'l', 'b');
605 # block scope, localise %^H, $^OPEN (in), $^OPEN (out)
606 @hints{0x100,0x20000,0x40000,0x80000} = ('{','%','<','>');
607 # overload new integer, float, binary, string, re
608 @hints{0x1000,0x2000,0x4000,0x8000,0x10000} = ('I', 'F', 'B', 'S', 'R');
610 @hints{0x100000,0x200000} = ('T', 'E');
611 # filetest access, use utf8, unicode_strings feature
612 @hints{0x400000,0x800000,0x800} = ('X', 'U', 'us');
614 # pick up the feature hints constants.
615 # Note that we're relying on non-API parts of feature.pm,
616 # but its less naughty than just blindly copying those constants into
624 for my $flag (sort {$b <=> $a} keys %hints) {
625 if ($hints{$flag} and $x & $flag and $x >= $flag) {
627 push @s, $hints{$flag};
630 if ($x & $feature::hint_mask) {
631 push @s, "fea=" . (($x & $feature::hint_mask) >> $feature::hint_shift);
632 $x &= ~$feature::hint_mask;
634 push @s, sprintf "0x%x", $x if $x;
635 return join(",", @s);
639 # return a string like 'LVINTRO,1' for the op $name with op_private
644 my $entry = $B::Op_private::bits{$name};
645 return $x ? "$x" : '' unless $entry;
649 for ($bit = 7; $bit >= 0; $bit--) {
650 next unless exists $entry->{$bit};
651 my $e = $entry->{$bit};
652 if (ref($e) eq 'HASH') {
655 my ($bitmin, $bitmax, $bitmask, $enum, $label) =
656 @{$e}{qw(bitmin bitmax bitmask enum label)};
658 next if defined $label && $label eq '-'; # display as raw number
660 my $val = $x & $bitmask;
665 # try to convert numeric $val into symbolic
668 my $ix = shift @enum;
669 my $name = shift @enum;
670 my $label = shift @enum;
677 next if $val eq '0'; # don't display anonymous zero values
678 push @flags, defined $label ? "$label=$val" : $val;
683 my $label = $B::Op_private::labels{$e};
684 next if defined $label && $label eq '-'; # display as raw number
685 if ($x & (1<<$bit)) {
692 push @flags, $x if $x; # display unknown bits numerically
693 return join ",", @flags;
697 my($sv, $hr, $preferpv) = @_;
698 $hr->{svclass} = class($sv);
699 $hr->{svclass} = "UV"
700 if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV;
701 Carp::cluck("bad concise_sv: $sv") unless $sv and $$sv;
702 $hr->{svaddr} = sprintf("%#x", $$sv);
703 if ($hr->{svclass} eq "GV" && $sv->isGV_with_GP()) {
705 my $stash = $gv->STASH;
706 if (class($stash) eq "SPECIAL") {
710 $stash = $stash->NAME;
712 if ($stash eq "main") {
715 $stash = $stash . "::";
717 $hr->{svval} = "*$stash" . $gv->SAFENAME;
718 return "*$stash" . $gv->SAFENAME;
720 while (class($sv) eq "IV" && $sv->FLAGS & SVf_ROK) {
721 $hr->{svval} .= "\\";
724 if (class($sv) eq "SPECIAL") {
725 $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no",
726 '', '', '', "sv_zero"]->[$$sv];
728 && ($sv->FLAGS & SVf_POK)) {
729 $hr->{svval} .= cstring($sv->PV);
730 } elsif ($sv->FLAGS & SVf_NOK) {
731 $hr->{svval} .= $sv->NV;
732 } elsif ($sv->FLAGS & SVf_IOK) {
733 $hr->{svval} .= $sv->int_value;
734 } elsif ($sv->FLAGS & SVf_POK) {
735 $hr->{svval} .= cstring($sv->PV);
736 } elsif (class($sv) eq "HV") {
737 $hr->{svval} .= 'HASH';
738 } elsif (class($sv) eq "AV") {
739 $hr->{svval} .= 'ARRAY';
740 } elsif (class($sv) eq "CV") {
741 if ($sv->CvFLAGS & CVf_ANON) {
742 $hr->{svval} .= 'CODE';
743 } elsif ($sv->CvFLAGS & CVf_NAMED) {
745 unless ($sv->CvFLAGS & CVf_LEXICAL) {
746 my $stash = $sv->STASH;
747 unless (class($stash) eq "SPECIAL") {
748 $hr->{svval} .= $stash->NAME . "::";
751 $hr->{svval} .= $sv->NAME_HEK;
755 my $stash = $sv->STASH;
756 unless (class($stash) eq "SPECIAL") {
757 $hr->{svval} .= $stash->NAME . "::";
759 $hr->{svval} .= $sv->SAFENAME;
763 $hr->{svval} = 'undef' unless defined $hr->{svval};
764 my $out = $hr->{svclass};
765 return $out .= " $hr->{svval}" ;
773 if ($fullnm eq '-e') {
774 $srclines{$fullnm} = [ $fullnm, "-src not supported for -e" ];
777 open (my $fh, '<', $fullnm)
778 or warn "# $fullnm: $!, (chdirs not supported by this feature yet)\n"
782 unshift @l, $fullnm; # like @{_<$fullnm} in debug, array starts at 1
783 $srclines{$fullnm} = \@l;
786 # Given a pad target, return the pad var's name and cop range /
787 # fakeness, or failing that, its target number.
791 # ('$i', '$i:fake:a')
798 my ($targarg, $targarglife);
799 my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$targ];
800 if (defined $padname and class($padname) ne "SPECIAL" and
803 $targarg = $padname->PVX;
804 if ($padname->FLAGS & SVf_FAKE) {
805 # These changes relate to the jumbo closure fix.
806 # See changes 19939 and 20005
809 if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_ANON;
811 if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_MULTI;
812 $fake .= ':' . $padname->PARENT_PAD_INDEX
813 if $curcv->CvFLAGS & CVf_ANON;
814 $targarglife = "$targarg:FAKE:$fake";
817 my $intro = $padname->COP_SEQ_RANGE_LOW - $cop_seq_base;
818 my $finish = int($padname->COP_SEQ_RANGE_HIGH) - $cop_seq_base;
819 $finish = "end" if $finish == 999999999 - $cop_seq_base;
820 $targarglife = "$targarg:$intro,$finish";
823 $targarglife = $targarg = "t" . $targ;
825 return $targarg, $targarglife;
831 my ($op, $level, $format) = @_;
833 $h{exname} = $h{name} = $op->name;
834 $h{NAME} = uc $h{name};
835 $h{class} = class($op);
836 $h{extarg} = $h{targ} = $op->targ;
837 $h{extarg} = "" unless $h{extarg};
838 $h{privval} = $op->private;
839 # for null ops, targ holds the old type
840 my $origname = $h{name} eq "null" && $h{targ}
841 ? substr(ppname($h{targ}), 3)
843 $h{private} = private_flags($origname, $op->private);
845 $h{private} &&= "$h{private},";
846 $h{private} .= "FOLD";
849 if ($h{name} ne $origname) { # a null op
850 $h{exname} = "ex-$origname";
852 } elsif ($h{private} =~ /\bREFC\b/) {
853 # targ holds a reference count
854 my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
855 $h{targarglife} = $h{targarg} = "$h{targ} $refs";
857 my $count = $h{name} eq 'padrange'
858 ? ($op->private & $B::Op_private::defines{'OPpPADRANGE_COUNTMASK'})
860 my (@targarg, @targarglife);
861 for my $i (0..$count-1) {
862 my ($targarg, $targarglife) = padname($h{targ} + $i);
863 push @targarg, $targarg;
864 push @targarglife, $targarglife;
866 $h{targarg} = join '; ', @targarg;
867 $h{targarglife} = join '; ', @targarglife;
871 $h{svclass} = $h{svaddr} = $h{svval} = "";
872 if ($h{class} eq "PMOP") {
874 my $precomp = $op->precomp;
875 if (defined $precomp) {
876 $precomp = cstring($precomp); # Escape literal control sequences
877 $precomp = "/$precomp/";
881 if ($op->name eq 'subst') {
882 if (class($op->pmreplstart) ne "NULL") {
884 $extra = " replstart->" . seq($op->pmreplstart);
887 elsif ($op->name eq 'split') {
888 if ( ($op->private & OPpSPLIT_ASSIGN) # @array = split
889 && (not $op->flags & OPf_STACKED)) # @{expr} = split
891 # with C<@array = split(/pat/, str);>,
892 # array is stored in /pat/'s pmreplroot; either
893 # as an integer index into the pad (for a lexical array)
894 # or as GV for a package array (which will be a pad index
895 # on threaded builds)
897 if ($op->private & $B::Op_private::defines{'OPpSPLIT_LEX'}) {
898 my $off = $op->pmreplroot; # union with op_pmtargetoff
899 my ($name, $full) = padname($off);
900 $extra = " => $full";
903 # union with op_pmtargetoff, op_pmtargetgv
904 my $gv = $op->pmreplroot;
906 # the value is actually a pad offset
907 $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$gv]->NAME;
910 # unthreaded: its a GV
913 $extra = " => \@$gv";
917 $h{arg} = "($precomp$extra)";
918 } elsif ($h{class} eq "PVOP" and $h{name} !~ '^transr?\z') {
919 $h{arg} = '("' . $op->pv . '")';
920 $h{svval} = '"' . $op->pv . '"';
921 } elsif ($h{class} eq "COP") {
922 my $label = $op->label;
923 $h{coplabel} = $label;
924 $label = $label ? "$label: " : "";
930 my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
931 $h{arg} = "($label$stash $cseq $loc)";
933 fill_srclines($pathnm) unless exists $srclines{$pathnm};
934 my $line = $srclines{$pathnm}[$ln] // "-src unavailable under -e";
935 $h{src} = "$ln: $line";
937 } elsif ($h{class} eq "LOOP") {
938 $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
939 . " redo->" . seq($op->redoop) . ")";
940 } elsif ($h{class} eq "LOGOP") {
942 $h{arg} = "(other->" . seq($op->other) . ")";
943 $h{otheraddr} = sprintf("%#x", $ {$op->other});
944 if ($h{name} eq "argdefelem") {
945 # targ used for element index
946 $h{targarglife} = $h{targarg} = "";
947 $h{arg} .= "[" . $op->targ . "]";
950 elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") {
951 unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
952 my $idx = ($h{class} eq "SVOP") ? $op->targ : $op->padix;
953 if ($h{class} eq "PADOP" or !${$op->sv}) {
954 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$idx];
955 $h{arg} = "[" . concise_sv($sv, \%h, 0) . "]";
956 $h{targarglife} = $h{targarg} = "";
958 $h{arg} = "(" . concise_sv($op->sv, \%h, 0) . ")";
962 elsif ($h{class} eq "METHOP") {
964 if ($h{name} eq 'method_redir' or $h{name} eq 'method_redir_super') {
965 my $rclass_sv = $op->rclass;
966 $rclass_sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$rclass_sv]
967 unless ref $rclass_sv;
968 $prefix .= 'PACKAGE "'.$rclass_sv->PV.'", ';
970 if ($h{name} ne "method") {
971 if (${$op->meth_sv}) {
972 $h{arg} = "($prefix" . concise_sv($op->meth_sv, \%h, 1) . ")";
974 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->targ];
975 $h{arg} = "[$prefix" . concise_sv($sv, \%h, 1) . "]";
976 $h{targarglife} = $h{targarg} = "";
980 elsif ($h{class} eq "UNOP_AUX") {
981 $h{arg} = "(" . $op->string($curcv) . ")";
984 $h{seq} = $h{hyphseq} = seq($op);
985 $h{seq} = "" if $h{seq} eq "-";
987 $h{label} = $labels{$$op};
988 $h{next} = $op->next;
989 $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
990 $h{nextaddr} = sprintf("%#x", $ {$op->next});
991 $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
992 $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
993 $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
995 $h{classsym} = $opclass{$h{class}};
996 $h{flagval} = $op->flags;
997 $h{flags} = op_flags($op->flags);
998 if ($op->can("hints")) {
999 $h{hintsval} = $op->hints;
1000 $h{hints} = hints_flags($h{hintsval});
1002 $h{hintsval} = $h{hints} = '';
1004 $h{addr} = sprintf("%#x", $$op);
1005 $h{typenum} = $op->type;
1006 $h{noise} = $linenoise[$op->type];
1008 return fmt_line(\%h, $op, $format, $level);
1011 sub B::OP::concise {
1012 my($op, $level) = @_;
1013 if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
1014 # insert a 'goto' line
1015 my $synth = {"seq" => seq($lastnext), "class" => class($lastnext),
1016 "addr" => sprintf("%#x", $$lastnext),
1017 "goto" => seq($lastnext), # simplify goto '-' removal
1019 print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
1021 $lastnext = $op->next;
1022 print $walkHandle concise_op($op, $level, $format);
1025 # B::OP::terse (see Terse.pm) now just calls this
1027 my($op, $level) = @_;
1029 # This isn't necessarily right, but there's no easy way to get
1030 # from an OP to the right CV. This is a limitation of the
1031 # ->terse() interface style, and there isn't much to do about
1032 # it. In particular, we can die in concise_op if the main pad
1033 # isn't long enough, or has the wrong kind of entries, compared to
1034 # the pad a sub was compiled with. The fix for that would be to
1035 # make a backwards compatible "terse" format that never even
1036 # looked at the pad, just like the old B::Terse. I don't think
1037 # that's worth the effort, though.
1038 $curcv = main_cv unless $curcv;
1040 if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
1042 my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
1043 "addr" => sprintf("%#x", $$lastnext)};
1045 fmt_line($h, $op, $style{"terse"}[1], $level+1);
1047 $lastnext = $op->next;
1049 concise_op($op, $level, $style{"terse"}[0]);
1055 my $style = $tree_decorations[$tree_style];
1056 my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
1057 my $name = concise_op($op, $level, $treefmt);
1058 if (not $op->flags & OPf_KIDS) {
1059 return $name . "\n";
1062 for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
1063 push @lines, tree($kid, $level+1);
1066 for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
1067 $lines[$i] = $space . $lines[$i];
1070 $lines[$i] = $last . $lines[$i];
1072 if (substr($lines[$i], 0, 1) eq " ") {
1073 $lines[$i] = $nokid . $lines[$i];
1075 $lines[$i] = $kid . $lines[$i];
1078 $lines[$i] = $kids . $lines[$i];
1080 $lines[0] = $single . $lines[0];
1082 return("$name$lead" . shift @lines,
1083 map(" " x (length($name)+$size) . $_, @lines));
1086 # *** Warning: fragile kludge ahead ***
1087 # Because the B::* modules run in the same interpreter as the code
1088 # they're compiling, their presence tends to distort the view we have of
1089 # the code we're looking at. In particular, perl gives sequence numbers
1090 # to COPs. If the program we're looking at were run on its own, this
1091 # would start at 1. Because all of B::Concise and all the modules it
1092 # uses are compiled first, though, by the time we get to the user's
1093 # program the sequence number is already pretty high, which could be
1094 # distracting if you're trying to tell OPs apart. Therefore we'd like to
1095 # subtract an offset from all the sequence numbers we display, to
1096 # restore the simpler view of the world. The trick is to know what that
1097 # offset will be, when we're still compiling B::Concise! If we
1098 # hardcoded a value, it would have to change every time B::Concise or
1099 # other modules we use do. To help a little, what we do here is compile
1100 # a little code at the end of the module, and compute the base sequence
1101 # number for the user's program as being a small offset later, so all we
1102 # have to worry about are changes in the offset.
1104 # When you say "perl -MO=Concise -e '$a'", the output should look like:
1106 # 4 <@> leave[t1] vKP/REFC ->(end)
1108 #^ smallest OP sequence number should be 1
1109 # 2 <;> nextstate(main 1 -e:1) v ->3
1110 # ^ smallest COP sequence number should be 1
1111 # - <1> ex-rv2sv vK/1 ->4
1112 # 3 <$> gvsv(*a) s ->4
1114 # If the second of the marked numbers there isn't 1, it means you need
1115 # to update the corresponding magic number in the next line.
1116 # Remember, this needs to stay the last things in the module.
1118 my $cop_seq_mnum = 12;
1119 $cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum;
1127 B::Concise - Walk Perl syntax tree, printing concise info about ops
1131 perl -MO=Concise[,OPTIONS] foo.pl
1133 use B::Concise qw(set_style add_callback);
1137 This compiler backend prints the internal OPs of a Perl program's syntax
1138 tree in one of several space-efficient text formats suitable for debugging
1139 the inner workings of perl or other compiler backends. It can print OPs in
1140 the order they appear in the OP tree, in the order they will execute, or
1141 in a text approximation to their tree structure, and the format of the
1142 information displayed is customizable. Its function is similar to that of
1143 perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
1144 sophisticated and flexible.
1148 Here's two outputs (or 'renderings'), using the -exec and -basic
1149 (i.e. default) formatting conventions on the same code snippet.
1151 % perl -MO=Concise,-exec -e '$a = $b + 42'
1153 2 <;> nextstate(main 1 -e:1) v
1155 4 <$> const[IV 42] s
1156 * 5 <2> add[t3] sK/2
1159 8 <@> leave[1 ref] vKP/REFC
1161 In this -exec rendering, each opcode is executed in the order shown.
1162 The add opcode, marked with '*', is discussed in more detail.
1164 The 1st column is the op's sequence number, starting at 1, and is
1165 displayed in base 36 by default. Here they're purely linear; the
1166 sequences are very helpful when looking at code with loops and
1169 The symbol between angle brackets indicates the op's type, for
1170 example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is
1171 used in threaded perls. (see L</"OP class abbreviations">).
1173 The opname, as in B<'add[t1]'>, may be followed by op-specific
1174 information in parentheses or brackets (ex B<'[t1]'>).
1176 The op-flags (ex B<'sK/2'>) are described in (L</"OP flags
1179 % perl -MO=Concise -e '$a = $b + 42'
1180 8 <@> leave[1 ref] vKP/REFC ->(end)
1182 2 <;> nextstate(main 1 -e:1) v ->3
1183 7 <2> sassign vKS/2 ->8
1184 * 5 <2> add[t1] sK/2 ->6
1185 - <1> ex-rv2sv sK/1 ->4
1186 3 <$> gvsv(*b) s ->4
1187 4 <$> const(IV 42) s ->5
1188 - <1> ex-rv2sv sKRM*/1 ->7
1189 6 <$> gvsv(*a) s ->7
1191 The default rendering is top-down, so they're not in execution order.
1192 This form reflects the way the stack is used to parse and evaluate
1193 expressions; the add operates on the two terms below it in the tree.
1195 Nullops appear as C<ex-opname>, where I<opname> is an op that has been
1196 optimized away by perl. They're displayed with a sequence-number of
1197 '-', because they are not executed (they don't appear in previous
1198 example), they're printed here because they reflect the parse.
1200 The arrow points to the sequence number of the next op; they're not
1201 displayed in -exec mode, for obvious reasons.
1203 Note that because this rendering was done on a non-threaded perl, the
1204 PADOPs in the previous examples are now SVOPs, and some (but not all)
1205 of the square brackets have been replaced by round ones. This is a
1206 subtle feature to provide some visual distinction between renderings
1207 on threaded and un-threaded perls.
1212 Arguments that don't start with a hyphen are taken to be the names of
1213 subroutines or formats to render; if no
1214 such functions are specified, the main
1215 body of the program (outside any subroutines, and not including use'd
1216 or require'd files) is rendered. Passing C<BEGIN>, C<UNITCHECK>,
1217 C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding
1218 special blocks to be printed. Arguments must follow options.
1220 Options affect how things are rendered (ie printed). They're presented
1221 here by their visual effect, 1st being strongest. They're grouped
1222 according to how they interrelate; within each group the options are
1223 mutually exclusive (unless otherwise stated).
1225 =head2 Options for Opcode Ordering
1227 These options control the 'vertical display' of opcodes. The display
1228 'order' is also called 'mode' elsewhere in this document.
1234 Print OPs in the order they appear in the OP tree (a preorder
1235 traversal, starting at the root). The indentation of each OP shows its
1236 level in the tree, and the '->' at the end of the line indicates the
1237 next opcode in execution order. This mode is the default, so the flag
1238 is included simply for completeness.
1242 Print OPs in the order they would normally execute (for the majority
1243 of constructs this is a postorder traversal of the tree, ending at the
1244 root). In most cases the OP that usually follows a given OP will
1245 appear directly below it; alternate paths are shown by indentation. In
1246 cases like loops when control jumps out of a linear path, a 'goto'
1251 Print OPs in a text approximation of a tree, with the root of the tree
1252 at the left and 'left-to-right' order of children transformed into
1253 'top-to-bottom'. Because this mode grows both to the right and down,
1254 it isn't suitable for large programs (unless you have a very wide
1259 =head2 Options for Line-Style
1261 These options select the line-style (or just style) used to render
1262 each opcode, and dictates what info is actually printed into each line.
1268 Use the author's favorite set of formatting conventions. This is the
1273 Use formatting conventions that emulate the output of B<B::Terse>. The
1274 basic mode is almost indistinguishable from the real B<B::Terse>, and the
1275 exec mode looks very similar, but is in a more logical order and lacks
1276 curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
1277 is only vaguely reminiscent of B<B::Terse>.
1281 Use formatting conventions in which the name of each OP, rather than being
1282 written out in full, is represented by a one- or two-character abbreviation.
1283 This is mainly a joke.
1287 Use formatting conventions reminiscent of B<B::Debug>; these aren't
1288 very concise at all.
1292 Use formatting conventions read from the environment variables
1293 C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
1297 =head2 Options for tree-specific formatting
1303 Use a tree format in which the minimum amount of space is used for the
1304 lines connecting nodes (one character in most cases). This squeezes out
1305 a few precious columns of screen real estate.
1309 Use a tree format that uses longer edges to separate OP nodes. This format
1310 tends to look better than the compact one, especially in ASCII, and is
1315 Use tree connecting characters drawn from the VT100 line-drawing set.
1316 This looks better if your terminal supports it.
1320 Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
1321 look as clean as the VT100 characters, but they'll work with almost any
1322 terminal (or the horizontal scrolling mode of less(1)) and are suitable
1323 for text documentation or email. This is the default.
1327 These are pairwise exclusive, i.e. compact or loose, vt or ascii.
1329 =head2 Options controlling sequence numbering
1335 Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
1336 digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
1337 for 37 will be 'A', and so on until 62. Values greater than 62 are not
1338 currently supported. The default is 36.
1342 Print sequence numbers with the most significant digit first. This is the
1343 usual convention for Arabic numerals, and the default.
1345 =item B<-littleendian>
1347 Print sequence numbers with the least significant digit first. This is
1348 obviously mutually exclusive with bigendian.
1352 =head2 Other options
1358 With this option, the rendering of each statement (starting with the
1359 nextstate OP) will be preceded by the 1st line of source code that
1360 generates it. For example:
1364 2 <;> nextstate(main 1 junk.pl:1) v:{
1365 3 <0> padsv[$i:1,10] vM/LVINTRO
1366 # 3: for $i (0..9) {
1367 4 <;> nextstate(main 3 junk.pl:3) v:{
1371 8 <{> enteriter(next->j last->m redo->9)[$i:1,10] lKS
1373 l <|> and(other->9) vK/1
1375 9 <;> nextstate(main 2 junk.pl:4) v
1377 b <$> const[PV "line "] s
1382 =item B<-stash="somepackage">
1384 With this, "somepackage" will be required, then the stash is
1385 inspected, and each function is rendered.
1389 The following options are pairwise exclusive.
1395 Include the main program in the output, even if subroutines were also
1396 specified. This rendering is normally suppressed when a subroutine
1397 name or reference is given.
1401 This restores the default behavior after you've changed it with '-main'
1402 (it's not normally needed). If no subroutine name/ref is given, main is
1403 rendered, regardless of this flag.
1407 Renderings usually include a banner line identifying the function name
1408 or stringified subref. This suppresses the printing of the banner.
1410 TBC: Remove the stringified coderef; while it provides a 'cookie' for
1411 each function rendered, the cookies used should be 1,2,3.. not a
1412 random hex-address. It also complicates string comparison of two
1417 restores default banner behavior.
1419 =item B<-banneris> => subref
1421 TBC: a hookpoint (and an option to set it) for a user-supplied
1422 function to produce a banner appropriate for users needs. It's not
1423 ideal, because the rendering-state variables, which are a natural
1424 candidate for use in concise.t, are unavailable to the user.
1428 =head2 Option Stickiness
1430 If you invoke Concise more than once in a program, you should know that
1431 the options are 'sticky'. This means that the options you provide in
1432 the first call will be remembered for the 2nd call, unless you
1433 re-specify or change them.
1435 =head1 ABBREVIATIONS
1437 The concise style uses symbols to convey maximum info with minimal
1438 clutter (like hex addresses). With just a little practice, you can
1439 start to see the flowers, not just the branches, in the trees.
1441 =head2 OP class abbreviations
1443 These symbols appear before the op-name, and indicate the
1444 B:: namespace that represents the ops in your Perl code.
1446 0 OP (aka BASEOP) An OP with no children
1447 1 UNOP An OP with one child
1448 + UNOP_AUX A UNOP with auxillary fields
1449 2 BINOP An OP with two children
1450 | LOGOP A control branch OP
1451 @ LISTOP An OP that could have lots of children
1452 / PMOP An OP with a regular expression
1453 $ SVOP An OP with an SV
1454 " PVOP An OP with a string
1455 { LOOP An OP that holds pointers for a loop
1456 ; COP An OP that marks the start of a statement
1457 # PADOP An OP with a GV on the pad
1458 . METHOP An OP with method call info
1460 =head2 OP flags abbreviations
1462 OP flags are either public or private. The public flags alter the
1463 behavior of each opcode in consistent ways, and are represented by 0
1464 or more single characters.
1466 v OPf_WANT_VOID Want nothing (void context)
1467 s OPf_WANT_SCALAR Want single value (scalar context)
1468 l OPf_WANT_LIST Want list of any length (list context)
1470 K OPf_KIDS There is a firstborn child.
1471 P OPf_PARENS This operator was parenthesized.
1472 (Or block needs explicit scope entry.)
1473 R OPf_REF Certified reference.
1474 (Return container, not containee).
1475 M OPf_MOD Will modify (lvalue).
1476 S OPf_STACKED Some arg is arriving on the stack.
1477 * OPf_SPECIAL Do something weird for this op (see op.h)
1479 Private flags, if any are set for an opcode, are displayed after a '/'
1481 8 <@> leave[1 ref] vKP/REFC ->(end)
1482 7 <2> sassign vKS/2 ->8
1484 They're opcode specific, and occur less often than the public ones, so
1485 they're represented by short mnemonics instead of single-chars; see
1486 B::Op_private and F<regen/op_private> for more details.
1488 =head1 FORMATTING SPECIFICATIONS
1490 For each line-style ('concise', 'terse', 'linenoise', etc.) there are
1491 3 format-specs which control how OPs are rendered.
1493 The first is the 'default' format, which is used in both basic and exec
1494 modes to print all opcodes. The 2nd, goto-format, is used in exec
1495 mode when branches are encountered. They're not real opcodes, and are
1496 inserted to look like a closing curly brace. The tree-format is tree
1499 When a line is rendered, the correct format-spec is copied and scanned
1500 for the following items; data is substituted in, and other
1501 manipulations like basic indenting are done, for each opcode rendered.
1503 There are 3 kinds of items that may be populated; special patterns,
1504 #vars, and literal text, which is copied verbatim. (Yes, it's a set
1507 =head2 Special Patterns
1509 These items are the primitives used to perform indenting, and to
1510 select text from amongst alternatives.
1514 =item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
1516 Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
1518 =item B<(*(>I<text>B<)*)>
1520 Generates one copy of I<text> for each indentation level.
1522 =item B<(*(>I<text1>B<;>I<text2>B<)*)>
1524 Generates one fewer copies of I<text1> than the indentation level, followed
1525 by one copy of I<text2> if the indentation level is more than 0.
1527 =item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
1529 If the value of I<var> is true (not empty or zero), generates the
1530 value of I<var> surrounded by I<text1> and I<Text2>, otherwise
1535 Any number of tildes and surrounding whitespace will be collapsed to
1542 These #vars represent opcode properties that you may want as part of
1543 your rendering. The '#' is intended as a private sigil; a #var's
1544 value is interpolated into the style-line, much like "read $this".
1546 These vars take 3 forms:
1552 A property named 'var' is assumed to exist for the opcodes, and is
1553 interpolated into the rendering.
1555 =item B<#>I<var>I<N>
1557 Generates the value of I<var>, left justified to fill I<N> spaces.
1558 Note that this means while you can have properties 'foo' and 'foo2',
1559 you cannot render 'foo2', but you could with 'foo2a'. You would be
1560 wise not to rely on this behavior going forward ;-)
1564 This ucfirst form of #var generates a tag-value form of itself for
1565 display; it converts '#Var' into a 'Var => #var' style, which is then
1566 handled as described above. (Imp-note: #Vars cannot be used for
1567 conditional-fills, because the => #var transform is done after the check
1572 The following variables are 'defined' by B::Concise; when they are
1573 used in a style, their respective values are plugged into the
1574 rendering of each opcode.
1576 Only some of these are used by the standard styles, the others are
1577 provided for you to delve into optree mechanics, should you wish to
1578 add a new style (see L</add_style> below) that uses them. You can
1579 also add new ones using L</add_callback>.
1585 The address of the OP, in hexadecimal.
1589 The OP-specific information of the OP (such as the SV for an SVOP, the
1590 non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
1594 The B-determined class of the OP, in all caps.
1598 A single symbol abbreviating the class of the OP.
1602 The label of the statement or block the OP is the start of, if any.
1606 The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
1610 The target of the OP, or nothing for a nulled OP.
1614 The address of the OP's first child, in hexadecimal.
1618 The OP's flags, abbreviated as a series of symbols.
1622 The numeric value of the OP's flags.
1626 The COP's hint flags, rendered with abbreviated names if possible. An empty
1627 string if this is not a COP. Here are the symbols used:
1632 x$ explicit use/no strict refs
1633 x& explicit use/no strict subs
1634 x* explicit use/no strict vars
1652 us use feature 'unicode_strings'
1653 fea=NNN feature bundle number
1657 The numeric value of the COP's hint flags, or an empty string if this is not
1662 The sequence number of the OP, or a hyphen if it doesn't have one.
1666 'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
1667 mode, or empty otherwise.
1671 The address of the OP's last child, in hexadecimal.
1679 The OP's name, in all caps.
1683 The sequence number of the OP's next OP.
1687 The address of the OP's next OP, in hexadecimal.
1691 A one- or two-character abbreviation for the OP's name.
1695 The OP's private flags, rendered with abbreviated names if possible.
1699 The numeric value of the OP's private flags.
1703 The sequence number of the OP. Note that this is a sequence number
1704 generated by B::Concise.
1708 Whether or not the op has been optimized by the peephole optimizer.
1712 The address of the OP's next youngest sibling, in hexadecimal.
1716 The address of the OP's SV, if it has an SV, in hexadecimal.
1720 The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
1724 The value of the OP's SV, if it has one, in a short human-readable format.
1728 The numeric value of the OP's targ.
1732 The name of the variable the OP's targ refers to, if any, otherwise the
1733 letter t followed by the OP's targ in decimal.
1735 =item B<#targarglife>
1737 Same as B<#targarg>, but followed by the COP sequence numbers that delimit
1738 the variable's lifetime (or 'end' for a variable in an open scope) for a
1743 The numeric value of the OP's type, in decimal.
1747 =head1 One-Liner Command tips
1751 =item perl -MO=Concise,bar foo.pl
1753 Renders only bar() from foo.pl. To see main, drop the ',bar'. To see
1756 =item perl -MDigest::MD5=md5 -MO=Concise,md5 -e1
1758 Identifies md5 as an XS function. The export is needed so that BC can
1761 =item perl -MPOSIX -MO=Concise,_POSIX_ARG_MAX -e1
1763 Identifies _POSIX_ARG_MAX as a constant sub, optimized to an IV.
1764 Although POSIX isn't entirely consistent across platforms, this is
1765 likely to be present in virtually all of them.
1767 =item perl -MPOSIX -MO=Concise,a -e 'print _POSIX_SAVED_IDS'
1769 This renders a print statement, which includes a call to the function.
1770 It's identical to rendering a file with a use call and that single
1771 statement, except for the filename which appears in the nextstate ops.
1773 =item perl -MPOSIX -MO=Concise,a -e 'sub a{_POSIX_SAVED_IDS}'
1775 This is B<very> similar to previous, only the first two ops differ. This
1776 subroutine rendering is more representative, insofar as a single main
1777 program will have many subs.
1779 =item perl -MB::Concise -e 'B::Concise::compile("-exec","-src", \%B::Concise::)->()'
1781 This renders all functions in the B::Concise package with the source
1782 lines. It eschews the O framework so that the stashref can be passed
1783 directly to B::Concise::compile(). See -stash option for a more
1784 convenient way to render a package.
1788 =head1 Using B::Concise outside of the O framework
1790 The common (and original) usage of B::Concise was for command-line
1791 renderings of simple code, as given in EXAMPLE. But you can also use
1792 B<B::Concise> from your code, and call compile() directly, and
1793 repeatedly. By doing so, you can avoid the compile-time only
1794 operation of O.pm, and even use the debugger to step through
1795 B::Concise::compile() itself.
1797 Once you're doing this, you may alter Concise output by adding new
1798 rendering styles, and by optionally adding callback routines which
1799 populate new variables, if such were referenced from those (just
1802 =head2 Example: Altering Concise Renderings
1804 use B::Concise qw(set_style add_callback);
1805 add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
1808 my ($h, $op, $format, $level, $stylename) = @_;
1809 $h->{variable} = some_func($op);
1811 $walker = B::Concise::compile(@options,@subnames,@subrefs);
1816 B<set_style> accepts 3 arguments, and updates the three format-specs
1817 comprising a line-style (basic-exec, goto, tree). It has one minor
1818 drawback though; it doesn't register the style under a new name. This
1819 can become an issue if you render more than once and switch styles.
1820 Thus you may prefer to use add_style() and/or set_style_standard()
1823 =head2 set_style_standard($name)
1825 This restores one of the standard line-styles: C<terse>, C<concise>,
1826 C<linenoise>, C<debug>, C<env>, into effect. It also accepts style
1827 names previously defined with add_style().
1831 This subroutine accepts a new style name and three style arguments as
1832 above, and creates, registers, and selects the newly named style. It is
1833 an error to re-add a style; call set_style_standard() to switch between
1836 =head2 add_callback ()
1838 If your newly minted styles refer to any new #variables, you'll need
1839 to define a callback subroutine that will populate (or modify) those
1840 variables. They are then available for use in the style you've
1843 The callbacks are called for each opcode visited by Concise, in the
1844 same order as they are added. Each subroutine is passed five
1847 1. A hashref, containing the variable names and values which are
1848 populated into the report-line for the op
1849 2. the op, as a B<B::OP> object
1850 3. a reference to the format string
1851 4. the formatting (indent) level
1852 5. the selected stylename
1854 To define your own variables, simply add them to the hash, or change
1855 existing values if you need to. The level and format are passed in as
1856 references to scalars, but it is unlikely that they will need to be
1857 changed or even used.
1859 =head2 Running B::Concise::compile()
1861 B<compile> accepts options as described above in L</OPTIONS>, and
1862 arguments, which are either coderefs, or subroutine names.
1864 It constructs and returns a $treewalker coderef, which when invoked,
1865 traverses, or walks, and renders the optrees of the given arguments to
1866 STDOUT. You can reuse this, and can change the rendering style used
1867 each time; thereafter the coderef renders in the new style.
1869 B<walk_output> lets you change the print destination from STDOUT to
1870 another open filehandle, or into a string passed as a ref (unless
1871 you've built perl with -Uuseperlio).
1873 my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1
1874 walk_output(\my $buf);
1875 $walker->(); # 1 renders -terse
1876 set_style_standard('concise'); # 2
1877 $walker->(); # 2 renders -concise
1878 $walker->(@new); # 3 renders whatever
1879 print "3 different renderings: terse, concise, and @new: $buf\n";
1881 When $walker is called, it traverses the subroutines supplied when it
1882 was created, and renders them using the current style. You can change
1883 the style afterwards in several different ways:
1885 1. call C<compile>, altering style or mode/order
1886 2. call C<set_style_standard>
1887 3. call $walker, passing @new options
1889 Passing new options to the $walker is the easiest way to change
1890 amongst any pre-defined styles (the ones you add are automatically
1891 recognized as options), and is the only way to alter rendering order
1892 without calling compile again. Note however that rendering state is
1893 still shared amongst multiple $walker objects, so they must still be
1894 used in a coordinated manner.
1896 =head2 B::Concise::reset_sequence()
1898 This function (not exported) lets you reset the sequence numbers (note
1899 that they're numbered arbitrarily, their goal being to be human
1900 readable). Its purpose is mostly to support testing, i.e. to compare
1901 the concise output from two identical anonymous subroutines (but
1902 different instances). Without the reset, B::Concise, seeing that
1903 they're separate optrees, generates different sequence numbers in
1908 Errors in rendering (non-existent function-name, non-existent coderef)
1909 are written to the STDOUT, or wherever you've set it via
1912 Errors using the various *style* calls, and bad args to walk_output(),
1913 result in die(). Use an eval if you wish to catch these errors and
1914 continue processing.
1918 Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.