New XS keyword: EXPORT_XSUB_SYMBOLS
authorSteffen Mueller <smueller@cpan.org>
Fri, 12 Aug 2011 15:13:03 +0000 (17:13 +0200)
committerSteffen Mueller <smueller@cpan.org>
Sun, 21 Aug 2011 11:30:55 +0000 (13:30 +0200)
This can be used to enable/disable the exporting of XSUB symbols.
Technically and at least as far as the documentation change is
concerned, this change goes together with the upcoming change
to XSUB.h to make not exporting the XSUB symbols the default.
It's harmless if a bit useless without that.

In the original plan for making XSUBs "static", there wouldn't have
been a public and easy way to make XSUBs exported from XS code
without resorting to manually redefining macros. But since even in
just the core set of modules, simple things break, I think it's best
to expose this bit of choice.

dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pm
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm
dist/ExtUtils-ParseXS/lib/perlxs.pod

index e63b133..e6d4bf7 100644 (file)
@@ -298,7 +298,7 @@ EOM
     my $xsreturn = 0;
 
     $_ = shift(@{ $self->{line} });
-    while (my $kwd = $self->check_keyword("REQUIRE|PROTOTYPES|FALLBACK|VERSIONCHECK|INCLUDE(?:_COMMAND)?|SCOPE")) {
+    while (my $kwd = $self->check_keyword("REQUIRE|PROTOTYPES|EXPORT_XSUB_SYMBOLS|FALLBACK|VERSIONCHECK|INCLUDE(?:_COMMAND)?|SCOPE")) {
       my $method = $kwd . "_handler";
       $self->$method($_);
       next PARAGRAPH unless @{ $self->{line} };
@@ -899,8 +899,8 @@ MAKE_FETCHMETHOD_WORK
 EOF
 
   print Q(<<"EOF");
-#XS(boot_$self->{Module_cname}); /* prototype to pass -Wmissing-prototypes */
-#XS(boot_$self->{Module_cname})
+#XS_EXTERNAL(boot_$self->{Module_cname}); /* prototype to pass -Wmissing-prototypes */
+#XS_EXTERNAL(boot_$self->{Module_cname})
 EOF
 
   print Q(<<"EOF");
@@ -1452,6 +1452,30 @@ sub PROTOTYPES_handler {
   $self->{ProtoUsed} = 1;
 }
 
+sub EXPORT_XSUB_SYMBOLS_handler {
+  my $self = shift;
+  $_ = shift;
+
+  # the rest of the current line should contain either ENABLE or
+  # DISABLE
+
+  trim_whitespace($_);
+
+  # check for ENABLE/DISABLE
+  $self->death("Error: EXPORT_XSUB_SYMBOLS: ENABLE/DISABLE")
+    unless /^(ENABLE|DISABLE)/i;
+
+  my $xs_impl = $1 eq 'ENABLE' ? 'XS_EXTERNAL' : 'XS_INTERNAL';
+
+  print Q(<<"EOF");
+##if (PERL_REVISION == 5 && (PERL_VERSION > 15 || (PERL_VERSION == 15 && PERL_SUBVERSION > 0)))
+##undef XS
+##define XS(name) $xs_impl(name)
+##endif
+EOF
+}
+
+
 sub PushXSStack {
   my $self = shift;
   my %args = @_;
index 69eba9d..3788dce 100644 (file)
@@ -34,6 +34,7 @@ our @XSKeywords      = qw(
   OUTPUT CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE
   VERSIONCHECK INCLUDE INCLUDE_COMMAND SCOPE INTERFACE
   INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD FALLBACK
+  EXPORT_XSUB_SYMBOLS
 );
 
 1;
index 910bc2f..085536e 100644 (file)
@@ -1520,6 +1520,24 @@ the different argument lists.
 
        $status = x_gettime( $timep, $host );
 
+=head2 The EXPORT_XSUB_SYMBOLS: Keyword
+
+The EXPORT_XSUB_SYMBOLS: keyword is likely something you will never need.
+In perl versions earlier than 5.16.0, this keyword does nothing. Starting
+with 5.16, XSUB symbols are no longer exported by default. That is, they
+are C<static> functions. If you include
+
+  EXPORT_XSUB_SYMBOLS: ENABLE
+
+in your XS code, the XSUBs following this line will not be declared C<static>.
+You can later disable this with
+
+  EXPORT_XSUB_SYMBOLS: DISABLE
+
+which, again, is the default that you should probably never change.
+You cannot use this keyword on versions of perl before 5.16 to make
+XSUBs C<static>.
+
 =head2 The & Unary Operator
 
 The C<&> unary operator in the INPUT: section is used to tell B<xsubpp>