Convert Fcntl::S_IFMT to XS.
authorNicholas Clark <nick@ccl4.org>
Mon, 18 Oct 2010 18:31:00 +0000 (20:31 +0200)
committerNicholas Clark <nick@ccl4.org>
Mon, 18 Oct 2010 18:31:00 +0000 (20:31 +0200)
This removes the requirement to call XSLoader::load() at BEGIN time, which
simplifies the Perl code further.

ext/Fcntl/Fcntl.pm
ext/Fcntl/Fcntl.xs
ext/Fcntl/t/mode.t

index 1f69019..834d7ec 100644 (file)
@@ -59,10 +59,11 @@ use strict;
 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);
 
 require Exporter;
+require XSLoader;
 @ISA = qw(Exporter);
-BEGIN {
-  $VERSION = '1.09';
-}
+$VERSION = '1.09';
+
+XSLoader::load();
 
 # Items to export into callers namespace by default
 # (move infrequently used names to @EXPORT_OK below)
@@ -209,14 +210,6 @@ BEGIN {
                   )],
 );
 
-# Force the constants to become inlined
-BEGIN {
-  require XSLoader;
-  XSLoader::load();
-}
-
-sub S_IFMT  { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT()  }
-
 sub AUTOLOAD {
     (my $constname = $AUTOLOAD) =~ s/.*:://;
     die "&Fcntl::constant not defined" if $constname eq 'constant';
index 2f86366..a66f66e 100644 (file)
@@ -78,6 +78,13 @@ S_IMODE(...)
        }
        PUSHu(SvUV(mode) & 07777);
 
+void
+S_IFMT(...)
+    PREINIT:
+       dXSTARG;
+    PPCODE:
+       PUSHu(items ? (SvUV(ST(0)) & S_IFMT) : S_IFMT);
+
 BOOT:
     {
         CV *cv;
index c7fa8d1..4bec202 100644 (file)
@@ -18,7 +18,7 @@ if (-c $devnull) {
     push @tests, ['CHR', $devnull, (stat $devnull)[2]];
 }
 
-plan(tests => 6 + 9 * @tests);
+plan(tests => 34 + 6 + 9 * @tests);
 foreach (@tests) {
     my ($type, $name, $mode) = @$_;
 
@@ -84,3 +84,9 @@ foreach ([S_ISREG => \&S_ISREG],
     is(scalar @warnings, 1, '1 warning');
     like($warnings[0], qr/^Use of uninitialized value/, 'expected warning');
 }
+
+is (S_IFMT(), _S_IFMT(), 'S_IFMT()');
+is (S_IFMT(0), 0, 'S_IFMT(0)');
+for my $shift (0..31) {
+    is (S_IFMT(1 << $shift), ((1 << $shift) & _S_IFMT()), "S_IFMT(1 << $shift)");
+}