1
- package Tie::RefHash ; # git description: Tie-RefHash-1.39-10-g2cfa4bd
1
+ package Tie::RefHash ; # git description: v1.40-9-g23812d9
2
2
# ABSTRACT: Use references as hash keys
3
3
4
- our $VERSION = ' 1.40 ' ;
4
+ our $VERSION = ' 1.41 ' ;
5
5
6
6
# pod =head1 SYNOPSIS
7
7
# pod
@@ -76,36 +76,18 @@ our @ISA = qw(Tie::Hash);
76
76
use strict;
77
77
use Carp ();
78
78
79
+ # Tie::RefHash::Weak (until at least 0.09) assumes we define a refaddr()
80
+ # function, so just import the one from Scalar::Util
81
+ use Scalar::Util qw( refaddr) ;
82
+
79
83
BEGIN {
80
- local $@ ;
81
84
# determine whether we need to take care of threads
82
85
use Config ();
83
86
my $usethreads = $Config::Config {usethreads }; # && exists $INC{"threads.pm"}
84
87
*_HAS_THREADS = $usethreads ? sub () { 1 } : sub () { 0 };
85
- *_HAS_SCALAR_UTIL = eval { require Scalar::Util; 1 } ? sub () { 1 } : sub () { 0 };
86
88
*_HAS_WEAKEN = defined (&Scalar::Util::weaken) ? sub () { 1 } : sub () { 0 };
87
89
}
88
90
89
- BEGIN {
90
- # create a refaddr function
91
-
92
- local $@ ;
93
-
94
- if ( _HAS_SCALAR_UTIL ) {
95
- *refaddr = sub { goto \&Scalar::Util::refaddr }
96
- } else {
97
- require overload;
98
-
99
- *refaddr = sub {
100
- if ( overload::StrVal($_ [0]) =~ / \( 0x ([a-zA-Z0-9]+) \) $ /x ) {
101
- return $1 ;
102
- } else {
103
- die " couldn't parse StrVal: " . overload::StrVal($_ [0]);
104
- }
105
- };
106
- }
107
- }
108
-
109
91
my (@thread_object_registry , $count ); # used by the CLONE method to rehash the keys after their refaddr changed
110
92
111
93
sub TIEHASH {
@@ -127,6 +109,7 @@ sub TIEHASH {
127
109
if ( ++$count > 1000 ) {
128
110
# this ensures we don't fill up with a huge array dead weakrefs
129
111
@thread_object_registry = grep defined , @thread_object_registry ;
112
+ Scalar::Util::weaken( $_ ) for @thread_object_registry ;
130
113
$count = 0;
131
114
}
132
115
} else {
@@ -164,19 +147,20 @@ sub CLONE {
164
147
# when the thread has been cloned all the objects need to be updated.
165
148
# dead weakrefs are undefined, so we filter them out
166
149
@thread_object_registry = grep defined && do { $_ -> _reindex_keys; 1 }, @thread_object_registry ;
150
+ Scalar::Util::weaken( $_ ) for @thread_object_registry ;
167
151
$count = 0; # we just cleaned up
168
152
}
169
153
170
154
sub _reindex_keys {
171
155
my ( $self , $extra_keys ) = @_ ;
172
156
# rehash all the ref keys based on their new StrVal
173
- %{ $self -> [0] } = map +(Scalar::Util:: refaddr($_ -> [0]) => $_ ), (values (%{ $self -> [0] }), @{ $extra_keys || [] });
157
+ %{ $self -> [0] } = map +(refaddr($_ -> [0]) => $_ ), (values (%{ $self -> [0] }), @{ $extra_keys || [] });
174
158
}
175
159
176
160
sub FETCH {
177
161
my ($s , $k ) = @_ ;
178
162
if (ref $k ) {
179
- my $kstr = Scalar::Util:: refaddr($k );
163
+ my $kstr = refaddr($k );
180
164
if (defined $s -> [0]{$kstr }) {
181
165
$s -> [0]{$kstr }[1];
182
166
}
@@ -192,7 +176,7 @@ sub FETCH {
192
176
sub STORE {
193
177
my ($s , $k , $v ) = @_ ;
194
178
if (ref $k ) {
195
- $s -> [0]{Scalar::Util:: refaddr($k )} = [$k , $v ];
179
+ $s -> [0]{refaddr($k )} = [$k , $v ];
196
180
}
197
181
else {
198
182
$s -> [1]{$k } = $v ;
@@ -203,13 +187,13 @@ sub STORE {
203
187
sub DELETE {
204
188
my ($s , $k ) = @_ ;
205
189
(ref $k )
206
- ? (delete ($s -> [0]{Scalar::Util:: refaddr($k )}) || [])-> [1]
190
+ ? (delete ($s -> [0]{refaddr($k )}) || [])-> [1]
207
191
: delete ($s -> [1]{$k });
208
192
}
209
193
210
194
sub EXISTS {
211
195
my ($s , $k ) = @_ ;
212
- (ref $k ) ? exists ($s -> [0]{Scalar::Util:: refaddr($k )}) : exists ($s -> [1]{$k });
196
+ (ref $k ) ? exists ($s -> [0]{refaddr($k )}) : exists ($s -> [1]{$k });
213
197
}
214
198
215
199
sub FIRSTKEY {
@@ -268,7 +252,7 @@ Tie::RefHash - Use references as hash keys
268
252
269
253
=head1 VERSION
270
254
271
- version 1.40
255
+ version 1.41
272
256
273
257
=head1 SYNOPSIS
274
258
@@ -343,7 +327,7 @@ Tie::RefHash::Nestable by Ed Avis <ed@membled.com>
343
327
344
328
=head1 CONTRIBUTORS
345
329
346
- =for stopwords Yuval Kogman Karen Etheridge Florian Ragwitz Jerry D. Hedden
330
+ =for stopwords Yuval Kogman Karen Etheridge Florian Ragwitz Lukas Mai Jerry D. Hedden tusooa
347
331
348
332
=over 4
349
333
@@ -361,8 +345,16 @@ Florian Ragwitz <rafl@debian.org>
361
345
362
346
=item *
363
347
348
+ Lukas Mai <lukasmai.403@gmail.com>
349
+
350
+ =item *
351
+
364
352
Jerry D. Hedden <jdhedden@cpan.org>
365
353
354
+ =item *
355
+
356
+ tusooa <tusooa@kazv.moe>
357
+
366
358
=back
367
359
368
360
=head1 COPYRIGHT AND LICENCE
0 commit comments