ExtUtils::ParseXS: Accept overridden input typemaps
authorSteffen Mueller <smueller@cpan.org>
Thu, 25 Aug 2011 06:19:40 +0000 (08:19 +0200)
committerSteffen Mueller <smueller@cpan.org>
Thu, 25 Aug 2011 07:27:01 +0000 (09:27 +0200)
This restores the ability to have code like this:

ret_type*
foo(bar, baz)
    int bar
    ThereIsNoTypemapForThisType* baz = somefunc($arg);
  CODE:
  ...

Looks strange and indeed, it is. But it's documented in perlxs
to work, so we can't get away with breaking it. The heuristics
for determining whether to allow this use case is checking for
ST\( or \$arg being found in the initialization. That should take
care of all valid use of this feature and still die horribly in
cases where this is used by mistake (instead of a PREINIT block, etc).

dist/ExtUtils-ParseXS/Changes
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pm
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/CountLines.pm
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm

index 3b8d8af..0dd4405 100644 (file)
@@ -1,5 +1,14 @@
 Revision history for Perl extension ExtUtils::ParseXS.
 
+3.04 - Thu Aug 25 08:20:00 CET 2011
+
+  - Stable release based on 3.03_03, no functional changes.
+
+3.03_03 - Wed Aug 24 19:43:00 CET 2011
+
+  - Try to fix regression for input-typemap override in XS argument
+    list. (CPAN RT #70448)
+
   - Explicit versions in submodules to fail early if something
     goes wrong.
 
index 42e777e..35cf321 100644 (file)
@@ -11,7 +11,7 @@ use Symbol;
 
 our $VERSION;
 BEGIN {
-  $VERSION = '3.03_02';
+  $VERSION = '3.04';
 }
 use ExtUtils::ParseXS::Constants $VERSION;
 use ExtUtils::ParseXS::CountLines $VERSION;
@@ -560,6 +560,7 @@ EOF
     $_ = '';
     check_conditional_preprocessor_statements();
     while (@{ $self->{line} }) {
+
       $self->CASE_handler($_) if $self->check_keyword("CASE");
       print Q(<<"EOF");
 #   $self->{except} [[
@@ -571,7 +572,6 @@ EOF
       $self->{deferred} = "";
       %{ $self->{arg_list} } = ();
       $self->{gotRETVAL} = 0;
-
       $self->INPUT_handler($_);
       $self->process_keyword("INPUT|PREINIT|INTERFACE_MACRO|C_ARGS|ALIAS|ATTRS|PROTOTYPE|SCOPE|OVERLOAD");
 
@@ -1090,6 +1090,8 @@ sub INPUT_handler {
     my $var_init = '';
     $var_init = $1 if s/\s*([=;+].*)$//s;
     $var_init =~ s/"/\\"/g;
+    # *sigh* It's valid to supply explicit input typemaps in the argument list...
+    my $is_overridden_typemap = $var_init =~ /ST\s*\(|\$arg\b/;
 
     s/\s+/ /g;
     my ($var_type, $var_addr, $var_name) = /^(.*?[^&\s])\s*(\&?)\s*\b(\w+)$/s
@@ -1121,7 +1123,7 @@ sub INPUT_handler {
     if ($self->{var_num}) {
       my $typemap = $self->{typemap}->get_typemap(ctype => $var_type);
       $self->death("Could not find a typemap for C type '$var_type'")
-        if not $typemap;
+        if not $typemap and not $is_overridden_typemap;
       $self->{proto_arg}->[$self->{var_num}] = ($typemap && $typemap->proto) || "\$";
     }
     $self->{func_args} =~ s/\b($var_name)\b/&$1/ if $var_addr;
index 748f7e2..378ffd8 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 use Symbol;
 
-our $VERSION = '3.03_02';
+our $VERSION = '3.04';
 
 =head1 NAME
 
index ba82a38..c30e8fa 100644 (file)
@@ -1,7 +1,7 @@
 package ExtUtils::ParseXS::CountLines;
 use strict;
 
-our $VERSION = '3.03_02';
+our $VERSION = '3.04';
 
 our $SECTION_END_MARKER;
 
index ef31f6e..489b1b4 100644 (file)
@@ -6,7 +6,7 @@ use File::Spec;
 use lib qw( lib );
 use ExtUtils::ParseXS::Constants ();
 
-our $VERSION = '3.03_02';
+our $VERSION = '3.04';
 
 our (@ISA, @EXPORT_OK);
 @ISA = qw(Exporter);