home *** CD-ROM | disk | FTP | other *** search
/ Chip: Windows 2000 Professional Resource Kit / W2KPRK.iso / apps / perl / ActivePerl.exe / data.z / B.pm < prev    next >
Encoding:
Perl POD Document  |  1999-10-14  |  15.2 KB  |  832 lines

  1. #      B.pm
  2. #
  3. #      Copyright (c) 1996, 1997, 1998 Malcolm Beattie
  4. #
  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.
  7. #
  8. package B;
  9. require DynaLoader;
  10. require Exporter;
  11. @ISA = qw(Exporter DynaLoader);
  12. @EXPORT_OK = qw(byteload_fh byteload_string minus_c ppname
  13.         class peekop cast_I32 cstring cchar hash threadsv_names
  14.         main_root main_start main_cv svref_2object
  15.         walkoptree walkoptree_slow walkoptree_exec walksymtable
  16.         parents comppadlist sv_undef compile_stats timing_info init_av);
  17.  
  18. use strict;
  19. @B::SV::ISA = 'B::OBJECT';
  20. @B::NULL::ISA = 'B::SV';
  21. @B::PV::ISA = 'B::SV';
  22. @B::IV::ISA = 'B::SV';
  23. @B::NV::ISA = 'B::IV';
  24. @B::RV::ISA = 'B::SV';
  25. @B::PVIV::ISA = qw(B::PV B::IV);
  26. @B::PVNV::ISA = qw(B::PV B::NV);
  27. @B::PVMG::ISA = 'B::PVNV';
  28. @B::PVLV::ISA = 'B::PVMG';
  29. @B::BM::ISA = 'B::PVMG';
  30. @B::AV::ISA = 'B::PVMG';
  31. @B::GV::ISA = 'B::PVMG';
  32. @B::HV::ISA = 'B::PVMG';
  33. @B::CV::ISA = 'B::PVMG';
  34. @B::IO::ISA = 'B::PVMG';
  35. @B::FM::ISA = 'B::CV';
  36.  
  37. @B::OP::ISA = 'B::OBJECT';
  38. @B::UNOP::ISA = 'B::OP';
  39. @B::BINOP::ISA = 'B::UNOP';
  40. @B::LOGOP::ISA = 'B::UNOP';
  41. @B::CONDOP::ISA = 'B::UNOP';
  42. @B::LISTOP::ISA = 'B::BINOP';
  43. @B::SVOP::ISA = 'B::OP';
  44. @B::GVOP::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';
  50.  
  51. @B::SPECIAL::ISA = 'B::OBJECT';
  52.  
  53. {
  54.     # Stop "-w" from complaining about the lack of a real B::OBJECT class
  55.     package B::OBJECT;
  56. }
  57.  
  58. my $debug;
  59. my $op_count = 0;
  60. my @parents = ();
  61.  
  62. sub debug {
  63.     my ($class, $value) = @_;
  64.     $debug = $value;
  65.     walkoptree_debug($value);
  66. }
  67.  
  68. # sub OPf_KIDS;
  69. # add to .xs for perl5.002
  70. sub OPf_KIDS () { 4 }
  71.  
  72. sub class {
  73.     my $obj = shift;
  74.     my $name = ref $obj;
  75.     $name =~ s/^.*:://;
  76.     return $name;
  77. }
  78.  
  79. sub parents { \@parents }
  80.  
  81. # For debugging
  82. sub peekop {
  83.     my $op = shift;
  84.     return sprintf("%s (0x%x) %s", class($op), $$op, $op->ppaddr);
  85. }
  86.  
  87. sub walkoptree_slow {
  88.     my($op, $method, $level) = @_;
  89.     $op_count++; # just for statistics
  90.     $level ||= 0;
  91.     warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug;
  92.     $op->$method($level);
  93.     if ($$op && ($op->flags & OPf_KIDS)) {
  94.     my $kid;
  95.     unshift(@parents, $op);
  96.     for ($kid = $op->first; $$kid; $kid = $kid->sibling) {
  97.         walkoptree_slow($kid, $method, $level + 1);
  98.     }
  99.     shift @parents;
  100.     }
  101. }
  102.  
  103. sub compile_stats {
  104.     return "Total number of OPs processed: $op_count\n";
  105. }
  106.  
  107. sub timing_info {
  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);
  112. }
  113.  
  114. my %symtable;
  115. sub savesym {
  116.     my ($obj, $value) = @_;
  117. #    warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug
  118.     $symtable{sprintf("sym_%x", $$obj)} = $value;
  119. }
  120.  
  121. sub objsym {
  122.     my $obj = shift;
  123.     return $symtable{sprintf("sym_%x", $$obj)};
  124. }
  125.  
  126. sub walkoptree_exec {
  127.     my ($op, $method, $level) = @_;
  128.     my ($sym, $ppname);
  129.     my $prefix = "    " x $level;
  130.     for (; $$op; $op = $op->next) {
  131.     $sym = objsym($op);
  132.     if (defined($sym)) {
  133.         print $prefix, "goto $sym\n";
  134.         return;
  135.     }
  136.     savesym($op, sprintf("%s (0x%lx)", class($op), $$op));
  137.     $op->$method($level);
  138.     $ppname = $op->ppaddr;
  139.     if ($ppname =~ /^pp_(or|and|mapwhile|grepwhile|entertry)$/) {
  140.         print $prefix, uc($1), " => {\n";
  141.         walkoptree_exec($op->other, $method, $level + 1);
  142.         print $prefix, "}\n";
  143.     } elsif ($ppname eq "pp_match" || $ppname eq "pp_subst") {
  144.         my $pmreplstart = $op->pmreplstart;
  145.         if ($$pmreplstart) {
  146.         print $prefix, "PMREPLSTART => {\n";
  147.         walkoptree_exec($pmreplstart, $method, $level + 1);
  148.         print $prefix, "}\n";
  149.         }
  150.     } elsif ($ppname eq "pp_substcont") {
  151.         print $prefix, "SUBSTCONT => {\n";
  152.         walkoptree_exec($op->other->pmreplstart, $method, $level + 1);
  153.         print $prefix, "}\n";
  154.         $op = $op->other;
  155.     } elsif ($ppname eq "pp_cond_expr") {
  156.         # pp_cond_expr never returns op_next
  157.         print $prefix, "TRUE => {\n";
  158.         walkoptree_exec($op->true, $method, $level + 1);
  159.         print $prefix, "}\n";
  160.         $op = $op->false;
  161.         redo;
  162.     } elsif ($ppname eq "pp_range") {
  163.         print $prefix, "TRUE => {\n";
  164.         walkoptree_exec($op->true, $method, $level + 1);
  165.         print $prefix, "}\n", $prefix, "FALSE => {\n";
  166.         walkoptree_exec($op->false, $method, $level + 1);
  167.         print $prefix, "}\n";
  168.     } elsif ($ppname eq "pp_enterloop") {
  169.         print $prefix, "REDO => {\n";
  170.         walkoptree_exec($op->redoop, $method, $level + 1);
  171.         print $prefix, "}\n", $prefix, "NEXT => {\n";
  172.         walkoptree_exec($op->nextop, $method, $level + 1);
  173.         print $prefix, "}\n", $prefix, "LAST => {\n";
  174.         walkoptree_exec($op->lastop,  $method, $level + 1);
  175.         print $prefix, "}\n";
  176.     } elsif ($ppname eq "pp_subst") {
  177.         my $replstart = $op->pmreplstart;
  178.         if ($$replstart) {
  179.         print $prefix, "SUBST => {\n";
  180.         walkoptree_exec($replstart, $method, $level + 1);
  181.         print $prefix, "}\n";
  182.         }
  183.     }
  184.     }
  185. }
  186.  
  187. sub walksymtable {
  188.     my ($symref, $method, $recurse, $prefix) = @_;
  189.     my $sym;
  190.     no strict 'vars';
  191.     local(*glob);
  192.     while (($sym, *glob) = each %$symref) {
  193.     if ($sym =~ /::$/) {
  194.         $sym = $prefix . $sym;
  195.         if ($sym ne "main::" && &$recurse($sym)) {
  196.         walksymtable(\%glob, $method, $recurse, $sym);
  197.         }
  198.     } else {
  199.         svref_2object(\*glob)->EGV->$method();
  200.     }
  201.     }
  202. }
  203.  
  204. {
  205.     package B::Section;
  206.     my $output_fh;
  207.     my %sections;
  208.     
  209.     sub new {
  210.     my ($class, $section, $symtable, $default) = @_;
  211.     $output_fh ||= FileHandle->new_tmpfile;
  212.     my $obj = bless [-1, $section, $symtable, $default], $class;
  213.     $sections{$section} = $obj;
  214.     return $obj;
  215.     }
  216.     
  217.     sub get {
  218.     my ($class, $section) = @_;
  219.     return $sections{$section};
  220.     }
  221.  
  222.     sub add {
  223.     my $section = shift;
  224.     while (defined($_ = shift)) {
  225.         print $output_fh "$section->[1]\t$_\n";
  226.         $section->[0]++;
  227.     }
  228.     }
  229.  
  230.     sub index {
  231.     my $section = shift;
  232.     return $section->[0];
  233.     }
  234.  
  235.     sub name {
  236.     my $section = shift;
  237.     return $section->[1];
  238.     }
  239.  
  240.     sub symtable {
  241.     my $section = shift;
  242.     return $section->[2];
  243.     }
  244.     
  245.     sub default {
  246.     my $section = shift;
  247.     return $section->[3];
  248.     }
  249.     
  250.     sub output {
  251.     my ($section, $fh, $format) = @_;
  252.     my $name = $section->name;
  253.     my $sym = $section->symtable || {};
  254.     my $default = $section->default;
  255.  
  256.     seek($output_fh, 0, 0);
  257.     while (<$output_fh>) {
  258.         chomp;
  259.         s/^(.*?)\t//;
  260.         if ($1 eq $name) {
  261.         s{(s\\_[0-9a-f]+)} {
  262.             exists($sym->{$1}) ? $sym->{$1} : $default;
  263.         }ge;
  264.         printf $fh $format, $_;
  265.         }
  266.     }
  267.     }
  268. }
  269.  
  270. bootstrap B;
  271.  
  272. 1;
  273.  
  274. __END__
  275.  
  276. =head1 NAME
  277.  
  278. B - The Perl Compiler
  279.  
  280. =head1 SYNOPSIS
  281.  
  282.     use B;
  283.  
  284. =head1 DESCRIPTION
  285.  
  286. The C<B> module supplies classes which allow a Perl program to delve
  287. into its own innards. It is the module used to implement the
  288. "backends" of the Perl compiler. Usage of the compiler does not
  289. require knowledge of this module: see the F<O> module for the
  290. user-visible part. The C<B> module is of use to those who want to
  291. write new compiler backends. This documentation assumes that the
  292. reader knows a fair amount about perl's internals including such
  293. things as SVs, OPs and the internal symbol table and syntax tree
  294. of a program.
  295.  
  296. =head1 OVERVIEW OF CLASSES
  297.  
  298. The C structures used by Perl's internals to hold SV and OP
  299. information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a
  300. class hierarchy and the C<B> module gives access to them via a true
  301. object hierarchy. Structure fields which point to other objects
  302. (whether types of SV or types of OP) are represented by the C<B>
  303. module as Perl objects of the appropriate class. The bulk of the C<B>
  304. module is the methods for accessing fields of these structures. Note
  305. that all access is read-only: you cannot modify the internals by
  306. using this module.
  307.  
  308. =head2 SV-RELATED CLASSES
  309.  
  310. B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV,
  311. B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in
  312. the obvious way to the underlying C structures of similar names. The
  313. inheritance hierarchy mimics the underlying C "inheritance". Access
  314. methods correspond to the underlying C macros for field access,
  315. usually with the leading "class indication" prefix removed (Sv, Av,
  316. Hv, ...). The leading prefix is only left in cases where its removal
  317. would cause a clash in method name. For example, C<GvREFCNT> stays
  318. as-is since its abbreviation would clash with the "superclass" method
  319. C<REFCNT> (corresponding to the C function C<SvREFCNT>).
  320.  
  321. =head2 B::SV METHODS
  322.  
  323. =over 4
  324.  
  325. =item REFCNT
  326.  
  327. =item FLAGS
  328.  
  329. =back
  330.  
  331. =head2 B::IV METHODS
  332.  
  333. =over 4
  334.  
  335. =item IV
  336.  
  337. =item IVX
  338.  
  339. =item needs64bits
  340.  
  341. =item packiv
  342.  
  343. =back
  344.  
  345. =head2 B::NV METHODS
  346.  
  347. =over 4
  348.  
  349. =item NV
  350.  
  351. =item NVX
  352.  
  353. =back
  354.  
  355. =head2 B::RV METHODS
  356.  
  357. =over 4
  358.  
  359. =item RV
  360.  
  361. =back
  362.  
  363. =head2 B::PV METHODS
  364.  
  365. =over 4
  366.  
  367. =item PV
  368.  
  369. =back
  370.  
  371. =head2 B::PVMG METHODS
  372.  
  373. =over 4
  374.  
  375. =item MAGIC
  376.  
  377. =item SvSTASH
  378.  
  379. =back
  380.  
  381. =head2 B::MAGIC METHODS
  382.  
  383. =over 4
  384.  
  385. =item MOREMAGIC
  386.  
  387. =item PRIVATE
  388.  
  389. =item TYPE
  390.  
  391. =item FLAGS
  392.  
  393. =item OBJ
  394.  
  395. =item PTR
  396.  
  397. =back
  398.  
  399. =head2 B::PVLV METHODS
  400.  
  401. =over 4
  402.  
  403. =item TARGOFF
  404.  
  405. =item TARGLEN
  406.  
  407. =item TYPE
  408.  
  409. =item TARG
  410.  
  411. =back
  412.  
  413. =head2 B::BM METHODS
  414.  
  415. =over 4
  416.  
  417. =item USEFUL
  418.  
  419. =item PREVIOUS
  420.  
  421. =item RARE
  422.  
  423. =item TABLE
  424.  
  425. =back
  426.  
  427. =head2 B::GV METHODS
  428.  
  429. =over 4
  430.  
  431. =item NAME
  432.  
  433. =item STASH
  434.  
  435. =item SV
  436.  
  437. =item IO
  438.  
  439. =item FORM
  440.  
  441. =item AV
  442.  
  443. =item HV
  444.  
  445. =item EGV
  446.  
  447. =item CV
  448.  
  449. =item CVGEN
  450.  
  451. =item LINE
  452.  
  453. =item FILEGV
  454.  
  455. =item GvREFCNT
  456.  
  457. =item FLAGS
  458.  
  459. =back
  460.  
  461. =head2 B::IO METHODS
  462.  
  463. =over 4
  464.  
  465. =item LINES
  466.  
  467. =item PAGE
  468.  
  469. =item PAGE_LEN
  470.  
  471. =item LINES_LEFT
  472.  
  473. =item TOP_NAME
  474.  
  475. =item TOP_GV
  476.  
  477. =item FMT_NAME
  478.  
  479. =item FMT_GV
  480.  
  481. =item BOTTOM_NAME
  482.  
  483. =item BOTTOM_GV
  484.  
  485. =item SUBPROCESS
  486.  
  487. =item IoTYPE
  488.  
  489. =item IoFLAGS
  490.  
  491. =back
  492.  
  493. =head2 B::AV METHODS
  494.  
  495. =over 4
  496.  
  497. =item FILL
  498.  
  499. =item MAX
  500.  
  501. =item OFF
  502.  
  503. =item ARRAY
  504.  
  505. =item AvFLAGS
  506.  
  507. =back
  508.  
  509. =head2 B::CV METHODS
  510.  
  511. =over 4
  512.  
  513. =item STASH
  514.  
  515. =item START
  516.  
  517. =item ROOT
  518.  
  519. =item GV
  520.  
  521. =item FILEGV
  522.  
  523. =item DEPTH
  524.  
  525. =item PADLIST
  526.  
  527. =item OUTSIDE
  528.  
  529. =item XSUB
  530.  
  531. =item XSUBANY
  532.  
  533. =item CvFLAGS
  534.  
  535. =back
  536.  
  537. =head2 B::HV METHODS
  538.  
  539. =over 4
  540.  
  541. =item FILL
  542.  
  543. =item MAX
  544.  
  545. =item KEYS
  546.  
  547. =item RITER
  548.  
  549. =item NAME
  550.  
  551. =item PMROOT
  552.  
  553. =item ARRAY
  554.  
  555. =back
  556.  
  557. =head2 OP-RELATED CLASSES
  558.  
  559. B::OP, B::UNOP, B::BINOP, B::LOGOP, B::CONDOP, B::LISTOP, B::PMOP,
  560. B::SVOP, B::GVOP, B::PVOP, B::CVOP, B::LOOP, B::COP.
  561. These classes correspond in
  562. the obvious way to the underlying C structures of similar names. The
  563. inheritance hierarchy mimics the underlying C "inheritance". Access
  564. methods correspond to the underlying C structre field names, with the
  565. leading "class indication" prefix removed (op_).
  566.  
  567. =head2 B::OP METHODS
  568.  
  569. =over 4
  570.  
  571. =item next
  572.  
  573. =item sibling
  574.  
  575. =item ppaddr
  576.  
  577. This returns the function name as a string (e.g. pp_add, pp_rv2av).
  578.  
  579. =item desc
  580.  
  581. This returns the op description from the global C PL_op_desc array
  582. (e.g. "addition" "array deref").
  583.  
  584. =item targ
  585.  
  586. =item type
  587.  
  588. =item seq
  589.  
  590. =item flags
  591.  
  592. =item private
  593.  
  594. =back
  595.  
  596. =head2 B::UNOP METHOD
  597.  
  598. =over 4
  599.  
  600. =item first
  601.  
  602. =back
  603.  
  604. =head2 B::BINOP METHOD
  605.  
  606. =over 4
  607.  
  608. =item last
  609.  
  610. =back
  611.  
  612. =head2 B::LOGOP METHOD
  613.  
  614. =over 4
  615.  
  616. =item other
  617.  
  618. =back
  619.  
  620. =head2 B::CONDOP METHODS
  621.  
  622. =over 4
  623.  
  624. =item true
  625.  
  626. =item false
  627.  
  628. =back
  629.  
  630. =head2 B::LISTOP METHOD
  631.  
  632. =over 4
  633.  
  634. =item children
  635.  
  636. =back
  637.  
  638. =head2 B::PMOP METHODS
  639.  
  640. =over 4
  641.  
  642. =item pmreplroot
  643.  
  644. =item pmreplstart
  645.  
  646. =item pmnext
  647.  
  648. =item pmregexp
  649.  
  650. =item pmflags
  651.  
  652. =item pmpermflags
  653.  
  654. =item precomp
  655.  
  656. =back
  657.  
  658. =head2 B::SVOP METHOD
  659.  
  660. =over 4
  661.  
  662. =item sv
  663.  
  664. =back
  665.  
  666. =head2 B::GVOP METHOD
  667.  
  668. =over 4
  669.  
  670. =item gv
  671.  
  672. =back
  673.  
  674. =head2 B::PVOP METHOD
  675.  
  676. =over 4
  677.  
  678. =item pv
  679.  
  680. =back
  681.  
  682. =head2 B::LOOP METHODS
  683.  
  684. =over 4
  685.  
  686. =item redoop
  687.  
  688. =item nextop
  689.  
  690. =item lastop
  691.  
  692. =back
  693.  
  694. =head2 B::COP METHODS
  695.  
  696. =over 4
  697.  
  698. =item label
  699.  
  700. =item stash
  701.  
  702. =item filegv
  703.  
  704. =item cop_seq
  705.  
  706. =item arybase
  707.  
  708. =item line
  709.  
  710. =back
  711.  
  712. =head1 FUNCTIONS EXPORTED BY C<B>
  713.  
  714. The C<B> module exports a variety of functions: some are simple
  715. utility functions, others provide a Perl program with a way to
  716. get an initial "handle" on an internal object.
  717.  
  718. =over 4
  719.  
  720. =item main_cv
  721.  
  722. Return the (faked) CV corresponding to the main part of the Perl
  723. program.
  724.  
  725. =item init_av
  726.  
  727. Returns the AV object (i.e. in class B::AV) representing INIT blocks.
  728.  
  729. =item main_root
  730.  
  731. Returns the root op (i.e. an object in the appropriate B::OP-derived
  732. class) of the main part of the Perl program.
  733.  
  734. =item main_start
  735.  
  736. Returns the starting op of the main part of the Perl program.
  737.  
  738. =item comppadlist
  739.  
  740. Returns the AV object (i.e. in class B::AV) of the global comppadlist.
  741.  
  742. =item sv_undef
  743.  
  744. Returns the SV object corresponding to the C variable C<sv_undef>.
  745.  
  746. =item sv_yes
  747.  
  748. Returns the SV object corresponding to the C variable C<sv_yes>.
  749.  
  750. =item sv_no
  751.  
  752. Returns the SV object corresponding to the C variable C<sv_no>.
  753.  
  754. =item walkoptree(OP, METHOD)
  755.  
  756. Does a tree-walk of the syntax tree based at OP and calls METHOD on
  757. each op it visits. Each node is visited before its children. If
  758. C<walkoptree_debug> (q.v.) has been called to turn debugging on then
  759. the method C<walkoptree_debug> is called on each op before METHOD is
  760. called.
  761.  
  762. =item walkoptree_debug(DEBUG)
  763.  
  764. Returns the current debugging flag for C<walkoptree>. If the optional
  765. DEBUG argument is non-zero, it sets the debugging flag to that. See
  766. the description of C<walkoptree> above for what the debugging flag
  767. does.
  768.  
  769. =item walksymtable(SYMREF, METHOD, RECURSE)
  770.  
  771. Walk the symbol table starting at SYMREF and call METHOD on each
  772. symbol visited. When the walk reached package symbols "Foo::" it
  773. invokes RECURSE and only recurses into the package if that sub
  774. returns true.
  775.  
  776. =item svref_2object(SV)
  777.  
  778. Takes any Perl variable and turns it into an object in the
  779. appropriate B::OP-derived or B::SV-derived class. Apart from functions
  780. such as C<main_root>, this is the primary way to get an initial
  781. "handle" on a internal perl data structure which can then be followed
  782. with the other access methods.
  783.  
  784. =item ppname(OPNUM)
  785.  
  786. Return the PP function name (e.g. "pp_add") of op number OPNUM.
  787.  
  788. =item hash(STR)
  789.  
  790. Returns a string in the form "0x..." representing the value of the
  791. internal hash function used by perl on string STR.
  792.  
  793. =item cast_I32(I)
  794.  
  795. Casts I to the internal I32 type used by that perl.
  796.  
  797.  
  798. =item minus_c
  799.  
  800. Does the equivalent of the C<-c> command-line option. Obviously, this
  801. is only useful in a BEGIN block or else the flag is set too late.
  802.  
  803.  
  804. =item cstring(STR)
  805.  
  806. Returns a double-quote-surrounded escaped version of STR which can
  807. be used as a string in C source code.
  808.  
  809. =item class(OBJ)
  810.  
  811. Returns the class of an object without the part of the classname
  812. preceding the first "::". This is used to turn "B::UNOP" into
  813. "UNOP" for example.
  814.  
  815. =item threadsv_names
  816.  
  817. In a perl compiled for threads, this returns a list of the special
  818. per-thread threadsv variables.
  819.  
  820. =item byteload_fh(FILEHANDLE)
  821.  
  822. Load the contents of FILEHANDLE as bytecode. See documentation for
  823. the B<Bytecode> module in F<B::Backend> for how to generate bytecode.
  824.  
  825. =back
  826.  
  827. =head1 AUTHOR
  828.  
  829. Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
  830.  
  831. =cut
  832.