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