3 # Copyright (c) 1996, 1997, 1998 Malcolm Beattie
5 # You may distribute under the terms of either the GNU General Public
6 # License or the Artistic License, as specified in the README file.
13 # walkoptree comes from B.pm (you are there), walkoptree comes from B.xs
14 @EXPORT_OK = qw(minus_c ppname save_BEGINs
15 class peekop cast_I32 cstring cchar hash threadsv_names
16 main_root main_start main_cv svref_2object opnumber
18 walkoptree_slow walkoptree walkoptree_exec walksymtable
19 parents comppadlist sv_undef compile_stats timing_info
20 begin_av init_av end_av);
24 @B::SV::ISA = 'B::OBJECT';
25 @B::NULL::ISA = 'B::SV';
26 @B::PV::ISA = 'B::SV';
27 @B::IV::ISA = 'B::SV';
28 @B::NV::ISA = 'B::IV';
29 @B::RV::ISA = 'B::SV';
30 @B::PVIV::ISA = qw(B::PV B::IV);
31 @B::PVNV::ISA = qw(B::PV B::NV);
32 @B::PVMG::ISA = 'B::PVNV';
33 @B::PVLV::ISA = 'B::PVMG';
34 @B::BM::ISA = 'B::PVMG';
35 @B::AV::ISA = 'B::PVMG';
36 @B::GV::ISA = 'B::PVMG';
37 @B::HV::ISA = 'B::PVMG';
38 @B::CV::ISA = 'B::PVMG';
39 @B::IO::ISA = 'B::PVMG';
40 @B::FM::ISA = 'B::CV';
42 @B::OP::ISA = 'B::OBJECT';
43 @B::UNOP::ISA = 'B::OP';
44 @B::BINOP::ISA = 'B::UNOP';
45 @B::LOGOP::ISA = 'B::UNOP';
46 @B::LISTOP::ISA = 'B::BINOP';
47 @B::SVOP::ISA = 'B::OP';
48 @B::PADOP::ISA = 'B::OP';
49 @B::PVOP::ISA = 'B::OP';
50 @B::CVOP::ISA = 'B::OP';
51 @B::LOOP::ISA = 'B::LISTOP';
52 @B::PMOP::ISA = 'B::LISTOP';
53 @B::COP::ISA = 'B::OP';
55 @B::SPECIAL::ISA = 'B::OBJECT';
58 # Stop "-w" from complaining about the lack of a real B::OBJECT class
67 my ($class, $value) = @_;
69 walkoptree_debug($value);
79 sub parents { \@parents }
84 return sprintf("%s (0x%x) %s", class($op), $$op, $op->name);
88 my($op, $method, $level) = @_;
89 $op_count++; # just for statistics
91 warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug;
93 if ($$op && ($op->flags & OPf_KIDS)) {
95 unshift(@parents, $op);
96 for ($kid = $op->first; $$kid; $kid = $kid->sibling) {
97 walkoptree_slow($kid, $method, $level + 1);
104 return "Total number of OPs processed: $op_count\n";
108 my ($sec, $min, $hr) = localtime;
109 my ($user, $sys) = times;
110 sprintf("%02d:%02d:%02d user=$user sys=$sys",
111 $hr, $min, $sec, $user, $sys);
121 my ($obj, $value) = @_;
122 # warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug
123 $symtable{sprintf("sym_%x", $$obj)} = $value;
128 return $symtable{sprintf("sym_%x", $$obj)};
131 sub walkoptree_exec {
132 my ($op, $method, $level) = @_;
134 my $prefix = " " x $level;
135 for (; $$op; $op = $op->next) {
138 print $prefix, "goto $sym\n";
141 savesym($op, sprintf("%s (0x%lx)", class($op), $$op));
142 $op->$method($level);
145 /^(or|and|mapwhile|grepwhile|entertry|range|cond_expr)$/)
147 print $prefix, uc($1), " => {\n";
148 walkoptree_exec($op->other, $method, $level + 1);
149 print $prefix, "}\n";
150 } elsif ($ppname eq "match" || $ppname eq "subst") {
151 my $pmreplstart = $op->pmreplstart;
153 print $prefix, "PMREPLSTART => {\n";
154 walkoptree_exec($pmreplstart, $method, $level + 1);
155 print $prefix, "}\n";
157 } elsif ($ppname eq "substcont") {
158 print $prefix, "SUBSTCONT => {\n";
159 walkoptree_exec($op->other->pmreplstart, $method, $level + 1);
160 print $prefix, "}\n";
162 } elsif ($ppname eq "enterloop") {
163 print $prefix, "REDO => {\n";
164 walkoptree_exec($op->redoop, $method, $level + 1);
165 print $prefix, "}\n", $prefix, "NEXT => {\n";
166 walkoptree_exec($op->nextop, $method, $level + 1);
167 print $prefix, "}\n", $prefix, "LAST => {\n";
168 walkoptree_exec($op->lastop, $method, $level + 1);
169 print $prefix, "}\n";
170 } elsif ($ppname eq "subst") {
171 my $replstart = $op->pmreplstart;
173 print $prefix, "SUBST => {\n";
174 walkoptree_exec($replstart, $method, $level + 1);
175 print $prefix, "}\n";
182 my ($symref, $method, $recurse, $prefix) = @_;
187 $prefix = '' unless defined $prefix;
188 while (($sym, $ref) = each %$symref) {
189 *glob = "*main::".$prefix.$sym;
191 $sym = $prefix . $sym;
192 if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) {
193 walksymtable(\%glob, $method, $recurse, $sym);
196 svref_2object(\*glob)->EGV->$method();
207 my ($class, $section, $symtable, $default) = @_;
208 $output_fh ||= FileHandle->new_tmpfile;
209 my $obj = bless [-1, $section, $symtable, $default], $class;
210 $sections{$section} = $obj;
215 my ($class, $section) = @_;
216 return $sections{$section};
221 while (defined($_ = shift)) {
222 print $output_fh "$section->[1]\t$_\n";
229 return $section->[0];
234 return $section->[1];
239 return $section->[2];
244 return $section->[3];
248 my ($section, $fh, $format) = @_;
249 my $name = $section->name;
250 my $sym = $section->symtable || {};
251 my $default = $section->default;
253 seek($output_fh, 0, 0);
254 while (<$output_fh>) {
259 exists($sym->{$1}) ? $sym->{$1} : $default;
261 printf $fh $format, $_;
275 B - The Perl Compiler
283 The C<B> module supplies classes which allow a Perl program to delve
284 into its own innards. It is the module used to implement the
285 "backends" of the Perl compiler. Usage of the compiler does not
286 require knowledge of this module: see the F<O> module for the
287 user-visible part. The C<B> module is of use to those who want to
288 write new compiler backends. This documentation assumes that the
289 reader knows a fair amount about perl's internals including such
290 things as SVs, OPs and the internal symbol table and syntax tree
293 =head1 OVERVIEW OF CLASSES
295 The C structures used by Perl's internals to hold SV and OP
296 information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a
297 class hierarchy and the C<B> module gives access to them via a true
298 object hierarchy. Structure fields which point to other objects
299 (whether types of SV or types of OP) are represented by the C<B>
300 module as Perl objects of the appropriate class. The bulk of the C<B>
301 module is the methods for accessing fields of these structures. Note
302 that all access is read-only: you cannot modify the internals by
305 =head2 SV-RELATED CLASSES
307 B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV,
308 B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in
309 the obvious way to the underlying C structures of similar names. The
310 inheritance hierarchy mimics the underlying C "inheritance". Access
311 methods correspond to the underlying C macros for field access,
312 usually with the leading "class indication" prefix removed (Sv, Av,
313 Hv, ...). The leading prefix is only left in cases where its removal
314 would cause a clash in method name. For example, C<GvREFCNT> stays
315 as-is since its abbreviation would clash with the "superclass" method
316 C<REFCNT> (corresponding to the C function C<SvREFCNT>).
368 =head2 B::PVMG METHODS
378 =head2 B::MAGIC METHODS
396 =head2 B::PVLV METHODS
430 This method returns TRUE if the GP field of the GV is NULL.
562 =head2 OP-RELATED CLASSES
564 B::OP, B::UNOP, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP,
565 B::SVOP, B::PADOP, B::PVOP, B::CVOP, B::LOOP, B::COP.
566 These classes correspond in
567 the obvious way to the underlying C structures of similar names. The
568 inheritance hierarchy mimics the underlying C "inheritance". Access
569 methods correspond to the underlying C structre field names, with the
570 leading "class indication" prefix removed (op_).
582 This returns the op name as a string (e.g. "add", "rv2av").
586 This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]",
587 "PL_ppaddr[OP_RV2AV]").
591 This returns the op description from the global C PL_op_desc array
592 (e.g. "addition" "array deref").
606 =head2 B::UNOP METHOD
614 =head2 B::BINOP METHOD
622 =head2 B::LOGOP METHOD
630 =head2 B::LISTOP METHOD
638 =head2 B::PMOP METHODS
658 =head2 B::SVOP METHOD
668 =head2 B::PADOP METHOD
676 =head2 B::PVOP METHOD
684 =head2 B::LOOP METHODS
696 =head2 B::COP METHODS
714 =head1 FUNCTIONS EXPORTED BY C<B>
716 The C<B> module exports a variety of functions: some are simple
717 utility functions, others provide a Perl program with a way to
718 get an initial "handle" on an internal object.
724 Return the (faked) CV corresponding to the main part of the Perl
729 Returns the AV object (i.e. in class B::AV) representing INIT blocks.
733 Returns the root op (i.e. an object in the appropriate B::OP-derived
734 class) of the main part of the Perl program.
738 Returns the starting op of the main part of the Perl program.
742 Returns the AV object (i.e. in class B::AV) of the global comppadlist.
746 Returns the SV object corresponding to the C variable C<sv_undef>.
750 Returns the SV object corresponding to the C variable C<sv_yes>.
754 Returns the SV object corresponding to the C variable C<sv_no>.
756 =item amagic_generation
758 Returns the SV object corresponding to the C variable C<amagic_generation>.
760 =item walkoptree(OP, METHOD)
762 Does a tree-walk of the syntax tree based at OP and calls METHOD on
763 each op it visits. Each node is visited before its children. If
764 C<walkoptree_debug> (q.v.) has been called to turn debugging on then
765 the method C<walkoptree_debug> is called on each op before METHOD is
768 =item walkoptree_debug(DEBUG)
770 Returns the current debugging flag for C<walkoptree>. If the optional
771 DEBUG argument is non-zero, it sets the debugging flag to that. See
772 the description of C<walkoptree> above for what the debugging flag
775 =item walksymtable(SYMREF, METHOD, RECURSE)
777 Walk the symbol table starting at SYMREF and call METHOD on each
778 symbol visited. When the walk reached package symbols "Foo::" it
779 invokes RECURSE and only recurses into the package if that sub
782 =item svref_2object(SV)
784 Takes any Perl variable and turns it into an object in the
785 appropriate B::OP-derived or B::SV-derived class. Apart from functions
786 such as C<main_root>, this is the primary way to get an initial
787 "handle" on a internal perl data structure which can then be followed
788 with the other access methods.
792 Return the PP function name (e.g. "pp_add") of op number OPNUM.
796 Returns a string in the form "0x..." representing the value of the
797 internal hash function used by perl on string STR.
801 Casts I to the internal I32 type used by that perl.
806 Does the equivalent of the C<-c> command-line option. Obviously, this
807 is only useful in a BEGIN block or else the flag is set too late.
812 Returns a double-quote-surrounded escaped version of STR which can
813 be used as a string in C source code.
817 Returns the class of an object without the part of the classname
818 preceding the first "::". This is used to turn "B::UNOP" into
823 In a perl compiled for threads, this returns a list of the special
824 per-thread threadsv variables.
830 Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>