This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
devel/scanprov: Scan for functions we didn't test
authorKarl Williamson <khw@cpan.org>
Thu, 1 Aug 2019 23:14:03 +0000 (17:14 -0600)
committerNicolas R <atoomic@cpan.org>
Fri, 27 Sep 2019 22:51:27 +0000 (16:51 -0600)
mktodo.pl tried to compile each element it knows about.  But not all
will actually compile, as some compile only when certain Configure
options are specified on certain platforms, like ones dealing with quad
math, or GLOBAL_PRIVATE_STRUCT.  But those functions are in embed.fnc
and the hdrs that get generated from that.  We can use the same
mechanism as elsewhere in scanprov to look for the first mentions of
these.

(cherry picked from commit 8530a7806b5283c981eb3e22ba311be35924a071)
Signed-off-by: Nicolas R <atoomic@cpan.org>
dist/Devel-PPPort/devel/regenerate
dist/Devel-PPPort/devel/scanprov

index 63718db..22f0828 100755 (executable)
@@ -117,7 +117,7 @@ unless (runperl('devel/mktodo', @args)) {
   quit_now();
 }
 
-print "\nAdding remaining baseline info...\n\n";
+print "\nAdding remaining info...\n\n";
 
 unless (runperl('Makefile.PL') and
         runtool('make') and
index a242668..9374907 100755 (executable)
@@ -1,11 +1,22 @@
 #!/usr/bin/perl -w
 ################################################################################
 #
-#  scanprov -- scan Perl headers for provided macros, and add known exceptions
+#  scanprov -- scan Perl headers for provided macros, and add known
+#              exceptions, and functions we weren't able to otherwise find.
+#              Thus the purpose of this file has been expanded beyond what its
+#              name says.
 #
 #  The lines added have a code to signify they are added by us:
 #   M means it is a macro
 #   X means it is a known exceptional item
+#   F means it is a function in embed.fnc that the normal routines didn't find
+#
+#  The regeneration routines do not know the prototypes for the macros scanned
+#  for, which is gotten from documentation in the source.  (If they were
+#  documented, they would be put in parts/apidoc.fnc, and test cases generated
+#  for them in mktodo.pl).  Therefore these are all undocumented.  It would be
+#  best if people would add document to them in the perl source, and then this
+#  portion of this function would be minimized.
 #
 ################################################################################
 #
@@ -37,14 +48,12 @@ GetOptions(\%opt, qw( install=s mode=s blead=s debug=i debug-start=s)) or die;
 
 my $write = $opt{mode} eq 'write';
 
-my %embed = map { ( $_->{name} => 1 ) }
-            parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
+# Get the list of known macros.  Functions are calculated separately below
+my %embed = map { $_->{flags}{m} ? ( $_->{name} => 1 ) : () }
+            parse_embed(qw(parts/embed.fnc parts/apidoc.fnc));
 
-# @provided is set to the elements that are provided, but not functions in the
-# .fnc files
-my @provided = grep { !exists $embed{$_} }
-               map { /^(\w+)/ ? $1 : () }
-               `$^X ppport.h --list-provided`;
+# @provided is set to everthing provided
+my @provided = map { /^(\w+)/ ? $1 : () } `$^X ppport.h --list-provided`;
 
 # There are a few exceptions that have to be dealt with specially.  Add these
 # to the list of things to scan for.
@@ -132,6 +141,31 @@ find_first_mentions($perls_ref,   # perls to look in
                    'M'
                    );
 
+# Now look for functions that we didn't test in mktodo.pl, generally because
+# these were hidden behind #ifdef's.
+my $base_ref = parse_todo($base_dir);
+my @functions = parse_embed(qw(parts/embed.fnc));
+@functions = grep { exists $_->{flags}{A} } @functions;
+# The ones we don't have info on are the ones in embed.fnc that aren't in the
+# base files.  Certain of these will only be in the Perl_foo form.
+my @missing = map { exists $base_ref->{$_->{name}}
+                    ? ()
+                    : ((exists $_->{flags}{p} && exists $_->{flags}{o})
+                       ? ((exists $base_ref->{$_->{"Perl_$_->{name}"}}
+                           ? ()
+                           : "Perl_$_->{name}"))
+                       : $_->{name})
+                  } @functions;
+
+# These symbols will be found in the autogen'd files, and they may be
+# commented out in them.
+find_first_mentions($perls_ref,
+                    \@missing,
+                    [ 'embed.h', 'proto.h' ],
+                    0,          # Don't strip comments
+                   'F'
+                   );
+
 sub format_output_line
 {
     my $sym = shift;
@@ -182,14 +216,14 @@ sub find_first_mentions
         }
 
         # @remaining is narrowed to include only those identifier-like things
-        # that are mentioned in some hdr in this release.  (If it isn't even
-        # mentioned, it won't exist in the release.)  For those not mentioned,
-        # a key is added of the identifier-like thing in %v.  It is a subkey
-        # of this release's "todo" release, which is the next higher one.  If
-        # we are at version n, we have already done version n+1 and the
-        # provided element was mentioned there, and now it no longer is.  We
-        # take that to mean that to mean that the element became provided for
-        # in n+1.
+        # that are mentioned in one of the input hdrs in this release.  (If it
+        # isn't even mentioned, it won't exist in the release.)  For those not
+        # mentioned, a key is added of the identifier-like thing in %v.  It is
+        # a subkey of this release's "todo" release, which is the next higher
+        # one.  If we are at version n, we have already done version n+1 and
+        # the provided element was mentioned there, and now it no longer is.
+        # We take that to mean that to mean that the element became provided
+        # for in n+1.
         @remaining = map { $sym{$_} or $v{$p->{todo}}{$_}++;
                             $sym{$_} ? $_ : ()
                         } @remaining;