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.
12 @EXPORT_OK = qw(minus_c ppname save_BEGINs
13 class peekop cast_I32 cstring cchar hash threadsv_names
14 main_root main_start main_cv svref_2object opnumber amagic_generation
15 walkoptree walkoptree_slow walkoptree_exec walksymtable
16 parents comppadlist sv_undef compile_stats timing_info
17 begin_av init_av end_av);
20 @B::SV::ISA = 'B::OBJECT';
21 @B::NULL::ISA = 'B::SV';
22 @B::PV::ISA = 'B::SV';
23 @B::IV::ISA = 'B::SV';
24 @B::NV::ISA = 'B::IV';
25 @B::RV::ISA = 'B::SV';
26 @B::PVIV::ISA = qw(B::PV B::IV);
27 @B::PVNV::ISA = qw(B::PV B::NV);
28 @B::PVMG::ISA = 'B::PVNV';
29 @B::PVLV::ISA = 'B::PVMG';
30 @B::BM::ISA = 'B::PVMG';
31 @B::AV::ISA = 'B::PVMG';
32 @B::GV::ISA = 'B::PVMG';
33 @B::HV::ISA = 'B::PVMG';
34 @B::CV::ISA = 'B::PVMG';
35 @B::IO::ISA = 'B::PVMG';
36 @B::FM::ISA = 'B::CV';
38 @B::OP::ISA = 'B::OBJECT';
39 @B::UNOP::ISA = 'B::OP';
40 @B::BINOP::ISA = 'B::UNOP';
41 @B::LOGOP::ISA = 'B::UNOP';
42 @B::LISTOP::ISA = 'B::BINOP';
43 @B::SVOP::ISA = 'B::OP';
44 @B::PADOP::ISA = 'B::OP';
45 @B::PVOP::ISA = 'B::OP';
46 @B::CVOP::ISA = 'B::OP';
47 @B::LOOP::ISA = 'B::LISTOP';
48 @B::PMOP::ISA = 'B::LISTOP';
49 @B::COP::ISA = 'B::OP';
51 @B::SPECIAL::ISA = 'B::OBJECT';
54 # Stop "-w" from complaining about the lack of a real B::OBJECT class
63 my ($class, $value) = @_;
65 walkoptree_debug($value);
75 sub parents { \@parents }
80 return sprintf("%s (0x%x) %s", class($op), $$op, $op->name);
84 my($op, $method, $level) = @_;
85 $op_count++; # just for statistics
87 warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug;
89 if ($$op && ($op->flags & OPf_KIDS)) {
91 unshift(@parents, $op);
92 for ($kid = $op->first; $$kid; $kid = $kid->sibling) {
93 walkoptree_slow($kid, $method, $level + 1);
100 return "Total number of OPs processed: $op_count\n";
104 my ($sec, $min, $hr) = localtime;
105 my ($user, $sys) = times;
106 sprintf("%02d:%02d:%02d user=$user sys=$sys",
107 $hr, $min, $sec, $user, $sys);
117 my ($obj, $value) = @_;
118 # warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug
119 $symtable{sprintf("sym_%x", $$obj)} = $value;
124 return $symtable{sprintf("sym_%x", $$obj)};
127 sub walkoptree_exec {
128 my ($op, $method, $level) = @_;
130 my $prefix = " " x $level;
131 for (; $$op; $op = $op->next) {
134 print $prefix, "goto $sym\n";
137 savesym($op, sprintf("%s (0x%lx)", class($op), $$op));
138 $op->$method($level);
141 /^(or|and|mapwhile|grepwhile|entertry|range|cond_expr)$/)
143 print $prefix, uc($1), " => {\n";
144 walkoptree_exec($op->other, $method, $level + 1);
145 print $prefix, "}\n";
146 } elsif ($ppname eq "match" || $ppname eq "subst") {
147 my $pmreplstart = $op->pmreplstart;
149 print $prefix, "PMREPLSTART => {\n";
150 walkoptree_exec($pmreplstart, $method, $level + 1);
151 print $prefix, "}\n";
153 } elsif ($ppname eq "substcont") {
154 print $prefix, "SUBSTCONT => {\n";
155 walkoptree_exec($op->other->pmreplstart, $method, $level + 1);
156 print $prefix, "}\n";
158 } elsif ($ppname eq "enterloop") {
159 print $prefix, "REDO => {\n";
160 walkoptree_exec($op->redoop, $method, $level + 1);
161 print $prefix, "}\n", $prefix, "NEXT => {\n";
162 walkoptree_exec($op->nextop, $method, $level + 1);
163 print $prefix, "}\n", $prefix, "LAST => {\n";
164 walkoptree_exec($op->lastop, $method, $level + 1);
165 print $prefix, "}\n";
166 } elsif ($ppname eq "subst") {
167 my $replstart = $op->pmreplstart;
169 print $prefix, "SUBST => {\n";
170 walkoptree_exec($replstart, $method, $level + 1);
171 print $prefix, "}\n";
178 my ($symref, $method, $recurse, $prefix) = @_;
183 $prefix = '' unless defined $prefix;
184 while (($sym, $ref) = each %$symref) {
185 *glob = "*main::".$prefix.$sym;
187 $sym = $prefix . $sym;
188 if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) {
189 walksymtable(\%glob, $method, $recurse, $sym);
192 svref_2object(\*glob)->EGV->$method();
203 my ($class, $section, $symtable, $default) = @_;
204 $output_fh ||= FileHandle->new_tmpfile;
205 my $obj = bless [-1, $section, $symtable, $default], $class;
206 $sections{$section} = $obj;
211 my ($class, $section) = @_;
212 return $sections{$section};
217 while (defined($_ = shift)) {
218 print $output_fh "$section->[1]\t$_\n";
225 return $section->[0];
230 return $section->[1];
235 return $section->[2];
240 return $section->[3];
244 my ($section, $fh, $format) = @_;
245 my $name = $section->name;
246 my $sym = $section->symtable || {};
247 my $default = $section->default;
249 seek($output_fh, 0, 0);
250 while (<$output_fh>) {
255 exists($sym->{$1}) ? $sym->{$1} : $default;
257 printf $fh $format, $_;
271 B - The Perl Compiler
279 The C<B> module supplies classes which allow a Perl program to delve
280 into its own innards. It is the module used to implement the
281 "backends" of the Perl compiler. Usage of the compiler does not
282 require knowledge of this module: see the F<O> module for the
283 user-visible part. The C<B> module is of use to those who want to
284 write new compiler backends. This documentation assumes that the
285 reader knows a fair amount about perl's internals including such
286 things as SVs, OPs and the internal symbol table and syntax tree
289 =head1 OVERVIEW OF CLASSES
291 The C structures used by Perl's internals to hold SV and OP
292 information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a
293 class hierarchy and the C<B> module gives access to them via a true
294 object hierarchy. Structure fields which point to other objects
295 (whether types of SV or types of OP) are represented by the C<B>
296 module as Perl objects of the appropriate class. The bulk of the C<B>
297 module is the methods for accessing fields of these structures. Note
298 that all access is read-only: you cannot modify the internals by
301 =head2 SV-RELATED CLASSES
303 B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV,
304 B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in
305 the obvious way to the underlying C structures of similar names. The
306 inheritance hierarchy mimics the underlying C "inheritance". Access
307 methods correspond to the underlying C macros for field access,
308 usually with the leading "class indication" prefix removed (Sv, Av,
309 Hv, ...). The leading prefix is only left in cases where its removal
310 would cause a clash in method name. For example, C<GvREFCNT> stays
311 as-is since its abbreviation would clash with the "superclass" method
312 C<REFCNT> (corresponding to the C function C<SvREFCNT>).
364 =head2 B::PVMG METHODS
374 =head2 B::MAGIC METHODS
392 =head2 B::PVLV METHODS
426 This method returns TRUE if the GP field of the GV is NULL.
558 =head2 OP-RELATED CLASSES
560 B::OP, B::UNOP, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP,
561 B::SVOP, B::PADOP, B::PVOP, B::CVOP, B::LOOP, B::COP.
562 These classes correspond in
563 the obvious way to the underlying C structures of similar names. The
564 inheritance hierarchy mimics the underlying C "inheritance". Access
565 methods correspond to the underlying C structre field names, with the
566 leading "class indication" prefix removed (op_).
578 This returns the op name as a string (e.g. "add", "rv2av").
582 This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]",
583 "PL_ppaddr[OP_RV2AV]").
587 This returns the op description from the global C PL_op_desc array
588 (e.g. "addition" "array deref").
602 =head2 B::UNOP METHOD
610 =head2 B::BINOP METHOD
618 =head2 B::LOGOP METHOD
626 =head2 B::LISTOP METHOD
634 =head2 B::PMOP METHODS
654 =head2 B::SVOP METHOD
664 =head2 B::PADOP METHOD
672 =head2 B::PVOP METHOD
680 =head2 B::LOOP METHODS
692 =head2 B::COP METHODS
710 =head1 FUNCTIONS EXPORTED BY C<B>
712 The C<B> module exports a variety of functions: some are simple
713 utility functions, others provide a Perl program with a way to
714 get an initial "handle" on an internal object.
720 Return the (faked) CV corresponding to the main part of the Perl
725 Returns the AV object (i.e. in class B::AV) representing INIT blocks.
729 Returns the root op (i.e. an object in the appropriate B::OP-derived
730 class) of the main part of the Perl program.
734 Returns the starting op of the main part of the Perl program.
738 Returns the AV object (i.e. in class B::AV) of the global comppadlist.
742 Returns the SV object corresponding to the C variable C<sv_undef>.
746 Returns the SV object corresponding to the C variable C<sv_yes>.
750 Returns the SV object corresponding to the C variable C<sv_no>.
752 =item amagic_generation
754 Returns the SV object corresponding to the C variable C<amagic_generation>.
756 =item walkoptree(OP, METHOD)
758 Does a tree-walk of the syntax tree based at OP and calls METHOD on
759 each op it visits. Each node is visited before its children. If
760 C<walkoptree_debug> (q.v.) has been called to turn debugging on then
761 the method C<walkoptree_debug> is called on each op before METHOD is
764 =item walkoptree_debug(DEBUG)
766 Returns the current debugging flag for C<walkoptree>. If the optional
767 DEBUG argument is non-zero, it sets the debugging flag to that. See
768 the description of C<walkoptree> above for what the debugging flag
771 =item walksymtable(SYMREF, METHOD, RECURSE)
773 Walk the symbol table starting at SYMREF and call METHOD on each
774 symbol visited. When the walk reached package symbols "Foo::" it
775 invokes RECURSE and only recurses into the package if that sub
778 =item svref_2object(SV)
780 Takes any Perl variable and turns it into an object in the
781 appropriate B::OP-derived or B::SV-derived class. Apart from functions
782 such as C<main_root>, this is the primary way to get an initial
783 "handle" on a internal perl data structure which can then be followed
784 with the other access methods.
788 Return the PP function name (e.g. "pp_add") of op number OPNUM.
792 Returns a string in the form "0x..." representing the value of the
793 internal hash function used by perl on string STR.
797 Casts I to the internal I32 type used by that perl.
802 Does the equivalent of the C<-c> command-line option. Obviously, this
803 is only useful in a BEGIN block or else the flag is set too late.
808 Returns a double-quote-surrounded escaped version of STR which can
809 be used as a string in C source code.
813 Returns the class of an object without the part of the classname
814 preceding the first "::". This is used to turn "B::UNOP" into
819 In a perl compiled for threads, this returns a list of the special
820 per-thread threadsv variables.
826 Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>