For the generated XSLoader.pm, avoid a runtime lexical which is constant.
authorNicholas Clark <nick@ccl4.org>
Thu, 2 Sep 2010 10:44:51 +0000 (11:44 +0100)
committerNicholas Clark <nick@ccl4.org>
Thu, 2 Sep 2010 10:44:51 +0000 (11:44 +0100)
XSLoader_pm.PL had been resolving $Config::Config{dlext}, and writing it as
the constant initialiser for a lexical variable in XSLoader.pm. In turn,
that lexical was used only once, in string interpolation. So the interpolation
can be done instead at build time.

dist/XSLoader/XSLoader_pm.PL

index a258f6e..f2e5bbc 100644 (file)
@@ -1,13 +1,6 @@
 use strict;
 use Config;
 
-sub to_string {
-    my ($value) = @_;
-    $value =~ s/\\/\\\\/g;
-    $value =~ s/'/\\'/g;
-    return "'$value'";
-}
-
 1 while unlink "XSLoader.pm";
 open OUT, ">XSLoader.pm" or die $!;
 print OUT <<'EOT';
@@ -15,19 +8,13 @@ print OUT <<'EOT';
 
 package XSLoader;
 
-$VERSION = "0.10";
+$VERSION = "0.11";
 
 #use strict;
 
 # enable debug/trace messages from DynaLoader perl code
 # $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
 
-EOT
-
-print OUT '  my $dl_dlext = ', to_string($Config::Config{'dlext'}), ";\n" ;
-
-print OUT <<'EOT';
-
 package DynaLoader;
 
 # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
@@ -74,7 +61,15 @@ print OUT <<'EOT';
     my $modlibname = (caller())[1];
     my $c = @modparts;
     $modlibname =~ s,[\\/][^\\/]+$,, while $c--;       # Q&D basename
-    my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext";
+EOT
+
+my $dl_dlext = quotemeta($Config::Config{'dlext'});
+
+print OUT <<"EOT";
+    my \$file = "\$modlibname/auto/\$modpname/\$modfname.$dl_dlext";
+EOT
+
+print OUT <<'EOT';
 
 #   print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug;