X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FB%2FB.pm;h=feca2e59d6ee101811888905f1ceee0135eb3d66;hb=8ad6cd6e30dd4147303864a0fc6d2311046cabef;hp=41ba5d65976793469d02d1dbdaa1f9db91ca69a3;hpb=0b40bd6de87cfda9faaca1d3ce7584b852e28687;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/B/B.pm b/ext/B/B.pm index 41ba5d6..feca2e5 100644 --- a/ext/B/B.pm +++ b/ext/B/B.pm @@ -6,6 +6,9 @@ # License or the Artistic License, as specified in the README file. # package B; + +our $VERSION = '1.01'; + use XSLoader (); require Exporter; @ISA = qw(Exporter); @@ -15,10 +18,10 @@ require Exporter; @EXPORT_OK = qw(minus_c ppname save_BEGINs class peekop cast_I32 cstring cchar hash threadsv_names main_root main_start main_cv svref_2object opnumber - amagic_generation + amagic_generation perlstring walkoptree_slow walkoptree walkoptree_exec walksymtable parents comppadlist sv_undef compile_stats timing_info - begin_av init_av end_av); + begin_av init_av end_av regex_padav); sub OPf_KIDS (); use strict; @@ -60,6 +63,30 @@ use strict; package B::OBJECT; } +sub B::GV::SAFENAME { + my $name = (shift())->NAME; + + # The regex below corresponds to the isCONTROLVAR macro + # from toke.c + + $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^". + chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e; + + # When we say unicode_to_native we really mean ascii_to_native, + # which matters iff this is a non-ASCII platform (EBCDIC). + + return $name; +} + +sub B::IV::int_value { + my ($self) = @_; + return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV); +} + +sub B::NULL::as_string() {""} +sub B::IV::as_string() {goto &B::IV::int_value} +sub B::PV::as_string() {goto &B::PV::PV} + my $debug; my $op_count = 0; my @parents = (); @@ -99,6 +126,11 @@ sub walkoptree_slow { } shift @parents; } + if (class($op) eq 'PMOP' && $op->pmreplroot && ${$op->pmreplroot}) { + unshift(@parents, $op); + walkoptree_slow($op->pmreplroot, $method, $level + 1); + shift @parents; + } } sub compile_stats { @@ -184,18 +216,18 @@ sub walksymtable { my ($symref, $method, $recurse, $prefix) = @_; my $sym; my $ref; - no strict 'vars'; - local(*glob); + my $fullname; + no strict 'refs'; $prefix = '' unless defined $prefix; while (($sym, $ref) = each %$symref) { - *glob = "*main::".$prefix.$sym; + $fullname = "*main::".$prefix.$sym; if ($sym =~ /::$/) { $sym = $prefix . $sym; if ($sym ne "main::" && $sym ne "::" && &$recurse($sym)) { - walksymtable(\%glob, $method, $recurse, $sym); + walksymtable(\%$fullname, $method, $recurse, $sym); } } else { - svref_2object(\*glob)->EGV->$method(); + svref_2object(\*$fullname)->$method(); } } } @@ -333,8 +365,22 @@ C (corresponding to the C function C). =item IV +Returns the value of the IV, I. This will be misleading +if C. Perhaps you want the +C method instead? + =item IVX +=item UVX + +=item int_value + +This method returns the value of the IV as an integer. +It differs from C in that it returns the correct +value regardless of whether it's stored signed or +unsigned. + =item needs64bits =item packiv @@ -365,8 +411,27 @@ C (corresponding to the C function C). =item PV +This method is the one you usually want. It constructs a +string using the length and offset information in the struct: +for ordinary scalars it will return the string that you'd see +from Perl, even if it contains null characters. + +=item RV + +Same as B::RV::RV, except that it will die() if the PV isn't +a reference. + =item PVX +This method is less often useful. It assumes that the string +stored in the struct is null-terminated, and disregards the +length information. + +It is the appropriate method to use if you need to get the name +of a lexical variable from a padname array. Lexical variable names +are always stored with a null terminator, and the length field +(SvCUR) is overloaded for other purposes and can't be relied on here. + =back =head2 B::PVMG METHODS @@ -385,6 +450,10 @@ C (corresponding to the C function C). =item MOREMAGIC +=item precomp + +Only valid on r-magic, returns the string that generated the regexp. + =item PRIVATE =item TYPE @@ -393,8 +462,15 @@ C (corresponding to the C function C). =item OBJ +Will die() if called on r-magic. + =item PTR +=item REGEX + +Only valid on r-magic, returns the integer value of the REGEX stored +in the MAGIC. + =back =head2 B::PVLV METHODS @@ -435,6 +511,21 @@ This method returns TRUE if the GP field of the GV is NULL. =item NAME +=item SAFENAME + +This method returns the name of the glob, but if the first +character of the name is a control character, then it converts +it to ^X first, so that *^G would return "^G" rather than "\cG". + +It's useful if you want to print out the name of a variable. +If you restrict yourself to globs which exist at compile-time +then the result ought to be unambiguous, because code like +C<${"^G"} = 1> is compiled as two ops - a constant string and +a dereference (rv2gv) - so that the glob is created at runtime. + +If you're working with globs at runtime, and need to disambiguate +*^G from *{"^G"}, then you should use the raw NAME method. + =item STASH =item SV @@ -495,6 +586,13 @@ This method returns TRUE if the GP field of the GV is NULL. =item IoFLAGS +=item IsSTD + +Takes one arguments ( 'stdin' | 'stdout' | 'stderr' ) and returns true +if the IoIFP of the object is equal to the handle whose name was +passed as argument ( i.e. $io->IsSTD('stderr') is true if +IoIFP($io) == PerlIO_stdin() ). + =back =head2 B::AV METHODS @@ -537,6 +635,8 @@ This method returns TRUE if the GP field of the GV is NULL. =item XSUBANY +For constant subroutines, returns the constant SV returned by the subroutine. + =item CvFLAGS =item const_sv @@ -653,10 +753,16 @@ This returns the op description from the global C PL_op_desc array =item pmflags +=item pmdynflags + =item pmpermflags =item precomp +=item pmoffet + +Only when perl was compiled with ithreads. + =back =head2 B::SVOP METHOD @@ -732,6 +838,14 @@ program. Returns the AV object (i.e. in class B::AV) representing INIT blocks. +=item begin_av + +Returns the AV object (i.e. in class B::AV) representing BEGIN blocks. + +=item end_av + +Returns the AV object (i.e. in class B::AV) representing END blocks. + =item main_root Returns the root op (i.e. an object in the appropriate B::OP-derived @@ -745,6 +859,10 @@ Returns the starting op of the main part of the Perl program. Returns the AV object (i.e. in class B::AV) of the global comppadlist. +=item regex_padav + +Only when perl was compiled with ithreads. + =item sv_undef Returns the SV object corresponding to the C variable C. @@ -776,19 +894,31 @@ DEBUG argument is non-zero, it sets the debugging flag to that. See the description of C above for what the debugging flag does. -=item walksymtable(SYMREF, METHOD, RECURSE) +=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX) Walk the symbol table starting at SYMREF and call METHOD on each -symbol visited. When the walk reached package symbols "Foo::" it -invokes RECURSE and only recurses into the package if that sub -returns true. +symbol (a B::GV object) visited. When the walk reaches package +symbols (such as "Foo::") it invokes RECURSE, passing in the symbol +name, and only recurses into the package if that sub returns true. + +PREFIX is the name of the SYMREF you're walking. + +For example... + + # Walk CGI's symbol table calling print_subs on each symbol. + # Only recurse into CGI::Util:: + walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' }, + 'CGI::'); + +print_subs() is a B::GV method you have declared. + =item svref_2object(SV) Takes any Perl variable and turns it into an object in the appropriate B::OP-derived or B::SV-derived class. Apart from functions such as C, this is the primary way to get an initial -"handle" on a internal perl data structure which can then be followed +"handle" on an internal perl data structure which can then be followed with the other access methods. =item ppname(OPNUM) @@ -816,6 +946,11 @@ is only useful in a BEGIN block or else the flag is set too late. Returns a double-quote-surrounded escaped version of STR which can be used as a string in C source code. +=item perlstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in Perl source code. + =item class(OBJ) Returns the class of an object without the part of the classname