This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In Cwd::_win32_cwd() avoid a string eval when checking if we're miniperl.
authorNicholas Clark <nick@ccl4.org>
Sat, 18 Jun 2011 12:42:07 +0000 (14:42 +0200)
committerNicholas Clark <nick@ccl4.org>
Wed, 22 Jun 2011 14:53:50 +0000 (16:53 +0200)
To allow ExtUtils::MakeMaker to run tests as if it's "miniperl" we need to avoid
taking any sort of reference to the typeglob or the code in the optree, as its
test modules are loaded later than Cwd. Previously this was done with a string
eval, but that was causing problems (for unclear reasons - rt.cpan.org #56225).
Using a symbol table lookup and *foo{THING} syntax avoids the string eval.

Evolved from a suggestion by Reini Urban.

dist/Cwd/Cwd.pm

index 4683e10..ecd14ae 100644 (file)
@@ -171,7 +171,7 @@ use strict;
 use Exporter;
 use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
 
-$VERSION = '3.36';
+$VERSION = '3.37';
 my $xs_version = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -755,7 +755,14 @@ sub _win32_cwd_simple {
 }
 
 sub _win32_cwd {
-    if (eval 'defined &DynaLoader::boot_DynaLoader') {
+    # Need to avoid taking any sort of reference to the typeglob or the code in
+    # the optree, so that this tests the runtime state of things, as the
+    # ExtUtils::MakeMaker tests for "miniperl" need to be able to fake things at
+    # runtime by deleting the subroutine. *foo{THING} syntax on a symbol table
+    # lookup avoids needing a string eval, which has been reported to cause
+    # problems (for reasons that we haven't been able to get to the bottom of -
+    # rt.cpan.org #56225)
+    if (*{$DynaLoader::{boot_DynaLoader}}{CODE}) {
        $ENV{'PWD'} = Win32::GetCwd();
     }
     else { # miniperl