Re: [PATCH] Quieten warnings in Deparse.pm
[p5sagit/p5-mst-13.2.git] / ext / B / B / Xref.pm
index 1731b86..f727dc7 100644 (file)
@@ -1,6 +1,6 @@
 package B::Xref;
 
-our $VERSION = '1.00';
+our $VERSION = '1.01';
 
 =head1 NAME
 
@@ -21,8 +21,8 @@ The report generated is in the following format:
     File filename1
       Subroutine subname1
        Package package1
-         object1        C<line numbers>
-         object2        C<line numbers>
+         object1        line numbers
+         object2        line numbers
          ...
        Package package2
        ...
@@ -64,6 +64,10 @@ Directs output to C<FILENAME> instead of standard output.
 Raw output. Instead of producing a human-readable report, outputs a line
 in machine-readable form for each definition/use of a variable/sub/format.
 
+=item C<-d>
+
+Don't output the "(definitions)" sections.
+
 =item C<-D[tO]>
 
 (Internal) debug options, probably only useful if C<-r> included.
@@ -89,7 +93,7 @@ Malcolm Beattie, mbeattie@sable.ox.ac.uk.
 use strict;
 use Config;
 use B qw(peekop class comppadlist main_start svref_2object walksymtable
-         OPpLVAL_INTRO SVf_POK
+         OPpLVAL_INTRO SVf_POK OPpOUR_INTRO cstring
         );
 
 sub UNKNOWN { ["?", "?", "?"] }
@@ -145,7 +149,7 @@ sub load_pad {
        my $namesv = $namelist[$ix];
        next if class($namesv) eq "SPECIAL";
        my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/;
-       $pad[$ix] = ["(lexical)", $type, $name];
+       $pad[$ix] = ["(lexical)", $type || '?', $name || '?'];
     }
     if ($Config{useithreads}) {
        my (@vallist);
@@ -230,16 +234,16 @@ sub pp_padav { pp_padsv(@_) }
 sub pp_padhv { pp_padsv(@_) }
 
 sub deref {
-    my ($var, $as) = @_;
+    my ($op, $var, $as) = @_;
     $var->[1] = $as . $var->[1];
-    process($var, "used");
+    process($var, $op->private & OPpOUR_INTRO ? "intro" : "used");
 }
 
-sub pp_rv2cv { deref($top, "&"); }
-sub pp_rv2hv { deref($top, "%"); }
-sub pp_rv2sv { deref($top, "\$"); }
-sub pp_rv2av { deref($top, "\@"); }
-sub pp_rv2gv { deref($top, "*"); }
+sub pp_rv2cv { deref(shift, $top, "&"); }
+sub pp_rv2hv { deref(shift, $top, "%"); }
+sub pp_rv2sv { deref(shift, $top, "\$"); }
+sub pp_rv2av { deref(shift, $top, "\@"); }
+sub pp_rv2gv { deref(shift, $top, "*"); }
 
 sub pp_gvsv {
     my $op = shift;
@@ -251,9 +255,10 @@ sub pp_gvsv {
     }
     else {
        $gv = $op->gv;
-       $top = [$gv->STASH->NAME, '$', $gv->NAME];
+       $top = [$gv->STASH->NAME, '$', $gv->SAFENAME];
     }
-    process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
+    process($top, $op->private & OPpLVAL_INTRO ||
+                  $op->private & OPpOUR_INTRO   ? "intro" : "used");
 }
 
 sub pp_gv {
@@ -266,7 +271,7 @@ sub pp_gv {
     }
     else {
        $gv = $op->gv;
-       $top = [$gv->STASH->NAME, "*", $gv->NAME];
+       $top = [$gv->STASH->NAME, "*", $gv->SAFENAME];
     }
     process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
 }
@@ -277,7 +282,8 @@ sub pp_const {
     # constant could be in the pad (under useithreads)
     if ($$sv) {
        $top = ["?", "",
-               (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) ? $sv->PV : "?"];
+               (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK)
+               ? cstring($sv->PV) : "?"];
     }
     else {
        $top = $pad[$op->targ];
@@ -328,7 +334,8 @@ sub xref_definitions {
     return if $nodefs;
     $subname = "(definitions)";
     foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS
-                     strict vars FileHandle Exporter Carp)) {
+                     strict vars FileHandle Exporter Carp PerlIO::Layer
+                     attributes utf8 warnings)) {
         $exclude{$pack."::"} = 1;
     }
     no strict qw(vars refs);