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