summaryrefslogtreecommitdiffstats
path: root/upstream/archlinux/man3/B::Concise.3perl
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/archlinux/man3/B::Concise.3perl')
-rw-r--r--upstream/archlinux/man3/B::Concise.3perl752
1 files changed, 752 insertions, 0 deletions
diff --git a/upstream/archlinux/man3/B::Concise.3perl b/upstream/archlinux/man3/B::Concise.3perl
new file mode 100644
index 00000000..3241b8ca
--- /dev/null
+++ b/upstream/archlinux/man3/B::Concise.3perl
@@ -0,0 +1,752 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "B::Concise 3perl"
+.TH B::Concise 3perl 2024-02-11 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+B::Concise \- Walk Perl syntax tree, printing concise info about ops
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& perl \-MO=Concise[,OPTIONS] foo.pl
+\&
+\& use B::Concise qw(set_style add_callback);
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+This compiler backend prints the internal OPs of a Perl program's syntax
+tree in one of several space-efficient text formats suitable for debugging
+the inner workings of perl or other compiler backends. It can print OPs in
+the order they appear in the OP tree, in the order they will execute, or
+in a text approximation to their tree structure, and the format of the
+information displayed is customizable. Its function is similar to that of
+perl's \fB\-Dx\fR debugging flag or the \fBB::Terse\fR module, but it is more
+sophisticated and flexible.
+.SH EXAMPLE
+.IX Header "EXAMPLE"
+Here's two outputs (or 'renderings'), using the \-exec and \-basic
+(i.e. default) formatting conventions on the same code snippet.
+.PP
+.Vb 9
+\& % perl \-MO=Concise,\-exec \-e \*(Aq$a = $b + 42\*(Aq
+\& 1 <0> enter
+\& 2 <;> nextstate(main 1 \-e:1) v
+\& 3 <#> gvsv[*b] s
+\& 4 <$> const[IV 42] s
+\& * 5 <2> add[t3] sK/2
+\& 6 <#> gvsv[*a] s
+\& 7 <2> sassign vKS/2
+\& 8 <@> leave[1 ref] vKP/REFC
+.Ve
+.PP
+In this \-exec rendering, each opcode is executed in the order shown.
+The add opcode, marked with '*', is discussed in more detail.
+.PP
+The 1st column is the op's sequence number, starting at 1, and is
+displayed in base 36 by default. Here they're purely linear; the
+sequences are very helpful when looking at code with loops and
+branches.
+.PP
+The symbol between angle brackets indicates the op's type, for
+example; <2> is a BINOP, <@> a LISTOP, and <#> is a PADOP, which is
+used in threaded perls. (see "OP class abbreviations").
+.PP
+The opname, as in \fB'add[t1]'\fR, may be followed by op-specific
+information in parentheses or brackets (ex \fB'[t1]'\fR).
+.PP
+The op-flags (ex \fB'sK/2'\fR) are described in ("OP flags
+abbreviations").
+.PP
+.Vb 11
+\& % perl \-MO=Concise \-e \*(Aq$a = $b + 42\*(Aq
+\& 8 <@> leave[1 ref] vKP/REFC \->(end)
+\& 1 <0> enter \->2
+\& 2 <;> nextstate(main 1 \-e:1) v \->3
+\& 7 <2> sassign vKS/2 \->8
+\& * 5 <2> add[t1] sK/2 \->6
+\& \- <1> ex\-rv2sv sK/1 \->4
+\& 3 <$> gvsv(*b) s \->4
+\& 4 <$> const(IV 42) s \->5
+\& \- <1> ex\-rv2sv sKRM*/1 \->7
+\& 6 <$> gvsv(*a) s \->7
+.Ve
+.PP
+The default rendering is top-down, so they're not in execution order.
+This form reflects the way the stack is used to parse and evaluate
+expressions; the add operates on the two terms below it in the tree.
+.PP
+Nullops appear as \f(CW\*(C`ex\-opname\*(C'\fR, where \fIopname\fR is an op that has been
+optimized away by perl. They're displayed with a sequence-number of
+\&'\-', because they are not executed (they don't appear in previous
+example), they're printed here because they reflect the parse.
+.PP
+The arrow points to the sequence number of the next op; they're not
+displayed in \-exec mode, for obvious reasons.
+.PP
+Note that because this rendering was done on a non-threaded perl, the
+PADOPs in the previous examples are now SVOPs, and some (but not all)
+of the square brackets have been replaced by round ones. This is a
+subtle feature to provide some visual distinction between renderings
+on threaded and un-threaded perls.
+.SH OPTIONS
+.IX Header "OPTIONS"
+Arguments that don't start with a hyphen are taken to be the names of
+subroutines or formats to render; if no
+such functions are specified, the main
+body of the program (outside any subroutines, and not including use'd
+or require'd files) is rendered. Passing \f(CW\*(C`BEGIN\*(C'\fR, \f(CW\*(C`UNITCHECK\*(C'\fR,
+\&\f(CW\*(C`CHECK\*(C'\fR, \f(CW\*(C`INIT\*(C'\fR, or \f(CW\*(C`END\*(C'\fR will cause all of the corresponding
+special blocks to be printed. Arguments must follow options.
+.PP
+Options affect how things are rendered (ie printed). They're presented
+here by their visual effect, 1st being strongest. They're grouped
+according to how they interrelate; within each group the options are
+mutually exclusive (unless otherwise stated).
+.SS "Options for Opcode Ordering"
+.IX Subsection "Options for Opcode Ordering"
+These options control the 'vertical display' of opcodes. The display
+\&'order' is also called 'mode' elsewhere in this document.
+.IP \fB\-basic\fR 4
+.IX Item "-basic"
+Print OPs in the order they appear in the OP tree (a preorder
+traversal, starting at the root). The indentation of each OP shows its
+level in the tree, and the '\->' at the end of the line indicates the
+next opcode in execution order. This mode is the default, so the flag
+is included simply for completeness.
+.IP \fB\-exec\fR 4
+.IX Item "-exec"
+Print OPs in the order they would normally execute (for the majority
+of constructs this is a postorder traversal of the tree, ending at the
+root). In most cases the OP that usually follows a given OP will
+appear directly below it; alternate paths are shown by indentation. In
+cases like loops when control jumps out of a linear path, a 'goto'
+line is generated.
+.IP \fB\-tree\fR 4
+.IX Item "-tree"
+Print OPs in a text approximation of a tree, with the root of the tree
+at the left and 'left\-to\-right' order of children transformed into
+\&'top\-to\-bottom'. Because this mode grows both to the right and down,
+it isn't suitable for large programs (unless you have a very wide
+terminal).
+.SS "Options for Line-Style"
+.IX Subsection "Options for Line-Style"
+These options select the line-style (or just style) used to render
+each opcode, and dictates what info is actually printed into each line.
+.IP \fB\-concise\fR 4
+.IX Item "-concise"
+Use the author's favorite set of formatting conventions. This is the
+default, of course.
+.IP \fB\-terse\fR 4
+.IX Item "-terse"
+Use formatting conventions that emulate the output of \fBB::Terse\fR. The
+basic mode is almost indistinguishable from the real \fBB::Terse\fR, and the
+exec mode looks very similar, but is in a more logical order and lacks
+curly brackets. \fBB::Terse\fR doesn't have a tree mode, so the tree mode
+is only vaguely reminiscent of \fBB::Terse\fR.
+.IP \fB\-linenoise\fR 4
+.IX Item "-linenoise"
+Use formatting conventions in which the name of each OP, rather than being
+written out in full, is represented by a one\- or two-character abbreviation.
+This is mainly a joke.
+.IP \fB\-debug\fR 4
+.IX Item "-debug"
+Use formatting conventions reminiscent of CPAN module \fBB::Debug\fR; these aren't
+very concise at all.
+.IP \fB\-env\fR 4
+.IX Item "-env"
+Use formatting conventions read from the environment variables
+\&\f(CW\*(C`B_CONCISE_FORMAT\*(C'\fR, \f(CW\*(C`B_CONCISE_GOTO_FORMAT\*(C'\fR, and \f(CW\*(C`B_CONCISE_TREE_FORMAT\*(C'\fR.
+.SS "Options for tree-specific formatting"
+.IX Subsection "Options for tree-specific formatting"
+.IP \fB\-compact\fR 4
+.IX Item "-compact"
+Use a tree format in which the minimum amount of space is used for the
+lines connecting nodes (one character in most cases). This squeezes out
+a few precious columns of screen real estate.
+.IP \fB\-loose\fR 4
+.IX Item "-loose"
+Use a tree format that uses longer edges to separate OP nodes. This format
+tends to look better than the compact one, especially in ASCII, and is
+the default.
+.IP \fB\-vt\fR 4
+.IX Item "-vt"
+Use tree connecting characters drawn from the VT100 line-drawing set.
+This looks better if your terminal supports it.
+.IP \fB\-ascii\fR 4
+.IX Item "-ascii"
+Draw the tree with standard ASCII characters like \f(CW\*(C`+\*(C'\fR and \f(CW\*(C`|\*(C'\fR. These don't
+look as clean as the VT100 characters, but they'll work with almost any
+terminal (or the horizontal scrolling mode of \fBless\fR\|(1)) and are suitable
+for text documentation or email. This is the default.
+.PP
+These are pairwise exclusive, i.e. compact or loose, vt or ascii.
+.SS "Options controlling sequence numbering"
+.IX Subsection "Options controlling sequence numbering"
+.IP \fB\-base\fR\fIn\fR 4
+.IX Item "-basen"
+Print OP sequence numbers in base \fIn\fR. If \fIn\fR is greater than 10, the
+digit for 11 will be 'a', and so on. If \fIn\fR is greater than 36, the digit
+for 37 will be 'A', and so on until 62. Values greater than 62 are not
+currently supported. The default is 36.
+.IP \fB\-bigendian\fR 4
+.IX Item "-bigendian"
+Print sequence numbers with the most significant digit first. This is the
+usual convention for Arabic numerals, and the default.
+.IP \fB\-littleendian\fR 4
+.IX Item "-littleendian"
+Print sequence numbers with the least significant digit first. This is
+obviously mutually exclusive with bigendian.
+.SS "Other options"
+.IX Subsection "Other options"
+.IP \fB\-src\fR 4
+.IX Item "-src"
+With this option, the rendering of each statement (starting with the
+nextstate OP) will be preceded by the 1st line of source code that
+generates it. For example:
+.Sp
+.Vb 10
+\& 1 <0> enter
+\& # 1: my $i;
+\& 2 <;> nextstate(main 1 junk.pl:1) v:{
+\& 3 <0> padsv[$i:1,10] vM/LVINTRO
+\& # 3: for $i (0..9) {
+\& 4 <;> nextstate(main 3 junk.pl:3) v:{
+\& 5 <0> pushmark s
+\& 6 <$> const[IV 0] s
+\& 7 <$> const[IV 9] s
+\& 8 <{> enteriter(next\->j last\->m redo\->9)[$i:1,10] lKS
+\& k <0> iter s
+\& l <|> and(other\->9) vK/1
+\& # 4: print "line ";
+\& 9 <;> nextstate(main 2 junk.pl:4) v
+\& a <0> pushmark s
+\& b <$> const[PV "line "] s
+\& c <@> print vK
+\& # 5: print "$i\en";
+\& ...
+.Ve
+.IP "\fB\-stash=""somepackage""\fR" 4
+.IX Item "-stash=""somepackage"""
+With this, "somepackage" will be required, then the stash is
+inspected, and each function is rendered.
+.PP
+The following options are pairwise exclusive.
+.IP \fB\-main\fR 4
+.IX Item "-main"
+Include the main program in the output, even if subroutines were also
+specified. This rendering is normally suppressed when a subroutine
+name or reference is given.
+.IP \fB\-nomain\fR 4
+.IX Item "-nomain"
+This restores the default behavior after you've changed it with '\-main'
+(it's not normally needed). If no subroutine name/ref is given, main is
+rendered, regardless of this flag.
+.IP \fB\-nobanner\fR 4
+.IX Item "-nobanner"
+Renderings usually include a banner line identifying the function name
+or stringified subref. This suppresses the printing of the banner.
+.Sp
+TBC: Remove the stringified coderef; while it provides a 'cookie' for
+each function rendered, the cookies used should be 1,2,3.. not a
+random hex-address. It also complicates string comparison of two
+different trees.
+.IP \fB\-banner\fR 4
+.IX Item "-banner"
+restores default banner behavior.
+.IP "\fB\-banneris\fR => subref" 4
+.IX Item "-banneris => subref"
+TBC: a hookpoint (and an option to set it) for a user-supplied
+function to produce a banner appropriate for users needs. It's not
+ideal, because the rendering-state variables, which are a natural
+candidate for use in concise.t, are unavailable to the user.
+.SS "Option Stickiness"
+.IX Subsection "Option Stickiness"
+If you invoke Concise more than once in a program, you should know that
+the options are 'sticky'. This means that the options you provide in
+the first call will be remembered for the 2nd call, unless you
+re-specify or change them.
+.SH ABBREVIATIONS
+.IX Header "ABBREVIATIONS"
+The concise style uses symbols to convey maximum info with minimal
+clutter (like hex addresses). With just a little practice, you can
+start to see the flowers, not just the branches, in the trees.
+.SS "OP class abbreviations"
+.IX Subsection "OP class abbreviations"
+These symbols appear before the op-name, and indicate the
+B:: namespace that represents the ops in your Perl code.
+.PP
+.Vb 10
+\& 0 OP (aka BASEOP) An OP with no children
+\& 1 UNOP An OP with one child
+\& + UNOP_AUX A UNOP with auxillary fields
+\& 2 BINOP An OP with two children
+\& | LOGOP A control branch OP
+\& @ LISTOP An OP that could have lots of children
+\& / PMOP An OP with a regular expression
+\& $ SVOP An OP with an SV
+\& " PVOP An OP with a string
+\& { LOOP An OP that holds pointers for a loop
+\& ; COP An OP that marks the start of a statement
+\& # PADOP An OP with a GV on the pad
+\& . METHOP An OP with method call info
+.Ve
+.SS "OP flags abbreviations"
+.IX Subsection "OP flags abbreviations"
+OP flags are either public or private. The public flags alter the
+behavior of each opcode in consistent ways, and are represented by 0
+or more single characters.
+.PP
+.Vb 12
+\& v OPf_WANT_VOID Want nothing (void context)
+\& s OPf_WANT_SCALAR Want single value (scalar context)
+\& l OPf_WANT_LIST Want list of any length (list context)
+\& Want is unknown
+\& K OPf_KIDS There is a firstborn child.
+\& P OPf_PARENS This operator was parenthesized.
+\& (Or block needs explicit scope entry.)
+\& R OPf_REF Certified reference.
+\& (Return container, not containee).
+\& M OPf_MOD Will modify (lvalue).
+\& S OPf_STACKED Some arg is arriving on the stack.
+\& * OPf_SPECIAL Do something weird for this op (see op.h)
+.Ve
+.PP
+Private flags, if any are set for an opcode, are displayed after a '/'
+.PP
+.Vb 2
+\& 8 <@> leave[1 ref] vKP/REFC \->(end)
+\& 7 <2> sassign vKS/2 \->8
+.Ve
+.PP
+They're opcode specific, and occur less often than the public ones, so
+they're represented by short mnemonics instead of single-chars; see
+B::Op_private and \fIregen/op_private\fR for more details.
+.PP
+Note that a number after a '/' often indicates the number of arguments.
+In the \fIsassign\fR example above, the OP takes 2 arguments. These values
+are sometimes used at runtime: in particular, the MAXARG macro makes use
+of them.
+.SH "FORMATTING SPECIFICATIONS"
+.IX Header "FORMATTING SPECIFICATIONS"
+For each line-style ('concise', 'terse', 'linenoise', etc.) there are
+3 format-specs which control how OPs are rendered.
+.PP
+The first is the 'default' format, which is used in both basic and exec
+modes to print all opcodes. The 2nd, goto-format, is used in exec
+mode when branches are encountered. They're not real opcodes, and are
+inserted to look like a closing curly brace. The tree-format is tree
+specific.
+.PP
+When a line is rendered, the correct format-spec is copied and scanned
+for the following items; data is substituted in, and other
+manipulations like basic indenting are done, for each opcode rendered.
+.PP
+There are 3 kinds of items that may be populated; special patterns,
+#vars, and literal text, which is copied verbatim. (Yes, it's a set
+of s///g steps.)
+.SS "Special Patterns"
+.IX Subsection "Special Patterns"
+These items are the primitives used to perform indenting, and to
+select text from amongst alternatives.
+.IP \fB(x(\fR\fIexec_text\fR\fB;\fR\fIbasic_text\fR\fB)x)\fR 4
+.IX Item "(x(exec_text;basic_text)x)"
+Generates \fIexec_text\fR in exec mode, or \fIbasic_text\fR in basic mode.
+.IP \fB(*(\fR\fItext\fR\fB)*)\fR 4
+.IX Item "(*(text)*)"
+Generates one copy of \fItext\fR for each indentation level.
+.IP \fB(*(\fR\fItext1\fR\fB;\fR\fItext2\fR\fB)*)\fR 4
+.IX Item "(*(text1;text2)*)"
+Generates one fewer copies of \fItext1\fR than the indentation level, followed
+by one copy of \fItext2\fR if the indentation level is more than 0.
+.IP \fB(?(\fR\fItext1\fR\fB#\fR\fIvar\fR\fIText2\fR\fB)?)\fR 4
+.IX Item "(?(text1#varText2)?)"
+If the value of \fIvar\fR is true (not empty or zero), generates the
+value of \fIvar\fR surrounded by \fItext1\fR and \fIText2\fR, otherwise
+nothing.
+.IP \fB~\fR 4
+.IX Item "~"
+Any number of tildes and surrounding whitespace will be collapsed to
+a single space.
+.SS "# Variables"
+.IX Subsection "# Variables"
+These #vars represent opcode properties that you may want as part of
+your rendering. The '#' is intended as a private sigil; a #var's
+value is interpolated into the style-line, much like "read \f(CW$this\fR".
+.PP
+These vars take 3 forms:
+.IP \fB#\fR\fIvar\fR 4
+.IX Item "#var"
+A property named 'var' is assumed to exist for the opcodes, and is
+interpolated into the rendering.
+.IP \fB#\fR\fIvar\fR\fIN\fR 4
+.IX Item "#varN"
+Generates the value of \fIvar\fR, left justified to fill \fIN\fR spaces.
+Note that this means while you can have properties 'foo' and 'foo2',
+you cannot render 'foo2', but you could with 'foo2a'. You would be
+wise not to rely on this behavior going forward ;\-)
+.IP \fB#\fR\fIVar\fR 4
+.IX Item "#Var"
+This ucfirst form of #var generates a tag-value form of itself for
+display; it converts '#Var' into a 'Var => #var' style, which is then
+handled as described above. (Imp-note: #Vars cannot be used for
+conditional-fills, because the => #var transform is done after the check
+for #Var's value).
+.PP
+The following variables are 'defined' by B::Concise; when they are
+used in a style, their respective values are plugged into the
+rendering of each opcode.
+.PP
+Only some of these are used by the standard styles, the others are
+provided for you to delve into optree mechanics, should you wish to
+add a new style (see "add_style" below) that uses them. You can
+also add new ones using "add_callback".
+.IP \fB#addr\fR 4
+.IX Item "#addr"
+The address of the OP, in hexadecimal.
+.IP \fB#arg\fR 4
+.IX Item "#arg"
+The OP-specific information of the OP (such as the SV for an SVOP, the
+non-local exit pointers for a LOOP, etc.) enclosed in parentheses.
+.IP \fB#class\fR 4
+.IX Item "#class"
+The B\-determined class of the OP, in all caps.
+.IP \fB#classsym\fR 4
+.IX Item "#classsym"
+A single symbol abbreviating the class of the OP.
+.IP \fB#coplabel\fR 4
+.IX Item "#coplabel"
+The label of the statement or block the OP is the start of, if any.
+.IP \fB#exname\fR 4
+.IX Item "#exname"
+The name of the OP, or 'ex\-foo' if the OP is a null that used to be a foo.
+.IP \fB#extarg\fR 4
+.IX Item "#extarg"
+The target of the OP, or nothing for a nulled OP.
+.IP \fB#firstaddr\fR 4
+.IX Item "#firstaddr"
+The address of the OP's first child, in hexadecimal.
+.IP \fB#flags\fR 4
+.IX Item "#flags"
+The OP's flags, abbreviated as a series of symbols.
+.IP \fB#flagval\fR 4
+.IX Item "#flagval"
+The numeric value of the OP's flags.
+.IP \fB#hints\fR 4
+.IX Item "#hints"
+The COP's hint flags, rendered with abbreviated names if possible. An empty
+string if this is not a COP. Here are the symbols used:
+.Sp
+.Vb 10
+\& $ strict refs
+\& & strict subs
+\& * strict vars
+\& x$ explicit use/no strict refs
+\& x& explicit use/no strict subs
+\& x* explicit use/no strict vars
+\& i integers
+\& l locale
+\& b bytes
+\& { block scope
+\& % localise %^H
+\& < open in
+\& > open out
+\& I overload int
+\& F overload float
+\& B overload binary
+\& S overload string
+\& R overload re
+\& T taint
+\& E eval
+\& X filetest access
+\& U utf\-8
+\&
+\& us use feature \*(Aqunicode_strings\*(Aq
+\& fea=NNN feature bundle number
+.Ve
+.IP \fB#hintsval\fR 4
+.IX Item "#hintsval"
+The numeric value of the COP's hint flags, or an empty string if this is not
+a COP.
+.IP \fB#hyphseq\fR 4
+.IX Item "#hyphseq"
+The sequence number of the OP, or a hyphen if it doesn't have one.
+.IP \fB#label\fR 4
+.IX Item "#label"
+\&'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
+mode, or empty otherwise.
+.IP \fB#lastaddr\fR 4
+.IX Item "#lastaddr"
+The address of the OP's last child, in hexadecimal.
+.IP \fB#name\fR 4
+.IX Item "#name"
+The OP's name.
+.IP \fB#NAME\fR 4
+.IX Item "#NAME"
+The OP's name, in all caps.
+.IP \fB#next\fR 4
+.IX Item "#next"
+The sequence number of the OP's next OP.
+.IP \fB#nextaddr\fR 4
+.IX Item "#nextaddr"
+The address of the OP's next OP, in hexadecimal.
+.IP \fB#noise\fR 4
+.IX Item "#noise"
+A one\- or two-character abbreviation for the OP's name.
+.IP \fB#private\fR 4
+.IX Item "#private"
+The OP's private flags, rendered with abbreviated names if possible.
+.IP \fB#privval\fR 4
+.IX Item "#privval"
+The numeric value of the OP's private flags.
+.IP \fB#seq\fR 4
+.IX Item "#seq"
+The sequence number of the OP. Note that this is a sequence number
+generated by B::Concise.
+.IP \fB#opt\fR 4
+.IX Item "#opt"
+Whether or not the op has been optimized by the peephole optimizer.
+.IP \fB#sibaddr\fR 4
+.IX Item "#sibaddr"
+The address of the OP's next youngest sibling, in hexadecimal.
+.IP \fB#svaddr\fR 4
+.IX Item "#svaddr"
+The address of the OP's SV, if it has an SV, in hexadecimal.
+.IP \fB#svclass\fR 4
+.IX Item "#svclass"
+The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
+.IP \fB#svval\fR 4
+.IX Item "#svval"
+The value of the OP's SV, if it has one, in a short human-readable format.
+.IP \fB#targ\fR 4
+.IX Item "#targ"
+The numeric value of the OP's targ.
+.IP \fB#targarg\fR 4
+.IX Item "#targarg"
+The name of the variable the OP's targ refers to, if any, otherwise the
+letter t followed by the OP's targ in decimal.
+.IP \fB#targarglife\fR 4
+.IX Item "#targarglife"
+Same as \fB#targarg\fR, but followed by the COP sequence numbers that delimit
+the variable's lifetime (or 'end' for a variable in an open scope) for a
+variable.
+.IP \fB#typenum\fR 4
+.IX Item "#typenum"
+The numeric value of the OP's type, in decimal.
+.SH "One-Liner Command tips"
+.IX Header "One-Liner Command tips"
+.IP "perl \-MO=Concise,bar foo.pl" 4
+.IX Item "perl -MO=Concise,bar foo.pl"
+Renders only \fBbar()\fR from foo.pl. To see main, drop the ',bar'. To see
+both, add ',\-main'
+.IP "perl \-MDigest::MD5=md5 \-MO=Concise,md5 \-e1" 4
+.IX Item "perl -MDigest::MD5=md5 -MO=Concise,md5 -e1"
+Identifies md5 as an XS function. The export is needed so that BC can
+find it in main.
+.IP "perl \-MPOSIX \-MO=Concise,_POSIX_ARG_MAX \-e1" 4
+.IX Item "perl -MPOSIX -MO=Concise,_POSIX_ARG_MAX -e1"
+Identifies _POSIX_ARG_MAX as a constant sub, optimized to an IV.
+Although POSIX isn't entirely consistent across platforms, this is
+likely to be present in virtually all of them.
+.IP "perl \-MPOSIX \-MO=Concise,a \-e 'print _POSIX_SAVED_IDS'" 4
+.IX Item "perl -MPOSIX -MO=Concise,a -e 'print _POSIX_SAVED_IDS'"
+This renders a print statement, which includes a call to the function.
+It's identical to rendering a file with a use call and that single
+statement, except for the filename which appears in the nextstate ops.
+.IP "perl \-MPOSIX \-MO=Concise,a \-e 'sub a{_POSIX_SAVED_IDS}'" 4
+.IX Item "perl -MPOSIX -MO=Concise,a -e 'sub a{_POSIX_SAVED_IDS}'"
+This is \fBvery\fR similar to previous, only the first two ops differ. This
+subroutine rendering is more representative, insofar as a single main
+program will have many subs.
+.IP "perl \-MB::Concise \-e 'B::Concise::compile(""\-exec"",""\-src"", \e%B::Concise::)\->()'" 4
+.IX Item "perl -MB::Concise -e 'B::Concise::compile(""-exec"",""-src"", %B::Concise::)->()'"
+This renders all functions in the B::Concise package with the source
+lines. It eschews the O framework so that the stashref can be passed
+directly to \fBB::Concise::compile()\fR. See \-stash option for a more
+convenient way to render a package.
+.SH "Using B::Concise outside of the O framework"
+.IX Header "Using B::Concise outside of the O framework"
+The common (and original) usage of B::Concise was for command-line
+renderings of simple code, as given in EXAMPLE. But you can also use
+\&\fBB::Concise\fR from your code, and call \fBcompile()\fR directly, and
+repeatedly. By doing so, you can avoid the compile-time only
+operation of O.pm, and even use the debugger to step through
+\&\fBB::Concise::compile()\fR itself.
+.PP
+Once you're doing this, you may alter Concise output by adding new
+rendering styles, and by optionally adding callback routines which
+populate new variables, if such were referenced from those (just
+added) styles.
+.SS "Example: Altering Concise Renderings"
+.IX Subsection "Example: Altering Concise Renderings"
+.Vb 9
+\& use B::Concise qw(set_style add_callback);
+\& add_style($yourStyleName => $defaultfmt, $gotofmt, $treefmt);
+\& add_callback
+\& ( sub {
+\& my ($h, $op, $format, $level, $stylename) = @_;
+\& $h\->{variable} = some_func($op);
+\& });
+\& $walker = B::Concise::compile(@options,@subnames,@subrefs);
+\& $walker\->();
+.Ve
+.SS \fBset_style()\fP
+.IX Subsection "set_style()"
+\&\fBset_style\fR accepts 3 arguments, and updates the three format-specs
+comprising a line-style (basic-exec, goto, tree). It has one minor
+drawback though; it doesn't register the style under a new name. This
+can become an issue if you render more than once and switch styles.
+Thus you may prefer to use \fBadd_style()\fR and/or \fBset_style_standard()\fR
+instead.
+.SS set_style_standard($name)
+.IX Subsection "set_style_standard($name)"
+This restores one of the standard line-styles: \f(CW\*(C`terse\*(C'\fR, \f(CW\*(C`concise\*(C'\fR,
+\&\f(CW\*(C`linenoise\*(C'\fR, \f(CW\*(C`debug\*(C'\fR, \f(CW\*(C`env\*(C'\fR, into effect. It also accepts style
+names previously defined with \fBadd_style()\fR.
+.SS "add_style ()"
+.IX Subsection "add_style ()"
+This subroutine accepts a new style name and three style arguments as
+above, and creates, registers, and selects the newly named style. It is
+an error to re-add a style; call \fBset_style_standard()\fR to switch between
+several styles.
+.SS "add_callback ()"
+.IX Subsection "add_callback ()"
+If your newly minted styles refer to any new #variables, you'll need
+to define a callback subroutine that will populate (or modify) those
+variables. They are then available for use in the style you've
+chosen.
+.PP
+The callbacks are called for each opcode visited by Concise, in the
+same order as they are added. Each subroutine is passed five
+parameters.
+.PP
+.Vb 6
+\& 1. A hashref, containing the variable names and values which are
+\& populated into the report\-line for the op
+\& 2. the op, as a B<B::OP> object
+\& 3. a reference to the format string
+\& 4. the formatting (indent) level
+\& 5. the selected stylename
+.Ve
+.PP
+To define your own variables, simply add them to the hash, or change
+existing values if you need to. The level and format are passed in as
+references to scalars, but it is unlikely that they will need to be
+changed or even used.
+.SS "Running \fBB::Concise::compile()\fP"
+.IX Subsection "Running B::Concise::compile()"
+\&\fBcompile\fR accepts options as described above in "OPTIONS", and
+arguments, which are either coderefs, or subroutine names.
+.PP
+It constructs and returns a \f(CW$treewalker\fR coderef, which when invoked,
+traverses, or walks, and renders the optrees of the given arguments to
+STDOUT. You can reuse this, and can change the rendering style used
+each time; thereafter the coderef renders in the new style.
+.PP
+\&\fBwalk_output\fR lets you change the print destination from STDOUT to
+another open filehandle, or into a string passed as a ref (unless
+you've built perl with \-Uuseperlio).
+.PP
+.Vb 7
+\& my $walker = B::Concise::compile(\*(Aq\-terse\*(Aq,\*(AqaFuncName\*(Aq, \e&aSubRef); # 1
+\& walk_output(\emy $buf);
+\& $walker\->(); # 1 renders \-terse
+\& set_style_standard(\*(Aqconcise\*(Aq); # 2
+\& $walker\->(); # 2 renders \-concise
+\& $walker\->(@new); # 3 renders whatever
+\& print "3 different renderings: terse, concise, and @new: $buf\en";
+.Ve
+.PP
+When \f(CW$walker\fR is called, it traverses the subroutines supplied when it
+was created, and renders them using the current style. You can change
+the style afterwards in several different ways:
+.PP
+.Vb 3
+\& 1. call C<compile>, altering style or mode/order
+\& 2. call C<set_style_standard>
+\& 3. call $walker, passing @new options
+.Ve
+.PP
+Passing new options to the \f(CW$walker\fR is the easiest way to change
+amongst any pre-defined styles (the ones you add are automatically
+recognized as options), and is the only way to alter rendering order
+without calling compile again. Note however that rendering state is
+still shared amongst multiple \f(CW$walker\fR objects, so they must still be
+used in a coordinated manner.
+.SS \fBB::Concise::reset_sequence()\fP
+.IX Subsection "B::Concise::reset_sequence()"
+This function (not exported) lets you reset the sequence numbers (note
+that they're numbered arbitrarily, their goal being to be human
+readable). Its purpose is mostly to support testing, i.e. to compare
+the concise output from two identical anonymous subroutines (but
+different instances). Without the reset, B::Concise, seeing that
+they're separate optrees, generates different sequence numbers in
+the output.
+.SS Errors
+.IX Subsection "Errors"
+Errors in rendering (non-existent function-name, non-existent coderef)
+are written to the STDOUT, or wherever you've set it via
+\&\fBwalk_output()\fR.
+.PP
+Errors using the various *style* calls, and bad args to \fBwalk_output()\fR,
+result in \fBdie()\fR. Use an eval if you wish to catch these errors and
+continue processing.
+.SH AUTHOR
+.IX Header "AUTHOR"
+Stephen McCamant, <smcc@CSUA.Berkeley.EDU>.