This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Ensure that the C<exists &Errno::EFOO> idiom continues to work as documented.
[perl5.git] / ext / Errno / Errno_pm.PL
index 5725de8..c38f309 100644 (file)
@@ -356,14 +356,23 @@ EDQ
 print <<'ESQ';
     );
     # Generate proxy constant subroutines for all the values.
-    # We assume at this point that our symbol table is empty.
+    # Well, almost all the values. Unfortunately we can't assume that at this
+    # point that our symbol table is empty, as code such as if the parser has
+    # seen code such as C<exists &Errno::EINVAL>, it will have created the
+    # typeglob.
     # Doing this before defining @EXPORT_OK etc means that even if a platform is
     # crazy enough to define EXPORT_OK as an error constant, everything will
     # still work, because the parser will upgrade the PCS to a real typeglob.
     # We rely on the subroutine definitions below to update the internal caches.
     # Don't use %each, as we don't want a copy of the value.
     foreach my $name (keys %err) {
-        $Errno::{$name} = \$err{$name};
+        if ($Errno::{$name}) {
+            # We expect this to be reached fairly rarely, so take an approach
+            # which uses the least compile time effort in the common case:
+            eval "sub $name() { $err{$name} }; 1" or die $@;
+        } else {
+            $Errno::{$name} = \$err{$name};
+        }
     }
 }