ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Devel-FindRef/FindRef.pm
(Generate patch)

Comparing Devel-FindRef/FindRef.pm (file contents):
Revision 1.13 by root, Fri Jul 11 22:18:10 2008 UTC vs.
Revision 1.16 by root, Fri Sep 19 05:07:56 2008 UTC

1package Devel::FindRef; 1package Devel::FindRef;
2 2
3no warnings; # I hate warning nazis
3use strict; 4use strict;
4 5
5use XSLoader; 6use XSLoader;
6use Scalar::Util; 7use Scalar::Util;
7 8
8BEGIN { 9BEGIN {
9 our $VERSION = '1.3'; 10 our $VERSION = '1.31';
10 XSLoader::load __PACKAGE__, $VERSION; 11 XSLoader::load __PACKAGE__, $VERSION;
11} 12}
12 13
13=head1 NAME 14=head1 NAME
14 15
15Devel::FindRef - where is that reference to my variable hiding? 16Devel::FindRef - where is that reference to my variable hiding?
16 17
17=head1 SYNOPSIS 18=head1 SYNOPSIS
18 19
19 use Devel::FindRef; 20 use Devel::FindRef;
21
22 print Devel::FindRef::track \$some_variable;
20 23
21=head1 DESCRIPTION 24=head1 DESCRIPTION
22 25
23Tracking down reference problems (e.g. you expect some object to be 26Tracking down reference problems (e.g. you expect some object to be
24destroyed, but there are still references to it that keep it alive) can be 27destroyed, but there are still references to it that keep it alive) can be
119 my (@about) = find $$refref; 122 my (@about) = find $$refref;
120 if (@about) { 123 if (@about) {
121 for my $about (@about) { 124 for my $about (@about) {
122 $buf .= "$indent" . (@about > 1 ? "+- " : " ") . $about->[0]; 125 $buf .= "$indent" . (@about > 1 ? "+- " : " ") . $about->[0];
123 if (@$about > 1) { 126 if (@$about > 1) {
124 if ($seen{$about->[1]+0}++) { 127 if ($seen{ref2ptr $about->[1]}++) {
125 $buf .= " $about->[1], which was seen before.\n"; 128 $buf .= " $about->[1], which was seen before.\n";
126 } else { 129 } else {
127 $buf .= " $about->[1], which is\n"; 130 $buf .= " $about->[1], which is\n";
128 $track->(\$about->[1], $depth - 1, $about == $about[-1] ? "$indent " : "$indent| "); 131 $track->(\$about->[1], $depth - 1, $about == $about[-1] ? "$indent " : "$indent| ");
129 } 132 }
157=cut 160=cut
158 161
159sub find($) { 162sub find($) {
160 my ($about, $excl) = &find_; 163 my ($about, $excl) = &find_;
161 my %excl = map +($_ => undef), @$excl; 164 my %excl = map +($_ => undef), @$excl;
162 grep !exists $excl{$_->[1] + 0}, @$about 165 grep !exists $excl{ref2ptr $_->[1]}, @$about
163} 166}
164 167
165=item $ref = Devel::FindRef::ptr2ref $integer 168=item $ref = Devel::FindRef::ptr2ref $integer
166 169
167Sometimes you know (from debugging output) the address of a perl scalar 170Sometimes you know (from debugging output) the address of a perl scalar
170call on valid addresses, but extremely dangerous to call on invalid ones. 173call on valid addresses, but extremely dangerous to call on invalid ones.
171 174
172 # we know that HASH(0x176ff70) exists, so turn it into a hashref: 175 # we know that HASH(0x176ff70) exists, so turn it into a hashref:
173 my $ref_to_hash = Devel::FindRef::ptr2ref 0x176ff70; 176 my $ref_to_hash = Devel::FindRef::ptr2ref 0x176ff70;
174 177
178=item $ref = Devel::FindRef::ref2ptr $reference
179
180The opposite of C<ptr2ref>, above: returns the internal address of the
181value pointed to by the passed reference. I<No checks whatsoever will be
182done>, so don't use this.
183
175=back 184=back
176 185
177=head1 ENVIRONMENT VARIABLES 186=head1 ENVIRONMENT VARIABLES
178 187
179You can set the environment variable C<PERL_DEVEL_FINDREF_DEPTH> to an 188You can set the environment variable C<PERL_DEVEL_FINDREF_DEPTH> to an

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines