This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
parts/apicheck.pl: make macro public in X+M flagged functions
authorKarl Williamson <khw@cpan.org>
Wed, 14 Aug 2019 05:07:26 +0000 (23:07 -0600)
committerNicolas R <atoomic@cpan.org>
Fri, 27 Sep 2019 22:51:27 +0000 (16:51 -0600)
The X says we export a function even though it's not public API, but the
M says there is an extra, public, macro that maybe used to call the
function, but now calls something else, and that macro is public, so
should be tested.

(cherry picked from commit 7528b129460c777edc99db3e5555b38a41a9390f)
Signed-off-by: Nicolas R <atoomic@cpan.org>
dist/Devel-PPPort/parts/apicheck.pl

index 79ee89c..65b8217 100644 (file)
@@ -241,8 +241,12 @@ for $f (@f) {   # Loop through all the tests to add
   $ignore{$unique} and next;
 
   # only public API members, except those in ppport.fnc are there because we
-  # want them to be tested even if non-public.
-  $f->{'flags'}{'A'} or $f->{'ppport_fnc'} or next;
+  # want them to be tested even if non-public.  X,M functions are supposed to
+  # be considered to have just the macro form public.
+      $f->{'flags'}{'A'}
+  or  $f->{'ppport_fnc'}
+  or ($f->{'flags'}{'X'} and $f->{'flags'}{'M'})
+  or next;
 
   # Don't test unorthodox things that we aren't set up to do
   $f->{'flags'}{'u'} and next;
@@ -389,6 +393,22 @@ void _DPPP_test_$f->{'name'} (void)
   dXSARGS;
 $stack
   {
+END
+
+  # If M is a flag here, it means the 'Perl_' form is not for general use, but
+  # the macro (tested above) is.
+  if ($f->{'flags'}{'M'}) {
+      print OUT <<END;
+
+    $ret$prefix$f->{'name'}$args;
+  }
+}
+END
+
+  }
+  else {
+    print OUT <<END;
+
 #ifdef $f->{'name'}
     $ret$prefix$f->{'name'}$args;
 #endif
@@ -404,6 +424,8 @@ $stack
 }
 END
 
+  }
+
   $f->{'ppport_fnc'} and print OUT "#endif\n";
   $f->{'cond'} and print OUT "#endif\n";
   exists $todo{$f->{'name'}} and print OUT "#endif\n";