This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [patch] decrufting OptreeCheck stuff
[perl5.git] / ext / B / B / Concise.pm
1 package B::Concise;
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.
5
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.
11
12 use strict; # use #2
13 use warnings; # uses #3 and #4, since warnings uses Carp
14
15 use Exporter (); # use #5
16
17 our $VERSION   = "0.64";
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 );
22 our %EXPORT_TAGS =
23     ( io        => [qw( walk_output compile reset_sequence )],
24       style     => [qw( add_style set_style_standard )],
25       cb        => [qw( add_callback )],
26       mech      => [qw( concise_subref concise_cv concise_main )],  );
27
28 # use #6
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
31          CVf_ANON);
32
33 my %style =
34   ("terse" =>
35    ["(?(#label =>\n)?)(*(    )*)#class (#addr) #name (?([#targ])?) "
36     . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
37     "(*(    )*)goto #class (#addr)\n",
38     "#class pp_#name"],
39    "concise" =>
40    ["#hyphseq2 (*(   (x( ;)x))*)<#classsym> "
41     . "#exname#arg(?([#targarglife])?)~#flags(?(/#private)?)(x(;~->#next)x)\n"
42     , "  (*(    )*)     goto #seq\n",
43     "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
44    "linenoise" =>
45    ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
46     "gt_#seq ",
47     "(?(#seq)?)#noise#arg(?([#targarg])?)"],
48    "debug" =>
49    ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t"
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)?)",
55     "    GOTO #addr\n",
56     "#addr"],
57    "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
58              $ENV{B_CONCISE_TREE_FORMAT}],
59   );
60
61 # Renderings, ie how Concise prints, is controlled by these vars
62 # primary:
63 our $stylename;         # selects current style from %style
64 my $order = "basic";    # how optree is walked & printed: basic, exec, tree
65
66 # rendering mechanics:
67 # these 'formats' are the line-rendering templates
68 # they're updated from %style when $stylename changes
69 my ($format, $gotofmt, $treefmt);
70
71 # lesser players:
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
77
78 # another factor: can affect all styles!
79 our @callbacks;         # allow external management
80
81 set_style_standard("concise");
82
83 my $curcv;
84 my $cop_seq_base;
85
86 sub set_style {
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;
90 }
91
92 sub add_style {
93     my ($newstyle,@args) = @_;
94     die "style '$newstyle' already exists, choose a new name\n"
95         if exists $style{$newstyle};
96     die "expecting 3 style-format args\n" unless @args == 3;
97     $style{$newstyle} = [@args];
98     $stylename = $newstyle; # update rendering state
99 }
100
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}});
105 }
106
107 sub add_callback {
108     push @callbacks, @_;
109 }
110
111 # output handle, used with all Concise-output printing
112 our $walkHandle;        # public for your convenience
113 BEGIN { $walkHandle = \*STDOUT }
114
115 sub walk_output { # updates $walkHandle
116     my $handle = shift;
117     return $walkHandle unless $handle; # allow use as accessor
118
119     if (ref $handle eq 'SCALAR') {
120         require Config;
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
126         return $walkHandle;
127     }
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;
132 }
133
134 sub concise_subref {
135     my($order, $coderef) = @_;
136     my $codeobj = svref_2object($coderef);
137
138     return concise_stashref(@_) 
139         unless ref $codeobj eq 'B::CV';
140     concise_cv_obj($order, $codeobj);
141 }
142
143 sub concise_stashref {
144     my($order, $h) = @_;
145     foreach my $k (sort keys %$h) {
146         local *s = $h->{$k};
147         my $coderef = *s{CODE} or next;
148         reset_sequence();
149         print "FUNC: ", *s, "\n";
150         my $codeobj = svref_2object($coderef);
151         next unless ref $codeobj eq 'B::CV';
152         eval { concise_cv_obj($order, $codeobj) }
153         or warn "err $@ on $codeobj";
154     }
155 }
156
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(@_); }
160
161 sub concise_cv_obj {
162     my ($order, $cv) = @_;
163     $curcv = $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);
170     } else {
171         print $walkHandle tree($cv->ROOT, 0);
172     }
173 }
174
175 sub concise_main {
176     my($order) = @_;
177     sequence(main_start);
178     $curcv = main_cv;
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);
189     }
190 }
191
192 sub concise_specials {
193     my($name, $order, @cv_s) = @_;
194     my $i = 1;
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
199     }
200     for my $cv (@cv_s) {
201         print $walkHandle "$name $i:\n";
202         $i++;
203         concise_cv_obj($order, $cv);
204     }
205 }
206
207 my $start_sym = "\e(0"; # "\cN" sometimes also works
208 my $end_sym   = "\e(B"; # "\cO" respectively
209
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],
215   );
216
217
218 sub compileOpts {
219     # set rendering state from options and args
220     my @options = grep(/^-/, @_);
221     my @args = grep(!/^-/, @_);
222     for my $o (@options) {
223         # mode/order
224         if ($o eq "-basic") {
225             $order = "basic";
226         } elsif ($o eq "-exec") {
227             $order = "exec";
228         } elsif ($o eq "-tree") {
229             $order = "tree";
230         }
231         # tree-specific
232         elsif ($o eq "-compact") {
233             $tree_style |= 1;
234         } elsif ($o eq "-loose") {
235             $tree_style &= ~1;
236         } elsif ($o eq "-vt") {
237             $tree_style |= 2;
238         } elsif ($o eq "-ascii") {
239             $tree_style &= ~2;
240         }
241         # sequence numbering
242         elsif ($o =~ /^-base(\d+)$/) {
243             $base = $1;
244         } elsif ($o eq "-bigendian") {
245             $big_endian = 1;
246         } elsif ($o eq "-littleendian") {
247             $big_endian = 0;
248         }
249         elsif ($o eq "-nobanner") {
250             $banner = 0;
251         } elsif ($o eq "-banner") {
252             $banner = 1;
253         }
254         elsif ($o eq "-main") {
255             $do_main = 1;
256         } elsif ($o eq "-nomain") {
257             $do_main = 0;
258         }
259         # line-style options
260         elsif (exists $style{substr($o, 1)}) {
261             $stylename = substr($o, 1);
262             set_style_standard($stylename);
263         } else {
264             warn "Option $o unrecognized";
265         }
266     }
267     return (@args);
268 }
269
270 sub compile {
271     my (@args) = compileOpts(@_);
272     return sub {
273         my @newargs = compileOpts(@_); # accept new rendering options
274         warn "disregarding non-options: @newargs\n" if @newargs;
275
276         for my $objname (@args) {
277             next unless $objname; # skip null args to avoid noisy responses
278
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 : ());
295             }
296             else {
297                 # convert function names to subrefs
298                 my $objref;
299                 if (ref $objname) {
300                     print $walkHandle "B::Concise::compile($objname)\n"
301                         if $banner;
302                     $objref = $objname;
303                 } else {
304                     $objname = "main::" . $objname unless $objname =~ /::/;
305                     print $walkHandle "$objname:\n";
306                     no strict 'refs';
307                     die "err: unknown function ($objname)\n"
308                         unless *{$objname}{CODE};
309                     $objref = \&$objname;
310                 }
311                 concise_subref($order, $objref);
312             }
313         }
314         if (!@args or $do_main) {
315             print $walkHandle "main program:\n" if $do_main;
316             concise_main($order);
317         }
318         return @args;   # something
319     }
320 }
321
322 my %labels;
323 my $lastnext;   # remembers op-chain, used to insert gotos
324
325 my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
326                'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
327                'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#");
328
329 no warnings 'qw'; # "Possible attempt to put comments..."; use #7
330 my @linenoise =
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';
346
347 my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
348
349 sub op_flags { # common flags (see BASOP.op_flags in op.h)
350     my($x) = @_;
351     my(@v);
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;
361     return join("", @v);
362 }
363
364 sub base_n {
365     my $x = shift;
366     return "-" . base_n(-$x) if $x < 0;
367     my $str = "";
368     do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
369     $str = reverse $str if $big_endian;
370     return $str;
371 }
372
373 my %sequence_num;
374 my $seq_max = 1;
375
376 sub reset_sequence {
377     # reset the sequence
378     %sequence_num = ();
379     $seq_max = 1;
380     $lastnext = 0;
381 }
382
383 sub seq {
384     my($op) = @_;
385     return "-" if not exists $sequence_num{$$op};
386     return base_n($sequence_num{$$op});
387 }
388
389 sub walk_topdown {
390     my($op, $sub, $level) = @_;
391     $sub->($op, $level);
392     if ($op->flags & OPf_KIDS) {
393         for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
394             walk_topdown($kid, $sub, $level + 1);
395         }
396     }
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);
403         }
404     }
405 }
406
407 sub walklines {
408     my($ar, $level) = @_;
409     for my $l (@$ar) {
410         if (ref($l) eq "ARRAY") {
411             walklines($l, $level + 1);
412         } else {
413             $l->concise($level);
414         }
415     }
416 }
417
418 sub walk_exec {
419     my($top, $level) = @_;
420     my %opsseen;
421     my @lines;
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}++;
426             push @$targ, $op;
427             my $name = $op->name;
428             if (class($op) eq "LOGOP") {
429                 my $ar = [];
430                 push @$targ, $ar;
431                 push @todo, [$op->other, $ar];
432             } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
433                 my $ar = [];
434                 push @$targ, $ar;
435                 push @todo, [$op->pmreplstart, $ar];
436             } elsif ($name =~ /^enter(loop|iter)$/) {
437                 if ($] > 5.009) {
438                     $labels{${$op->nextop}} = "NEXT";
439                     $labels{${$op->lastop}} = "LAST";
440                     $labels{${$op->redoop}} = "REDO";
441                 } else {
442                     $labels{$op->nextop->seq} = "NEXT";
443                     $labels{$op->lastop->seq} = "LAST";
444                     $labels{$op->redoop->seq} = "REDO";         
445                 }
446             }
447         }
448     }
449     walklines(\@lines, 0);
450 }
451
452 # The structure of this routine is purposely modeled after op.c's peep()
453 sub sequence {
454     my($op) = @_;
455     my $oldop = 0;
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};
462         } else {
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";
467                 sequence($other);
468             } elsif (class($op) eq "LOOP") {
469                 my $redoop = $op->redoop;
470                 $redoop = $redoop->next while $redoop->name eq "null";
471                 sequence($redoop);
472                 my $nextop = $op->nextop;
473                 $nextop = $nextop->next while $nextop->name eq "null";
474                 sequence($nextop);
475                 my $lastop = $op->lastop;
476                 $lastop = $lastop->next while $lastop->name eq "null";
477                 sequence($lastop);
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);
482             }
483         }
484         $oldop = $op;
485     }
486 }
487
488 sub fmt_line {    # generate text-line for op.
489     my($hr, $op, $text, $level) = @_;
490
491     $_->($hr, $op, \$text, \$level, $stylename) for @callbacks;
492
493     return '' if $hr->{SKIP};   # suppress line if a callback said so
494     return '' if $hr->{goto} and $hr->{goto} eq '-';    # no goto nowhere
495
496     # spec: (?(text1#varText2)?)
497     $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
498         $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
499
500     # spec: (x(exec_text;basic_text)x)
501     $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
502
503     # spec: (*(text)*)
504     $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
505
506     # spec: (*(text1;text2)*)
507     $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
508
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;
511
512     # spec: #varN
513     $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
514
515     $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg;      # populate #var's
516     $text =~ s/[ \t]*~+[ \t]*/ /g;              # squeeze tildes
517     chomp $text;
518     return "$text\n" if $text ne "";
519     return $text; # suppress empty lines
520 }
521
522 our %priv; # used to display each opcode's BASEOP.op_private values
523
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",
534                                     "COMPL", "GROWS");
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",
544         "enteriter");
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");
573 if ($] >= 5.009) {
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",
580          "ftbinary");
581   # Lexical $_ is post 5.8.x
582   $priv{$_}{2} = "GREPLEX"
583     for ("mapwhile", "mapstart", "grepwhile", "grepstart");
584 }
585
586 sub private_flags {
587     my($name, $x) = @_;
588     my @s;
589     for my $flag (128, 96, 64, 32, 16, 8, 4, 2, 1) {
590         if ($priv{$name}{$flag} and $x & $flag and $x >= $flag) {
591             $x -= $flag;
592             push @s, $priv{$name}{$flag};
593         }
594     }
595     push @s, $x if $x;
596     return join(",", @s);
597 }
598
599 sub concise_sv {
600     my($sv, $hr) = @_;
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") {
606         my $gv = $sv;
607         my $stash = $gv->STASH->NAME;
608         if ($stash eq "main") {
609             $stash = "";
610         } else {
611             $stash = $stash . "::";
612         }
613         $hr->{svval} = "*$stash" . $gv->SAFENAME;
614         return "*$stash" . $gv->SAFENAME;
615     } else {
616         while (class($sv) eq "RV") {
617             $hr->{svval} .= "\\";
618             $sv = $sv->RV;
619         }
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';
630         }
631
632         $hr->{svval} = 'undef' unless defined $hr->{svval};
633         my $out = $hr->{svclass};
634         return $out .= " $hr->{svval}" ; 
635     }
636 }
637
638 sub concise_op {
639     my ($op, $level, $format) = @_;
640     my %h;
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);
649         $h{extarg} = "";
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";
655         }
656     } elsif ($h{targ}) {
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) {
661                 if ($] < 5.009) {
662                     $h{targarglife} = "$h{targarg}:FAKE";
663                 } else {
664                     # These changes relate to the jumbo closure fix.
665                     # See changes 19939 and 20005
666                     my $fake = '';
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";
671                 }
672             }
673             else {
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";
678             }
679         } else {
680             $h{targarglife} = $h{targarg} = "t" . $h{targ};
681         }
682     }
683     $h{arg} = "";
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/";
690         } else {
691             $precomp = "";
692         }
693         my $pmreplroot = $op->pmreplroot;
694         my $pmreplstart;
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
702             # ithreads)
703             my $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$pmreplroot];
704             $h{arg} = "($precomp => \@" . $gv->NAME . ")";
705         } elsif ($ {$op->pmreplstart}) {
706             undef $lastnext;
707             $pmreplstart = "replstart->" . seq($op->pmreplstart);
708             $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")";
709         } else {
710             $h{arg} = "($precomp)";
711         }
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: " : "";
719         my $loc = $op->file;
720         $loc =~ s[.*/][];
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") {
730         undef $lastnext;
731         $h{arg} = "(other->" . seq($op->other) . ")";
732     } elsif ($h{class} eq "SVOP") {
733         unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
734             if (! ${$op->sv}) {
735                 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->targ];
736                 $h{arg} = "[" . concise_sv($sv, \%h) . "]";
737                 $h{targarglife} = $h{targarg} = "";
738             } else {
739                 $h{arg} = "(" . concise_sv($op->sv, \%h) . ")";
740             }
741         }
742     } elsif ($h{class} eq "PADOP") {
743         my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->padix];
744         $h{arg} = "[" . concise_sv($sv, \%h) . "]";
745     }
746     $h{seq} = $h{hyphseq} = seq($op);
747     $h{seq} = "" if $h{seq} eq "-";
748     if ($] > 5.009) {
749         $h{opt} = $op->opt;
750         $h{static} = $op->static;
751         $h{label} = $labels{$$op};
752     } else {
753         $h{seqnum} = $op->seq;
754         $h{label} = $labels{$op->seq};
755     }
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");
762
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];
771
772     return fmt_line(\%h, $op, $format, $level);
773 }
774
775 sub B::OP::concise {
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
782              };
783         print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
784     }
785     $lastnext = $op->next;
786     print $walkHandle concise_op($op, $level, $format);
787 }
788
789 # B::OP::terse (see Terse.pm) now just calls this
790 sub b_terse {
791     my($op, $level) = @_;
792
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;
803
804     if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
805         # insert a 'goto'
806         my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
807                  "addr" => sprintf("%#x", $$lastnext)};
808         print # $walkHandle
809             fmt_line($h, $op, $style{"terse"}[1], $level+1);
810     }
811     $lastnext = $op->next;
812     print # $walkHandle 
813         concise_op($op, $level, $style{"terse"}[0]);
814 }
815
816 sub tree {
817     my $op = shift;
818     my $level = shift;
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) {
823         return $name . "\n";
824     }
825     my @lines;
826     for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
827         push @lines, tree($kid, $level+1);
828     }
829     my $i;
830     for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
831         $lines[$i] = $space . $lines[$i];
832     }
833     if ($i > 0) {
834         $lines[$i] = $last . $lines[$i];
835         while ($i-- > 1) {
836             if (substr($lines[$i], 0, 1) eq " ") {
837                 $lines[$i] = $nokid . $lines[$i];
838             } else {
839                 $lines[$i] = $kid . $lines[$i];
840             }
841         }
842         $lines[$i] = $kids . $lines[$i];
843     } else {
844         $lines[0] = $single . $lines[0];
845     }
846     return("$name$lead" . shift @lines,
847            map(" " x (length($name)+$size) . $_, @lines));
848 }
849
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.
867
868 # [For 5.8.x and earlier perl is generating sequence numbers for all ops,
869 #  and using them to reference labels]
870
871
872 # When you say "perl -MO=Concise -e '$a'", the output should look like:
873
874 # 4  <@> leave[t1] vKP/REFC ->(end)
875 # 1     <0> enter ->2
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
881
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.
885
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;
889
890 1;
891
892 __END__
893
894 =head1 NAME
895
896 B::Concise - Walk Perl syntax tree, printing concise info about ops
897
898 =head1 SYNOPSIS
899
900     perl -MO=Concise[,OPTIONS] foo.pl
901
902     use B::Concise qw(set_style add_callback);
903
904 =head1 DESCRIPTION
905
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.
914
915 =head1 EXAMPLE
916
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
919 snippet.
920
921     % perl -MO=Concise,-exec -e '$a = $b + 42'
922     1  <0> enter
923     2  <;> nextstate(main 1 -e:1) v
924     3  <#> gvsv[*b] s
925     4  <$> const[IV 42] s
926  *  5  <2> add[t3] sK/2
927     6  <#> gvsv[*a] s
928     7  <2> sassign vKS/2
929     8  <@> leave[1 ref] vKP/REFC
930
931 Each line corresponds to an opcode. The opcode marked with '*' is used
932 in a few examples below.
933
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.
936 execution) order.
937
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">).
941
942 The opname, as in B<'add[t1]'>, which may be followed by op-specific
943 information in parentheses or brackets (ex B<'[t1]'>).
944
945 The op-flags (ex B<'sK/2'>) follow, and are described in (L</"OP flags
946 abbreviations">).
947
948     % perl -MO=Concise -e '$a = $b + 42'
949     8  <@> leave[1 ref] vKP/REFC ->(end)
950     1     <0> enter ->2
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
955     3              <$> gvsv(*b) s ->4
956     4           <$> const(IV 42) s ->5
957     -        <1> ex-rv2sv sKRM*/1 ->7
958     6           <$> gvsv(*a) s ->7
959
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.
963
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.
968
969 The arrow points to the sequence number of the next op; they're not
970 displayed in -exec mode, for obvious reasons.
971
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.
977
978
979 =head1 OPTIONS
980
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.
987
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).
992
993 =head2 Options for Opcode Ordering
994
995 These options control the 'vertical display' of opcodes.  The display
996 'order' is also called 'mode' elsewhere in this document.
997
998 =over 4
999
1000 =item B<-basic>
1001
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.
1007
1008 =item B<-exec>
1009
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'
1015 line is generated.
1016
1017 =item B<-tree>
1018
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
1023 terminal).
1024
1025 =back
1026
1027 =head2 Options for Line-Style
1028
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.
1031
1032 =over 4
1033
1034 =item B<-concise>
1035
1036 Use the author's favorite set of formatting conventions. This is the
1037 default, of course.
1038
1039 =item B<-terse>
1040
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>.
1046
1047 =item B<-linenoise>
1048
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.
1052
1053 =item B<-debug>
1054
1055 Use formatting conventions reminiscent of B<B::Debug>; these aren't
1056 very concise at all.
1057
1058 =item B<-env>
1059
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>.
1062
1063 =back
1064
1065 =head2 Options for tree-specific formatting
1066
1067 =over 4
1068
1069 =item B<-compact>
1070
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.
1074
1075 =item B<-loose>
1076
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
1079 the default.
1080
1081 =item B<-vt>
1082
1083 Use tree connecting characters drawn from the VT100 line-drawing set.
1084 This looks better if your terminal supports it.
1085
1086 =item B<-ascii>
1087
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.
1092
1093 =back
1094
1095 These are pairwise exclusive, i.e. compact or loose, vt or ascii.
1096
1097 =head2 Options controlling sequence numbering
1098
1099 =over 4
1100
1101 =item B<-base>I<n>
1102
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.
1107
1108 =item B<-bigendian>
1109
1110 Print sequence numbers with the most significant digit first. This is the
1111 usual convention for Arabic numerals, and the default.
1112
1113 =item B<-littleendian>
1114
1115 Print seqence numbers with the least significant digit first.  This is
1116 obviously mutually exclusive with bigendian.
1117
1118 =back
1119
1120 =head2 Other options
1121
1122 These are pairwise exclusive.
1123
1124 =over 4
1125
1126 =item B<-main>
1127
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.
1131
1132 =item B<-nomain>
1133
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.
1137
1138 =item B<-nobanner>
1139
1140 Renderings usually include a banner line identifying the function name
1141 or stringified subref.  This suppresses the printing of the banner.
1142
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
1146 different trees.
1147
1148 =item B<-banner>
1149
1150 restores default banner behavior.
1151
1152 =item B<-banneris> => subref
1153
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.
1158
1159 =back
1160
1161 =head2 Option Stickiness
1162
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.
1167
1168 =head1 ABBREVIATIONS
1169
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.
1173
1174 =head2 OP class abbreviations
1175
1176 These symbols appear before the op-name, and indicate the
1177 B:: namespace that represents the ops in your Perl code.
1178
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
1190
1191 =head2 OP flags abbreviations
1192
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.
1196
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)
1200                             Want is unknown
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)
1209
1210 Private flags, if any are set for an opcode, are displayed after a '/'
1211
1212     8  <@> leave[1 ref] vKP/REFC ->(end)
1213     7     <2> sassign vKS/2 ->8
1214
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:
1218
1219   $> perl -MB::Concise -de 1
1220   DB<1> |x \%B::Concise::priv
1221
1222 =head1 FORMATTING SPECIFICATIONS
1223
1224 For each line-style ('concise', 'terse', 'linenoise', etc.) there are
1225 3 format-specs which control how OPs are rendered.
1226
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
1231 specific.
1232
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.
1236
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
1239 of s///g steps.)
1240
1241 =head2 Special Patterns
1242
1243 These items are the primitives used to perform indenting, and to
1244 select text from amongst alternatives.
1245
1246 =over 4
1247
1248 =item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
1249
1250 Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
1251
1252 =item B<(*(>I<text>B<)*)>
1253
1254 Generates one copy of I<text> for each indentation level.
1255
1256 =item B<(*(>I<text1>B<;>I<text2>B<)*)>
1257
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.
1260
1261 =item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
1262
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
1265 nothing.
1266
1267 =item B<~>
1268
1269 Any number of tildes and surrounding whitespace will be collapsed to
1270 a single space.
1271
1272 =back
1273
1274 =head2 # Variables
1275
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".
1279
1280 These vars take 3 forms:
1281
1282 =over 4
1283
1284 =item B<#>I<var>
1285
1286 A property named 'var' is assumed to exist for the opcodes, and is
1287 interpolated into the rendering.
1288
1289 =item B<#>I<var>I<N>
1290
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 ;-)
1295
1296 =item B<#>I<Var>
1297
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
1302 for #Var's value).
1303
1304 =back
1305
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.
1309
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>.
1314
1315 =over 4
1316
1317 =item B<#addr>
1318
1319 The address of the OP, in hexadecimal.
1320
1321 =item B<#arg>
1322
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.
1325
1326 =item B<#class>
1327
1328 The B-determined class of the OP, in all caps.
1329
1330 =item B<#classsym>
1331
1332 A single symbol abbreviating the class of the OP.
1333
1334 =item B<#coplabel>
1335
1336 The label of the statement or block the OP is the start of, if any.
1337
1338 =item B<#exname>
1339
1340 The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
1341
1342 =item B<#extarg>
1343
1344 The target of the OP, or nothing for a nulled OP.
1345
1346 =item B<#firstaddr>
1347
1348 The address of the OP's first child, in hexadecimal.
1349
1350 =item B<#flags>
1351
1352 The OP's flags, abbreviated as a series of symbols.
1353
1354 =item B<#flagval>
1355
1356 The numeric value of the OP's flags.
1357
1358 =item B<#hyphseq>
1359
1360 The sequence number of the OP, or a hyphen if it doesn't have one.
1361
1362 =item B<#label>
1363
1364 'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
1365 mode, or empty otherwise.
1366
1367 =item B<#lastaddr>
1368
1369 The address of the OP's last child, in hexadecimal.
1370
1371 =item B<#name>
1372
1373 The OP's name.
1374
1375 =item B<#NAME>
1376
1377 The OP's name, in all caps.
1378
1379 =item B<#next>
1380
1381 The sequence number of the OP's next OP.
1382
1383 =item B<#nextaddr>
1384
1385 The address of the OP's next OP, in hexadecimal.
1386
1387 =item B<#noise>
1388
1389 A one- or two-character abbreviation for the OP's name.
1390
1391 =item B<#private>
1392
1393 The OP's private flags, rendered with abbreviated names if possible.
1394
1395 =item B<#privval>
1396
1397 The numeric value of the OP's private flags.
1398
1399 =item B<#seq>
1400
1401 The sequence number of the OP. Note that this is a sequence number
1402 generated by B::Concise.
1403
1404 =item B<#seqnum>
1405
1406 5.8.x and earlier only. 5.9 and later do not provide this.
1407
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
1411 your program is).
1412
1413 =item B<#opt>
1414
1415 Whether or not the op has been optimised by the peephole optimiser.
1416
1417 Only available in 5.9 and later.
1418
1419 =item B<#static>
1420
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.
1423
1424 Only available in 5.9 and later.
1425
1426 =item B<#sibaddr>
1427
1428 The address of the OP's next youngest sibling, in hexadecimal.
1429
1430 =item B<#svaddr>
1431
1432 The address of the OP's SV, if it has an SV, in hexadecimal.
1433
1434 =item B<#svclass>
1435
1436 The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
1437
1438 =item B<#svval>
1439
1440 The value of the OP's SV, if it has one, in a short human-readable format.
1441
1442 =item B<#targ>
1443
1444 The numeric value of the OP's targ.
1445
1446 =item B<#targarg>
1447
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.
1450
1451 =item B<#targarglife>
1452
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
1455 variable.
1456
1457 =item B<#typenum>
1458
1459 The numeric value of the OP's type, in decimal.
1460
1461 =back
1462
1463 =head1 Using B::Concise outside of the O framework
1464
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.
1471
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
1475 added) styles.  
1476
1477 =head2 Example: Altering Concise Renderings
1478
1479     use B::Concise qw(set_style add_callback);
1480     add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
1481     add_callback
1482       ( sub {
1483             my ($h, $op, $format, $level, $stylename) = @_;
1484             $h->{variable} = some_func($op);
1485         });
1486     $walker = B::Concise::compile(@options,@subnames,@subrefs);
1487     $walker->();
1488
1489 =head2 set_style()
1490
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()
1496 instead.
1497
1498 =head2 set_style_standard($name)
1499
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().
1503
1504 =head2 add_style()
1505
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
1509 several styles.
1510
1511 =head2 add_callback()
1512
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
1516 chosen.
1517
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
1520 parameters.
1521
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
1528
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.
1533
1534 =head2 Running B::Concise::compile()
1535
1536 B<compile> accepts options as described above in L</OPTIONS>, and
1537 arguments, which are either coderefs, or subroutine names.
1538
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.
1543
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).
1547
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";
1555
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:
1559
1560   1. call C<compile>, altering style or mode/order
1561   2. call C<set_style_standard>
1562   3. call $walker, passing @new options
1563
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.
1570
1571 =head2 B::Concise::reset_sequence()
1572
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
1579 the output.
1580
1581 =head2 Errors
1582
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.
1586
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.
1589
1590 =head1 AUTHOR
1591
1592 Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.
1593
1594 =cut