This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Refactor xsinit generation code in ExtUtils::Embed.
authorNicholas Clark <nick@ccl4.org>
Mon, 8 Jul 2013 10:11:35 +0000 (12:11 +0200)
committerNicholas Clark <nick@ccl4.org>
Tue, 9 Jul 2013 05:54:27 +0000 (07:54 +0200)
Remove tautological comments about loading modules.
Simplify xsi_protos() and static_ext().
canon('/','DynaLoader') is just 'DynaLoader' so inline the constant.
Refactor canon() to consistently use 1 regex pattern delimiter, avoid map
in void context, and teach it that extensions can be in 'dist' and 'cpan' as
well as 'ext'.
Remove obsolete C<require 5.002> statement.

lib/ExtUtils/Embed.pm

index 23ee07a..71c3876 100644 (file)
@@ -1,14 +1,8 @@
-require 5.002;
-
 package ExtUtils::Embed;
 require Exporter;
 use Config;
 require File::Spec;
 
-#Only when we need them
-#require ExtUtils::MakeMaker;
-#require ExtUtils::Liblist;
-
 use vars qw(@ISA @EXPORT $VERSION
            @Extensions $Verbose $lib_ext
            $opt_o $opt_s 
@@ -88,13 +82,8 @@ EOF
 sub xsi_protos {
     my(@exts) = @_;
     my(@retval,%seen);
-    my $boot_proto = "pTHX_ CV* cv";
-    foreach $_ (@exts){
-        my($pname) = canon('/', $_);
-        my($mname, $cname);
-        ($mname = $pname) =~ s!/!::!g;
-        ($cname = $pname) =~ s!/!__!g;
-       my($ccode) = "EXTERN_C void boot_${cname} ($boot_proto);\n";
+    foreach my $cname (canon('__', @exts)) {
+        my($ccode) = "EXTERN_C void boot_${cname} (pTHX_ CV* cv);\n";
        next if $seen{$ccode}++;
         push(@retval, $ccode);
     }
@@ -103,8 +92,7 @@ sub xsi_protos {
 
 sub xsi_body {
     my(@exts) = @_;
-    my($pname,@retval,%seen);
-    my($dl) = canon('/','DynaLoader');
+    my(@retval,%seen);
     push(@retval, "    static const char file[] = __FILE__;\n")
         if @exts;
     push(@retval, "    dXSUB_SYS;\n");
@@ -112,12 +100,11 @@ sub xsi_body {
     push(@retval, "\n")
         if @exts;
 
-    foreach $_ (@exts){
-        my($pname) = canon('/', $_);
-        my($mname, $cname, $ccode);
+    foreach my $pname (canon('/', @exts)) {
+        my($cname, $mname, $ccode);
         ($mname = $pname) =~ s!/!::!g;
         ($cname = $pname) =~ s!/!__!g;
-        if ($pname eq $dl){
+        if ($pname eq 'DynaLoader'){
             # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
             # boot_DynaLoader is called directly in DynaLoader.pm
             $ccode = "    /* DynaLoader is a special case */\n    newXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
@@ -131,12 +118,8 @@ sub xsi_body {
 }
 
 sub static_ext {
-    unless (scalar @Extensions) {
-      my $static_ext = $Config{static_ext};
-      $static_ext =~ s/^\s+//;
-      @Extensions = sort split /\s+/, $static_ext;
-       unshift @Extensions, qw(DynaLoader);
-    }
+    @Extensions = ('DynaLoader', sort $Config{static_ext} =~ /(\S+)/g)
+        unless @Extensions;
     @Extensions;
 }
 
@@ -275,12 +258,16 @@ sub ccopts {
 sub canon {
     my($as, @ext) = @_;
     foreach(@ext) {
-       # might be X::Y or lib/auto/X/Y/Y.a
-       next if s!::!/!g;
-       s:^(lib|ext)/(auto/)?::;
-       s:/\w+\.\w+$::;
+        # might be X::Y or lib/auto/X/Y/Y.a
+        next
+            if s!::!/!g;
+        s!^(?:lib|ext|dist|cpan)/(?:auto/)?!!;
+        s!/\w+\.\w+$!!;
+    }
+    if ($as ne '/') {
+        s!/!$as!
+            foreach @ext;
     }
-    map(s:/:$as:, @ext) if ($as ne '/');
     @ext;
 }