From: Vincent Pit Date: Sat, 5 Dec 2009 00:08:28 +0000 (+0100) Subject: 5.11.2 fix X-Git-Tag: v0.06~12 X-Git-Url: http://git.vpit.fr/?a=commitdiff_plain;h=3fcfcabe180fd621d86f1652b8a79ff2f702cf6d;p=perl%2Fmodules%2Fsubs-auto.git 5.11.2 fix --- diff --git a/lib/subs/auto.pm b/lib/subs/auto.pm index 449ef8d..6b2dd59 100644 --- a/lib/subs/auto.pm +++ b/lib/subs/auto.pm @@ -97,7 +97,11 @@ my %core; delete @core{qw/my local/}; undef @core; -my $tag = wizard data => sub { 1 }; +BEGIN { + *_REFCNT_PLACEHOLDERS = eval 'sub () { ' . ($] < 5.011002 ? 0 : 1) . '}' +} + +my $tag = wizard data => sub { \(my $data = _REFCNT_PLACEHOLDERS ? 2 : 1) }; sub _reset { my ($pkg, $func) = @_; @@ -107,7 +111,9 @@ sub _reset { no warnings 'once'; *$fqn{CODE}; }; - if ($cb and getdata(&$cb, $tag)) { + if ($cb and defined(my $data = getdata(&$cb, $tag))) { + $$data--; + return if $$data > 0; no strict 'refs'; my $sym = gensym; for (qw/SCALAR ARRAY HASH IO FORMAT/) { @@ -128,16 +134,22 @@ sub _fetch { my $mod = $func . '.pm'; if (not exists $INC{$mod}) { my $fqn = $data->{pkg} . '::' . $func; - if (do { no strict 'refs'; not *$fqn{CODE} || *$fqn{IO}}) { - my $cb = sub { - my ($file, $line) = (caller 0)[1, 2]; - ($file, $line) = ('(eval 0)', 0) unless $file && $line; - die "Undefined subroutine &$fqn called at $file line $line\n"; - }; - cast &$cb, $tag; - no strict 'refs'; - *$fqn = $cb; + my $cb = do { no strict 'refs'; *$fqn{CODE} }; + if ($cb) { + if (_REFCNT_PLACEHOLDERS and defined(my $data = getdata(&$cb, $tag))) { + ++$$data; + } + return; } + return if do { no strict 'refs'; *$fqn{IO} }; + $cb = sub { + my ($file, $line) = (caller 0)[1, 2]; + ($file, $line) = ('(eval 0)', 0) unless $file && $line; + die "Undefined subroutine &$fqn called at $file line $line\n"; + }; + cast &$cb, $tag; + no strict 'refs'; + *$fqn = $cb; } } else { _reset($data->{pkg}, $func);