Doc nit for B::Lint
[p5sagit/p5-mst-13.2.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 {
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 my %priv;
523 $priv{$_}{128} = "LVINTRO"
524   for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv",
525        "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv",
526        "padav", "padhv", "enteriter");
527 $priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite");
528 $priv{"aassign"}{64} = "COMMON";
529 $priv{"aassign"}{32} = "PHASH" if $] < 5.009;
530 $priv{"sassign"}{64} = "BKWARD";
531 $priv{$_}{64} = "RTIME" for ("match", "subst", "substcont");
532 @{$priv{"trans"}}{1,2,4,8,16,64} = ("<UTF", ">UTF", "IDENT", "SQUASH", "DEL",
533                                     "COMPL", "GROWS");
534 $priv{"repeat"}{64} = "DOLIST";
535 $priv{"leaveloop"}{64} = "CONT";
536 @{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV")
537   for (qw(rv2gv rv2sv padsv aelem helem));
538 @{$priv{"entersub"}}{16,32,64} = ("DBG","TARG","NOMOD");
539 @{$priv{$_}}{4,8,128} = ("INARGS","AMPER","NO()") for ("entersub", "rv2cv");
540 $priv{"gv"}{32} = "EARLYCV";
541 $priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER";
542 $priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv",
543         "enteriter");
544 $priv{$_}{16} = "TARGMY"
545   for (map(($_,"s$_"),"chop", "chomp"),
546        map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo",
547            "add", "subtract", "negate"), "pow", "concat", "stringify",
548        "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or",
549        "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt",
550        "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf",
551        "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock",
552        "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename",
553        "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system",
554        "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority",
555        "setpriority", "time", "sleep");
556 $priv{$_}{4} = "REVERSED" for ("enteriter", "iter");
557 @{$priv{"const"}}{4,8,16,32,64,128} = ("SHORT","STRICT","ENTERED",'$[',"BARE","WARN");
558 $priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM";
559 $priv{"list"}{64} = "GUESSED";
560 $priv{"delete"}{64} = "SLICE";
561 $priv{"exists"}{64} = "SUB";
562 $priv{$_}{64} = "LOCALE"
563   for ("sort", "prtf", "sprintf", "slt", "sle", "seq", "sne", "sgt", "sge",
564        "scmp", "lc", "uc", "lcfirst", "ucfirst");
565 @{$priv{"sort"}}{1,2,4,8,16} = ("NUM", "INT", "REV", "INPLACE","DESC");
566 $priv{"threadsv"}{64} = "SVREFd";
567 @{$priv{$_}}{16,32,64,128} = ("INBIN","INCR","OUTBIN","OUTCR")
568   for ("open", "backtick");
569 $priv{"exit"}{128} = "VMS";
570 $priv{$_}{2} = "FTACCESS"
571   for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec");
572 if ($] >= 5.009) {
573   # Stacked filetests are post 5.8.x
574   $priv{$_}{4} = "FTSTACKED"
575     for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec",
576          "ftis", "fteowned", "ftrowned", "ftzero", "ftsize", "ftmtime",
577          "ftatime", "ftctime", "ftsock", "ftchr", "ftblk", "ftfile", "ftdir",
578          "ftpipe", "ftlink", "ftsuid", "ftsgid", "ftsvtx", "fttty", "fttext",
579          "ftbinary");
580   # Lexical $_ is post 5.8.x
581   $priv{$_}{2} = "GREPLEX"
582     for ("mapwhile", "mapstart", "grepwhile", "grepstart");
583 }
584
585 sub private_flags {
586     my($name, $x) = @_;
587     my @s;
588     for my $flag (128, 96, 64, 32, 16, 8, 4, 2, 1) {
589         if ($priv{$name}{$flag} and $x & $flag and $x >= $flag) {
590             $x -= $flag;
591             push @s, $priv{$name}{$flag};
592         }
593     }
594     push @s, $x if $x;
595     return join(",", @s);
596 }
597
598 sub concise_sv {
599     my($sv, $hr) = @_;
600     $hr->{svclass} = class($sv);
601     $hr->{svclass} = "UV"
602       if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV;
603     $hr->{svaddr} = sprintf("%#x", $$sv);
604     if ($hr->{svclass} eq "GV") {
605         my $gv = $sv;
606         my $stash = $gv->STASH->NAME;
607         if ($stash eq "main") {
608             $stash = "";
609         } else {
610             $stash = $stash . "::";
611         }
612         $hr->{svval} = "*$stash" . $gv->SAFENAME;
613         return "*$stash" . $gv->SAFENAME;
614     } else {
615         while (class($sv) eq "RV") {
616             $hr->{svval} .= "\\";
617             $sv = $sv->RV;
618         }
619         if (class($sv) eq "SPECIAL") {
620             $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv];
621         } elsif ($sv->FLAGS & SVf_NOK) {
622             $hr->{svval} .= $sv->NV;
623         } elsif ($sv->FLAGS & SVf_IOK) {
624             $hr->{svval} .= $sv->int_value;
625         } elsif ($sv->FLAGS & SVf_POK) {
626             $hr->{svval} .= cstring($sv->PV);
627         } elsif (class($sv) eq "HV") {
628             $hr->{svval} .= 'HASH';
629         }
630
631         $hr->{svval} = 'undef' unless defined $hr->{svval};
632         my $out = $hr->{svclass};
633         return $out .= " $hr->{svval}" ; 
634     }
635 }
636
637 sub concise_op {
638     my ($op, $level, $format) = @_;
639     my %h;
640     $h{exname} = $h{name} = $op->name;
641     $h{NAME} = uc $h{name};
642     $h{class} = class($op);
643     $h{extarg} = $h{targ} = $op->targ;
644     $h{extarg} = "" unless $h{extarg};
645     if ($h{name} eq "null" and $h{targ}) {
646         # targ holds the old type
647         $h{exname} = "ex-" . substr(ppname($h{targ}), 3);
648         $h{extarg} = "";
649     } elsif ($op->name =~ /^leave(sub(lv)?|write)?$/) {
650         # targ potentially holds a reference count
651         if ($op->private & 64) {
652             my $refs = "ref" . ($h{targ} != 1 ? "s" : "");
653             $h{targarglife} = $h{targarg} = "$h{targ} $refs";
654         }
655     } elsif ($h{targ}) {
656         my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}];
657         if (defined $padname and class($padname) ne "SPECIAL") {
658             $h{targarg}  = $padname->PVX;
659             if ($padname->FLAGS & SVf_FAKE) {
660                 if ($] < 5.009) {
661                     $h{targarglife} = "$h{targarg}:FAKE";
662                 } else {
663                     # These changes relate to the jumbo closure fix.
664                     # See changes 19939 and 20005
665                     my $fake = '';
666                     $fake .= 'a' if $padname->IVX & 1; # PAD_FAKELEX_ANON
667                     $fake .= 'm' if $padname->IVX & 2; # PAD_FAKELEX_MULTI
668                     $fake .= ':' . $padname->NVX if $curcv->CvFLAGS & CVf_ANON;
669                     $h{targarglife} = "$h{targarg}:FAKE:$fake";
670                 }
671             }
672             else {
673                 my $intro = $padname->NVX - $cop_seq_base;
674                 my $finish = int($padname->IVX) - $cop_seq_base;
675                 $finish = "end" if $finish == 999999999 - $cop_seq_base;
676                 $h{targarglife} = "$h{targarg}:$intro,$finish";
677             }
678         } else {
679             $h{targarglife} = $h{targarg} = "t" . $h{targ};
680         }
681     }
682     $h{arg} = "";
683     $h{svclass} = $h{svaddr} = $h{svval} = "";
684     if ($h{class} eq "PMOP") {
685         my $precomp = $op->precomp;
686         if (defined $precomp) {
687             $precomp = cstring($precomp); # Escape literal control sequences
688             $precomp = "/$precomp/";
689         } else {
690             $precomp = "";
691         }
692         my $pmreplroot = $op->pmreplroot;
693         my $pmreplstart;
694         if (ref($pmreplroot) eq "B::GV") {
695             # with C<@stash_array = split(/pat/, str);>,
696             #  *stash_array is stored in /pat/'s pmreplroot.
697             $h{arg} = "($precomp => \@" . $pmreplroot->NAME . ")";
698         } elsif (!ref($pmreplroot) and $pmreplroot) {
699             # same as the last case, except the value is actually a
700             # pad offset for where the GV is kept (this happens under
701             # ithreads)
702             my $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$pmreplroot];
703             $h{arg} = "($precomp => \@" . $gv->NAME . ")";
704         } elsif ($ {$op->pmreplstart}) {
705             undef $lastnext;
706             $pmreplstart = "replstart->" . seq($op->pmreplstart);
707             $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")";
708         } else {
709             $h{arg} = "($precomp)";
710         }
711     } elsif ($h{class} eq "PVOP" and $h{name} ne "trans") {
712         $h{arg} = '("' . $op->pv . '")';
713         $h{svval} = '"' . $op->pv . '"';
714     } elsif ($h{class} eq "COP") {
715         my $label = $op->label;
716         $h{coplabel} = $label;
717         $label = $label ? "$label: " : "";
718         my $loc = $op->file;
719         $loc =~ s[.*/][];
720         $loc .= ":" . $op->line;
721         my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
722         my $arybase = $op->arybase;
723         $arybase = $arybase ? ' $[=' . $arybase : "";
724         $h{arg} = "($label$stash $cseq $loc$arybase)";
725     } elsif ($h{class} eq "LOOP") {
726         $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
727           . " redo->" . seq($op->redoop) . ")";
728     } elsif ($h{class} eq "LOGOP") {
729         undef $lastnext;
730         $h{arg} = "(other->" . seq($op->other) . ")";
731     } elsif ($h{class} eq "SVOP") {
732         unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) {
733             if (! ${$op->sv}) {
734                 my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->targ];
735                 $h{arg} = "[" . concise_sv($sv, \%h) . "]";
736                 $h{targarglife} = $h{targarg} = "";
737             } else {
738                 $h{arg} = "(" . concise_sv($op->sv, \%h) . ")";
739             }
740         }
741     } elsif ($h{class} eq "PADOP") {
742         my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->padix];
743         $h{arg} = "[" . concise_sv($sv, \%h) . "]";
744     }
745     $h{seq} = $h{hyphseq} = seq($op);
746     $h{seq} = "" if $h{seq} eq "-";
747     if ($] > 5.009) {
748         $h{opt} = $op->opt;
749         $h{static} = $op->static;
750         $h{label} = $labels{$$op};
751     } else {
752         $h{seqnum} = $op->seq;
753         $h{label} = $labels{$op->seq};
754     }
755     $h{next} = $op->next;
756     $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
757     $h{nextaddr} = sprintf("%#x", $ {$op->next});
758     $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
759     $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
760     $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
761
762     $h{classsym} = $opclass{$h{class}};
763     $h{flagval} = $op->flags;
764     $h{flags} = op_flags($op->flags);
765     $h{privval} = $op->private;
766     $h{private} = private_flags($h{name}, $op->private);
767     $h{addr} = sprintf("%#x", $$op);
768     $h{typenum} = $op->type;
769     $h{noise} = $linenoise[$op->type];
770
771     return fmt_line(\%h, $op, $format, $level);
772 }
773
774 sub B::OP::concise {
775     my($op, $level) = @_;
776     if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
777         # insert a 'goto' line
778         my $synth = {"seq" => seq($lastnext), "class" => class($lastnext),
779                      "addr" => sprintf("%#x", $$lastnext),
780                      "goto" => seq($lastnext), # simplify goto '-' removal
781              };
782         print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1);
783     }
784     $lastnext = $op->next;
785     print $walkHandle concise_op($op, $level, $format);
786 }
787
788 # B::OP::terse (see Terse.pm) now just calls this
789 sub b_terse {
790     my($op, $level) = @_;
791
792     # This isn't necessarily right, but there's no easy way to get
793     # from an OP to the right CV. This is a limitation of the
794     # ->terse() interface style, and there isn't much to do about
795     # it. In particular, we can die in concise_op if the main pad
796     # isn't long enough, or has the wrong kind of entries, compared to
797     # the pad a sub was compiled with. The fix for that would be to
798     # make a backwards compatible "terse" format that never even
799     # looked at the pad, just like the old B::Terse. I don't think
800     # that's worth the effort, though.
801     $curcv = main_cv unless $curcv;
802
803     if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
804         # insert a 'goto'
805         my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
806                  "addr" => sprintf("%#x", $$lastnext)};
807         print # $walkHandle
808             fmt_line($h, $op, $style{"terse"}[1], $level+1);
809     }
810     $lastnext = $op->next;
811     print # $walkHandle 
812         concise_op($op, $level, $style{"terse"}[0]);
813 }
814
815 sub tree {
816     my $op = shift;
817     my $level = shift;
818     my $style = $tree_decorations[$tree_style];
819     my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
820     my $name = concise_op($op, $level, $treefmt);
821     if (not $op->flags & OPf_KIDS) {
822         return $name . "\n";
823     }
824     my @lines;
825     for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
826         push @lines, tree($kid, $level+1);
827     }
828     my $i;
829     for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
830         $lines[$i] = $space . $lines[$i];
831     }
832     if ($i > 0) {
833         $lines[$i] = $last . $lines[$i];
834         while ($i-- > 1) {
835             if (substr($lines[$i], 0, 1) eq " ") {
836                 $lines[$i] = $nokid . $lines[$i];
837             } else {
838                 $lines[$i] = $kid . $lines[$i];
839             }
840         }
841         $lines[$i] = $kids . $lines[$i];
842     } else {
843         $lines[0] = $single . $lines[0];
844     }
845     return("$name$lead" . shift @lines,
846            map(" " x (length($name)+$size) . $_, @lines));
847 }
848
849 # *** Warning: fragile kludge ahead ***
850 # Because the B::* modules run in the same interpreter as the code
851 # they're compiling, their presence tends to distort the view we have of
852 # the code we're looking at. In particular, perl gives sequence numbers
853 # to COPs. If the program we're looking at were run on its own, this
854 # would start at 1. Because all of B::Concise and all the modules it
855 # uses are compiled first, though, by the time we get to the user's
856 # program the sequence number is already pretty high, which could be
857 # distracting if you're trying to tell OPs apart. Therefore we'd like to
858 # subtract an offset from all the sequence numbers we display, to
859 # restore the simpler view of the world. The trick is to know what that
860 # offset will be, when we're still compiling B::Concise!  If we
861 # hardcoded a value, it would have to change every time B::Concise or
862 # other modules we use do. To help a little, what we do here is compile
863 # a little code at the end of the module, and compute the base sequence
864 # number for the user's program as being a small offset later, so all we
865 # have to worry about are changes in the offset.
866
867 # [For 5.8.x and earlier perl is generating sequence numbers for all ops,
868 #  and using them to reference labels]
869
870
871 # When you say "perl -MO=Concise -e '$a'", the output should look like:
872
873 # 4  <@> leave[t1] vKP/REFC ->(end)
874 # 1     <0> enter ->2
875  #^ smallest OP sequence number should be 1
876 # 2     <;> nextstate(main 1 -e:1) v ->3
877  #                         ^ smallest COP sequence number should be 1
878 # -     <1> ex-rv2sv vK/1 ->4
879 # 3        <$> gvsv(*a) s ->4
880
881 # If the second of the marked numbers there isn't 1, it means you need
882 # to update the corresponding magic number in the next line.
883 # Remember, this needs to stay the last things in the module.
884
885 # Why is this different for MacOS?  Does it matter?
886 my $cop_seq_mnum = $^O eq 'MacOS' ? 12 : 11;
887 $cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum;
888
889 1;
890
891 __END__
892
893 =head1 NAME
894
895 B::Concise - Walk Perl syntax tree, printing concise info about ops
896
897 =head1 SYNOPSIS
898
899     perl -MO=Concise[,OPTIONS] foo.pl
900
901     use B::Concise qw(set_style add_callback);
902
903 =head1 DESCRIPTION
904
905 This compiler backend prints the internal OPs of a Perl program's syntax
906 tree in one of several space-efficient text formats suitable for debugging
907 the inner workings of perl or other compiler backends. It can print OPs in
908 the order they appear in the OP tree, in the order they will execute, or
909 in a text approximation to their tree structure, and the format of the
910 information displyed is customizable. Its function is similar to that of
911 perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
912 sophisticated and flexible.
913
914 =head1 EXAMPLE
915
916 Here's is a short example of output (aka 'rendering'), using the
917 default formatting conventions :
918
919     % perl -MO=Concise -e '$a = $b + 42'
920     8  <@> leave[1 ref] vKP/REFC ->(end)
921     1     <0> enter ->2
922     2     <;> nextstate(main 1 -e:1) v ->3
923     7     <2> sassign vKS/2 ->8
924     5        <2> add[t1] sK/2 ->6
925     -           <1> ex-rv2sv sK/1 ->4
926     3              <$> gvsv(*b) s ->4
927     4           <$> const(IV 42) s ->5
928     -        <1> ex-rv2sv sKRM*/1 ->7
929     6           <$> gvsv(*a) s ->7
930
931 Each line corresponds to an opcode. Null ops appear as C<ex-opname>,
932 where I<opname> is the op that has been optimized away by perl.
933
934 The number on the first row indicates the op's sequence number. It's
935 given in base 36 by default.
936
937 The symbol between angle brackets indicates the op's type : for example,
938 <2> is a BINOP, <@> a LISTOP, etc. (see L</"OP class abbreviations">).
939
940 The opname may be followed by op-specific information in parentheses
941 (e.g. C<gvsv(*b)>), and by targ information in brackets (e.g.
942 C<leave[t1]>).
943
944 Next come the op flags. The common flags are listed below
945 (L</"OP flags abbreviations">). The private flags follow, separated
946 by a slash. For example, C<vKP/REFC> means that the leave op has
947 public flags OPf_WANT_VOID, OPf_KIDS, and OPf_PARENS, and the private
948 flag OPpREFCOUNTED.
949
950 Finally an arrow points to the sequence number of the next op.
951
952 =head1 OPTIONS
953
954 Arguments that don't start with a hyphen are taken to be the names of
955 subroutines to print the OPs of; if no such functions are specified,
956 the main body of the program (outside any subroutines, and not
957 including use'd or require'd files) is printed. Passing C<BEGIN>,
958 C<CHECK>, C<INIT>, or C<END> will cause all of the corresponding
959 special blocks to be printed.
960
961 Options affect how things are rendered (ie printed).  They're presented
962 here by their visual effect, 1st being strongest.  They're grouped
963 according to how they interrelate; within each group the options are
964 mutually exclusive (unless otherwise stated).
965
966 =head2 Options for Opcode Ordering
967
968 These options control the 'vertical display' of opcodes.  The display
969 'order' is also called 'mode' elsewhere in this document.
970
971 =over 4
972
973 =item B<-basic>
974
975 Print OPs in the order they appear in the OP tree (a preorder
976 traversal, starting at the root). The indentation of each OP shows its
977 level in the tree.  This mode is the default, so the flag is included
978 simply for completeness.
979
980 =item B<-exec>
981
982 Print OPs in the order they would normally execute (for the majority
983 of constructs this is a postorder traversal of the tree, ending at the
984 root). In most cases the OP that usually follows a given OP will
985 appear directly below it; alternate paths are shown by indentation. In
986 cases like loops when control jumps out of a linear path, a 'goto'
987 line is generated.
988
989 =item B<-tree>
990
991 Print OPs in a text approximation of a tree, with the root of the tree
992 at the left and 'left-to-right' order of children transformed into
993 'top-to-bottom'. Because this mode grows both to the right and down,
994 it isn't suitable for large programs (unless you have a very wide
995 terminal).
996
997 =back
998
999 =head2 Options for Line-Style
1000
1001 These options select the line-style (or just style) used to render
1002 each opcode, and dictates what info is actually printed into each line.
1003
1004 =over 4
1005
1006 =item B<-concise>
1007
1008 Use the author's favorite set of formatting conventions. This is the
1009 default, of course.
1010
1011 =item B<-terse>
1012
1013 Use formatting conventions that emulate the output of B<B::Terse>. The
1014 basic mode is almost indistinguishable from the real B<B::Terse>, and the
1015 exec mode looks very similar, but is in a more logical order and lacks
1016 curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
1017 is only vaguely reminiscent of B<B::Terse>.
1018
1019 =item B<-linenoise>
1020
1021 Use formatting conventions in which the name of each OP, rather than being
1022 written out in full, is represented by a one- or two-character abbreviation.
1023 This is mainly a joke.
1024
1025 =item B<-debug>
1026
1027 Use formatting conventions reminiscent of B<B::Debug>; these aren't
1028 very concise at all.
1029
1030 =item B<-env>
1031
1032 Use formatting conventions read from the environment variables
1033 C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
1034
1035 =back
1036
1037 =head2 Options for tree-specific formatting
1038
1039 =over 4
1040
1041 =item B<-compact>
1042
1043 Use a tree format in which the minimum amount of space is used for the
1044 lines connecting nodes (one character in most cases). This squeezes out
1045 a few precious columns of screen real estate.
1046
1047 =item B<-loose>
1048
1049 Use a tree format that uses longer edges to separate OP nodes. This format
1050 tends to look better than the compact one, especially in ASCII, and is
1051 the default.
1052
1053 =item B<-vt>
1054
1055 Use tree connecting characters drawn from the VT100 line-drawing set.
1056 This looks better if your terminal supports it.
1057
1058 =item B<-ascii>
1059
1060 Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
1061 look as clean as the VT100 characters, but they'll work with almost any
1062 terminal (or the horizontal scrolling mode of less(1)) and are suitable
1063 for text documentation or email. This is the default.
1064
1065 =back
1066
1067 These are pairwise exclusive, i.e. compact or loose, vt or ascii.
1068
1069 =head2 Options controlling sequence numbering
1070
1071 =over 4
1072
1073 =item B<-base>I<n>
1074
1075 Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
1076 digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
1077 for 37 will be 'A', and so on until 62. Values greater than 62 are not
1078 currently supported. The default is 36.
1079
1080 =item B<-bigendian>
1081
1082 Print sequence numbers with the most significant digit first. This is the
1083 usual convention for Arabic numerals, and the default.
1084
1085 =item B<-littleendian>
1086
1087 Print seqence numbers with the least significant digit first.  This is
1088 obviously mutually exclusive with bigendian.
1089
1090 =back
1091
1092 =head2 Other options
1093
1094 These are pairwise exclusive.
1095
1096 =over 4
1097
1098 =item B<-main>
1099
1100 Include the main program in the output, even if subroutines were also
1101 specified.  This rendering is normally suppressed when a subroutine
1102 name or reference is given.
1103
1104 =item B<-nomain>
1105
1106 This restores the default behavior after you've changed it with '-main'
1107 (it's not normally needed).  If no subroutine name/ref is given, main is
1108 rendered, regardless of this flag.
1109
1110 =item B<-nobanner>
1111
1112 Renderings usually include a banner line identifying the function name
1113 or stringified subref.  This suppresses the printing of the banner.
1114
1115 TBC: Remove the stringified coderef; while it provides a 'cookie' for
1116 each function rendered, the cookies used should be 1,2,3.. not a
1117 random hex-address.  It also complicates string comparison of two
1118 different trees.
1119
1120 =item B<-banner>
1121
1122 restores default banner behavior.
1123
1124 =item B<-banneris> => subref
1125
1126 TBC: a hookpoint (and an option to set it) for a user-supplied
1127 function to produce a banner appropriate for users needs.  It's not
1128 ideal, because the rendering-state variables, which are a natural
1129 candidate for use in concise.t, are unavailable to the user.
1130
1131 =back
1132
1133 =head2 Option Stickiness
1134
1135 If you invoke Concise more than once in a program, you should know that
1136 the options are 'sticky'.  This means that the options you provide in
1137 the first call will be remembered for the 2nd call, unless you
1138 re-specify or change them.
1139
1140 =head1 ABBREVIATIONS
1141
1142 The concise style uses symbols to convey maximum info with minimal
1143 clutter (like hex addresses).  With just a little practice, you can
1144 start to see the flowers, not just the branches, in the trees.
1145
1146 =head2 OP class abbreviations
1147
1148 These symbols appear before the op-name, and indicate the
1149 B:: namespace that represents the ops in your Perl code.
1150
1151     0      OP (aka BASEOP)  An OP with no children
1152     1      UNOP             An OP with one child
1153     2      BINOP            An OP with two children
1154     |      LOGOP            A control branch OP
1155     @      LISTOP           An OP that could have lots of children
1156     /      PMOP             An OP with a regular expression
1157     $      SVOP             An OP with an SV
1158     "      PVOP             An OP with a string
1159     {      LOOP             An OP that holds pointers for a loop
1160     ;      COP              An OP that marks the start of a statement
1161     #      PADOP            An OP with a GV on the pad
1162
1163 =head2 OP flags abbreviations
1164
1165 These symbols represent various flags which alter behavior of the
1166 opcode, sometimes in opcode-specific ways.
1167
1168     v      OPf_WANT_VOID    Want nothing (void context)
1169     s      OPf_WANT_SCALAR  Want single value (scalar context)
1170     l      OPf_WANT_LIST    Want list of any length (list context)
1171     K      OPf_KIDS         There is a firstborn child.
1172     P      OPf_PARENS       This operator was parenthesized.
1173                              (Or block needs explicit scope entry.)
1174     R      OPf_REF          Certified reference.
1175                              (Return container, not containee).
1176     M      OPf_MOD          Will modify (lvalue).
1177     S      OPf_STACKED      Some arg is arriving on the stack.
1178     *      OPf_SPECIAL      Do something weird for this op (see op.h)
1179
1180 =head1 FORMATTING SPECIFICATIONS
1181
1182 For each line-style ('concise', 'terse', 'linenoise', etc.) there are
1183 3 format-specs which control how OPs are rendered.
1184
1185 The first is the 'default' format, which is used in both basic and exec
1186 modes to print all opcodes.  The 2nd, goto-format, is used in exec
1187 mode when branches are encountered.  They're not real opcodes, and are
1188 inserted to look like a closing curly brace.  The tree-format is tree
1189 specific.
1190
1191 When a line is rendered, the correct format-spec is copied and scanned
1192 for the following items; data is substituted in, and other
1193 manipulations like basic indenting are done, for each opcode rendered.
1194
1195 There are 3 kinds of items that may be populated; special patterns,
1196 #vars, and literal text, which is copied verbatim.  (Yes, it's a set
1197 of s///g steps.)
1198
1199 =head2 Special Patterns
1200
1201 These items are the primitives used to perform indenting, and to
1202 select text from amongst alternatives.
1203
1204 =over 4
1205
1206 =item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
1207
1208 Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
1209
1210 =item B<(*(>I<text>B<)*)>
1211
1212 Generates one copy of I<text> for each indentation level.
1213
1214 =item B<(*(>I<text1>B<;>I<text2>B<)*)>
1215
1216 Generates one fewer copies of I<text1> than the indentation level, followed
1217 by one copy of I<text2> if the indentation level is more than 0.
1218
1219 =item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
1220
1221 If the value of I<var> is true (not empty or zero), generates the
1222 value of I<var> surrounded by I<text1> and I<Text2>, otherwise
1223 nothing.
1224
1225 =item B<~>
1226
1227 Any number of tildes and surrounding whitespace will be collapsed to
1228 a single space.
1229
1230 =back
1231
1232 =head2 # Variables
1233
1234 These #vars represent opcode properties that you may want as part of
1235 your rendering.  The '#' is intended as a private sigil; a #var's
1236 value is interpolated into the style-line, much like "read $this".
1237
1238 These vars take 3 forms:
1239
1240 =over 4
1241
1242 =item B<#>I<var>
1243
1244 A property named 'var' is assumed to exist for the opcodes, and is
1245 interpolated into the rendering.
1246
1247 =item B<#>I<var>I<N>
1248
1249 Generates the value of I<var>, left justified to fill I<N> spaces.
1250 Note that this means while you can have properties 'foo' and 'foo2',
1251 you cannot render 'foo2', but you could with 'foo2a'.  You would be
1252 wise not to rely on this behavior going forward ;-)
1253
1254 =item B<#>I<Var>
1255
1256 This ucfirst form of #var generates a tag-value form of itself for
1257 display; it converts '#Var' into a 'Var => #var' style, which is then
1258 handled as described above.  (Imp-note: #Vars cannot be used for
1259 conditional-fills, because the => #var transform is done after the check
1260 for #Var's value).
1261
1262 =back
1263
1264 The following variables are 'defined' by B::Concise; when they are
1265 used in a style, their respective values are plugged into the
1266 rendering of each opcode.
1267
1268 Only some of these are used by the standard styles, the others are
1269 provided for you to delve into optree mechanics, should you wish to
1270 add a new style (see L</add_style> below) that uses them.  You can
1271 also add new ones using L<add_callback>.
1272
1273 =over 4
1274
1275 =item B<#addr>
1276
1277 The address of the OP, in hexadecimal.
1278
1279 =item B<#arg>
1280
1281 The OP-specific information of the OP (such as the SV for an SVOP, the
1282 non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
1283
1284 =item B<#class>
1285
1286 The B-determined class of the OP, in all caps.
1287
1288 =item B<#classsym>
1289
1290 A single symbol abbreviating the class of the OP.
1291
1292 =item B<#coplabel>
1293
1294 The label of the statement or block the OP is the start of, if any.
1295
1296 =item B<#exname>
1297
1298 The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
1299
1300 =item B<#extarg>
1301
1302 The target of the OP, or nothing for a nulled OP.
1303
1304 =item B<#firstaddr>
1305
1306 The address of the OP's first child, in hexidecimal.
1307
1308 =item B<#flags>
1309
1310 The OP's flags, abbreviated as a series of symbols.
1311
1312 =item B<#flagval>
1313
1314 The numeric value of the OP's flags.
1315
1316 =item B<#hyphseq>
1317
1318 The sequence number of the OP, or a hyphen if it doesn't have one.
1319
1320 =item B<#label>
1321
1322 'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
1323 mode, or empty otherwise.
1324
1325 =item B<#lastaddr>
1326
1327 The address of the OP's last child, in hexidecimal.
1328
1329 =item B<#name>
1330
1331 The OP's name.
1332
1333 =item B<#NAME>
1334
1335 The OP's name, in all caps.
1336
1337 =item B<#next>
1338
1339 The sequence number of the OP's next OP.
1340
1341 =item B<#nextaddr>
1342
1343 The address of the OP's next OP, in hexidecimal.
1344
1345 =item B<#noise>
1346
1347 A one- or two-character abbreviation for the OP's name.
1348
1349 =item B<#private>
1350
1351 The OP's private flags, rendered with abbreviated names if possible.
1352
1353 =item B<#privval>
1354
1355 The numeric value of the OP's private flags.
1356
1357 =item B<#seq>
1358
1359 The sequence number of the OP. Note that this is a sequence number
1360 generated by B::Concise.
1361
1362 =item B<#seqnum>
1363
1364 5.8.x and earlier only. 5.9 and later do not provide this.
1365
1366 The real sequence number of the OP, as a regular number and not adjusted
1367 to be relative to the start of the real program. (This will generally be
1368 a fairly large number because all of B<B::Concise> is compiled before
1369 your program is).
1370
1371 =item B<#opt>
1372
1373 Whether or not the op has been optimised by the peephole optimiser.
1374
1375 Only available in 5.9 and later.
1376
1377 =item B<#static>
1378
1379 Whether or not the op is statically defined.  This flag is used by the
1380 B::C compiler backend and indicates that the op should not be freed.
1381
1382 Only available in 5.9 and later.
1383
1384 =item B<#sibaddr>
1385
1386 The address of the OP's next youngest sibling, in hexidecimal.
1387
1388 =item B<#svaddr>
1389
1390 The address of the OP's SV, if it has an SV, in hexidecimal.
1391
1392 =item B<#svclass>
1393
1394 The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
1395
1396 =item B<#svval>
1397
1398 The value of the OP's SV, if it has one, in a short human-readable format.
1399
1400 =item B<#targ>
1401
1402 The numeric value of the OP's targ.
1403
1404 =item B<#targarg>
1405
1406 The name of the variable the OP's targ refers to, if any, otherwise the
1407 letter t followed by the OP's targ in decimal.
1408
1409 =item B<#targarglife>
1410
1411 Same as B<#targarg>, but followed by the COP sequence numbers that delimit
1412 the variable's lifetime (or 'end' for a variable in an open scope) for a
1413 variable.
1414
1415 =item B<#typenum>
1416
1417 The numeric value of the OP's type, in decimal.
1418
1419 =back
1420
1421 =head1 Using B::Concise outside of the O framework
1422
1423 The common (and original) usage of B::Concise was for command-line
1424 renderings of simple code, as given in EXAMPLE.  But you can also use
1425 B<B::Concise> from your code, and call compile() directly, and
1426 repeatedly.  By doing so, you can avoid the compile-time only
1427 operation of O.pm, and even use the debugger to step through
1428 B::Concise::compile() itself.
1429
1430 Once you're doing this, you may alter Concise output by adding new
1431 rendering styles, and by optionally adding callback routines which
1432 populate new variables, if such were referenced from those (just
1433 added) styles.  
1434
1435 =head2 Example: Altering Concise Renderings
1436
1437     use B::Concise qw(set_style add_callback);
1438     add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
1439     add_callback
1440       ( sub {
1441             my ($h, $op, $format, $level, $stylename) = @_;
1442             $h->{variable} = some_func($op);
1443         });
1444     $walker = B::Concise::compile(@options,@subnames,@subrefs);
1445     $walker->();
1446
1447 =head2 set_style()
1448
1449 B<set_style> accepts 3 arguments, and updates the three format-specs
1450 comprising a line-style (basic-exec, goto, tree).  It has one minor
1451 drawback though; it doesn't register the style under a new name.  This
1452 can become an issue if you render more than once and switch styles.
1453 Thus you may prefer to use add_style() and/or set_style_standard()
1454 instead.
1455
1456 =head2 set_style_standard($name)
1457
1458 This restores one of the standard line-styles: C<terse>, C<concise>,
1459 C<linenoise>, C<debug>, C<env>, into effect.  It also accepts style
1460 names previously defined with add_style().
1461
1462 =head2 add_style()
1463
1464 This subroutine accepts a new style name and three style arguments as
1465 above, and creates, registers, and selects the newly named style.  It is
1466 an error to re-add a style; call set_style_standard() to switch between
1467 several styles.
1468
1469 =head2 add_callback()
1470
1471 If your newly minted styles refer to any #variables, you'll need to
1472 define a callback subroutine that will populate (or modify) those
1473 variables.  They are then available for use in the style you've chosen.
1474
1475 The callbacks are called for each opcode visited by Concise, in the
1476 same order as they are added.  Each subroutine is passed five
1477 parameters.
1478
1479   1. A hashref, containing the variable names and values which are
1480      populated into the report-line for the op
1481   2. the op, as a B<B::OP> object
1482   3. a reference to the format string
1483   4. the formatting (indent) level
1484   5. the selected stylename
1485
1486 To define your own variables, simply add them to the hash, or change
1487 existing values if you need to.  The level and format are passed in as
1488 references to scalars, but it is unlikely that they will need to be
1489 changed or even used.
1490
1491 =head2 Running B::Concise::compile()
1492
1493 B<compile> accepts options as described above in L</OPTIONS>, and
1494 arguments, which are either coderefs, or subroutine names.
1495
1496 It constructs and returns a $treewalker coderef, which when invoked,
1497 traverses, or walks, and renders the optrees of the given arguments to
1498 STDOUT.  You can reuse this, and can change the rendering style used
1499 each time; thereafter the coderef renders in the new style.
1500
1501 B<walk_output> lets you change the print destination from STDOUT to
1502 another open filehandle, or (unless you've built with -Uuseperlio)
1503 into a string passed as a ref.
1504
1505     my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef);  # 1
1506     walk_output(\my $buf);
1507     $walker->();                        # 1 renders -terse
1508     set_style_standard('concise');      # 2
1509     $walker->();                        # 2 renders -concise
1510     $walker->(@new);                    # 3 renders whatever
1511     print "3 different renderings: terse, concise, and @new: $buf\n";
1512
1513 When $walker is called, it traverses the subroutines supplied when it
1514 was created, and renders them using the current style.  You can change
1515 the style afterwards in several different ways:
1516
1517   1. call C<compile>, altering style or mode/order
1518   2. call C<set_style_standard>
1519   3. call $walker, passing @new options
1520
1521 Passing new options to the $walker is the easiest way to change
1522 amongst any pre-defined styles (the ones you add are automatically
1523 recognized as options), and is the only way to alter rendering order
1524 without calling compile again.  Note however that rendering state is
1525 still shared amongst multiple $walker objects, so they must still be
1526 used in a coordinated manner.
1527
1528 =head2 B::Concise::reset_sequence()
1529
1530 This function (not exported) lets you reset the sequence numbers (note
1531 that they're numbered arbitrarily, their goal being to be human
1532 readable).  Its purpose is mostly to support testing, i.e. to compare
1533 the concise output from two identical anonymous subroutines (but
1534 different instances).  Without the reset, B::Concise, seeing that
1535 they're separate optrees, generates different sequence numbers in
1536 the output.
1537
1538 =head2 Errors
1539
1540 All detected errors, (invalid arguments, internal errors, etc.) are
1541 resolved with a die($message). Use an eval if you wish to catch these
1542 errors and continue processing.
1543
1544 In particular, B<compile> will die if you've asked for a non-existent
1545 function-name, a non-existent coderef, or a non-CODE reference.
1546
1547 =head1 AUTHOR
1548
1549 Stephen McCamant, E<lt>smcc@CSUA.Berkeley.EDUE<gt>.
1550
1551 =cut