summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChip Salzenberg <chip@pobox.com>1999-04-26 23:09:26 +0000
committerTodd Rinaldo <toddr@cpanel.net>2019-10-19 07:03:09 -0500
commita2ff0fcca75f29619a65eb1ed1d783d690b35e48 (patch)
tree92a4480c348a5b370d29ac62a347a9025f119c73
parenta4a98b9749fa3df5def5cc35c9d6e5ed1fa6fc2c (diff)
downloadperl-a2ff0fcca75f29619a65eb1ed1d783d690b35e48.tar.gz
Make &AutoLoad::AUTOLOAD reentrant.
p4raw-id: //depot/maint-5.004/perl@3279
-rw-r--r--lib/AutoLoader.pm55
1 files changed, 28 insertions, 27 deletions
diff --git a/lib/AutoLoader.pm b/lib/AutoLoader.pm
index 94a9a69295..488030aa85 100644
--- a/lib/AutoLoader.pm
+++ b/lib/AutoLoader.pm
@@ -11,11 +11,12 @@ BEGIN {
@EXPORT_OK = qw(AUTOLOAD);
$is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32';
$is_vms = $^O eq 'VMS';
- $VERSION = '5.55';
+ $VERSION = '5.56';
}
AUTOLOAD {
- my $name;
+ my $sub = $AUTOLOAD;
+ my $filename;
# Braces used to preserve $1 et al.
{
# Try to find the autoloaded file from the package-qualified
@@ -31,10 +32,10 @@ AUTOLOAD {
# In this case, we simple prepend the 'auto/' and let the
# C<require> take care of the searching for us.
- my ($pkg,$func) = $AUTOLOAD =~ /(.*)::([^:]+)$/;
+ my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/);
$pkg =~ s#::#/#g;
- if (defined($name=$INC{"$pkg.pm"})) {
- $name =~ s#^(.*)$pkg\.pm$#$1auto/$pkg/$func.al#;
+ if (defined($filename = $INC{"$pkg.pm"})) {
+ $filename =~ s#^(.*)$pkg\.pm$#$1auto/$pkg/$func.al#;
# if the file exists, then make sure that it is a
# a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al',
@@ -42,45 +43,45 @@ AUTOLOAD {
# (and failing) to find the 'lib/auto/foo/bar.al' because it
# looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib').
- if (-r $name) {
- unless ($name =~ m|^/|) {
+ if (-r $filename) {
+ unless ($filename =~ m|^/|) {
if ($is_dosish) {
- unless ($name =~ m{^([a-z]:)?[\\/]}i) {
- $name = "./$name";
+ unless ($filename =~ m{^([a-z]:)?[\\/]}i) {
+ $filename = "./$filename";
}
}
elsif ($is_vms) {
- # XXX todo by VMSmiths
- $name = "./$name";
+ # XXX todo by VMSmiths
+ $filename = "./$filename";
}
else {
- $name = "./$name";
+ $filename = "./$filename";
}
}
}
else {
- $name = undef;
+ $filename = undef;
}
}
- unless (defined $name) {
+ unless (defined $filename) {
# let C<require> do the searching
- $name = "auto/$AUTOLOAD.al";
- $name =~ s#::#/#g;
+ $filename = "auto/$sub.al";
+ $filename =~ s#::#/#g;
}
}
my $save = $@;
- eval { local $SIG{__DIE__}; require $name };
+ eval { local $SIG{__DIE__}; require $filename };
if ($@) {
- if (substr($AUTOLOAD,-9) eq '::DESTROY') {
- *$AUTOLOAD = sub {};
+ if (substr($sub,-9) eq '::DESTROY') {
+ *$sub = sub {};
} else {
# The load might just have failed because the filename was too
# long for some old SVR3 systems which treat long names as errors.
# If we can succesfully truncate a long name then it's worth a go.
# There is a slight risk that we could pick up the wrong file here
# but autosplit should have warned about that when splitting.
- if ($name =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
- eval {local $SIG{__DIE__};require $name};
+ if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
+ eval { local $SIG{__DIE__}; require $filename };
}
if ($@){
$@ =~ s/ at .*\n//;
@@ -91,7 +92,7 @@ AUTOLOAD {
}
}
$@ = $save;
- goto &$AUTOLOAD;
+ goto &$sub;
}
sub import {
@@ -220,20 +221,20 @@ lines:
use Carp;
sub AUTOLOAD {
- my $constname;
- ($constname = $AUTOLOAD) =~ s/.*:://;
+ my $sub = $AUTOLOAD;
+ (my $constname = $sub) =~ s/.*:://;
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
if ($! =~ /Invalid/) {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ $AutoLoader::AUTOLOAD = $sub;
goto &AutoLoader::AUTOLOAD;
}
else {
croak "Your vendor has not defined constant $constname";
}
}
- *$AUTOLOAD = sub { $val }; # same as: eval "sub $AUTOLOAD { $val }";
- goto &$AUTOLOAD;
+ *$sub = sub { $val }; # same as: eval "sub $sub { $val }";
+ goto &$sub;
}
If any module's own AUTOLOAD subroutine has no need to fallback to the