This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PPPort_pm.PL: Handle blead specially
authorKarl Williamson <khw@cpan.org>
Sun, 28 Jul 2019 22:15:06 +0000 (16:15 -0600)
committerNicolas R <atoomic@cpan.org>
Fri, 27 Sep 2019 22:51:27 +0000 (16:51 -0600)
blead actually shouldn't be reported, as the symbols it shows as
existing are (due to the algorithm) actually ones that don't exist in
any version.  By ignoring it, we omit wrong information.

(cherry picked from commit 97d35610a4fccf694db9a601b102b5a2888b9713)
Signed-off-by: Nicolas R <atoomic@cpan.org>
dist/Devel-PPPort/PPPort_pm.PL
dist/Devel-PPPort/parts/apicheck.pl
dist/Devel-PPPort/parts/ppptools.pl

index 9d1edf2..e0e9ddf 100644 (file)
@@ -94,7 +94,7 @@ my %raw_todo = %{&parse_todo('parts/todo')};
 #                       ],
 my %todo;
 for (keys %raw_todo) {
-  push @{$todo{int_parse_version($raw_todo{$_})}}, $_;
+  push @{$todo{int_parse_version($raw_todo{$_}{version})}}, $_;
 }
 
 # Most recent first
@@ -111,21 +111,29 @@ my $MAX_PERL = format_version($INT_MAX_PERL);
 my $INT_MIN_PERL = (@todo_list) ? $todo_list[-1] : 5003007;
 my $MIN_PERL = format_version($INT_MIN_PERL);
 
+# Get rid of blead.  It contains the things marked as todo, meaning they
+# don't compile at all, and not getting rid of it would mean they would be
+# listed as working but introduced in blead.
+shift @todo_list if @todo_list && $todo_list[0] > $INT_MAX_PERL;
+
 # check consistency between our list of everything provided, and our lists of
 # what got provided when
 for (@provided) {
   if (   exists $raw_todo{$_}
-      && $raw_todo{$_} > $INT_MIN_PERL      # INT_MIN_PERL contents are real
-                                            # symbols, not something to do
+      && $raw_todo{$_}{version} > $INT_MIN_PERL # INT_MIN_PERL contents are real
+                                                # symbols, not something to do
+      && $raw_todo{$_}{version} <= $INT_MAX_PERL # Above this would be things that
+                                                 # don't compile in blead
       && exists $raw_base{$_})
   {
-    if ($raw_base{$_} == $raw_todo{$_}) {
+    if ($raw_base{$_}{version} == $raw_todo{$_}{version}) {
       warn "$INCLUDE/$provides{$_} provides $_, which is still marked "
            . "todo for " . format_version($raw_todo{$_}) . "\n";
     }
     else {
-      check(2, "$_ was ported back to " . format_version($raw_todo{$_}) .
-               " (baseline revision: "  . format_version($raw_base{$_}) . ").");
+      check(2, "$_ was ported back to " . format_version($raw_todo{$_}{version})
+            .  " (baseline revision: "  . format_version($raw_base{$_}{version})
+            . ").");
     }
   }
 }
@@ -151,13 +159,21 @@ for (@perl_api) {   # $_ is the item name
 
   # Create the lines that ppport.h reads.  These look like
   #     CopyD|5.009002|5.003007|p
-  my $line = "$_|" . (exists $provides{$_} && exists $raw_base{$_} ? $raw_base{$_} : '') . '|';
-  $line .= ($raw_todo{$_} || '') . '|';
+  my $line = "$_|";
+  $line .= $raw_base{$_}{version} if exists $raw_base{$_}
+                # If is above the max, it means it never actually got defined
+            && int_parse_version($raw_base{$_}{version}) <= $INT_MAX_PERL;
+  $line .= '|';
+  $line .= $raw_todo{$_}{version}
+                if exists $raw_todo{$_}
+                && int_parse_version($raw_todo{$_}{version}) <= $INT_MAX_PERL;
+  $line .= '|';
   $line .= 'p' if exists $provides{$_};
+  my $e;
+  $e = $embed{$_} if exists $embed{$_};
   my $is_documented = 0;
   my $is_accessible = 0;
-  if (exists $embed{$_}) {
-    my $e = $embed{$_};
+  if (defined $e) {
     if (exists $e->{flags}{p}) {    # Has 'Perl_' prefix
       my $args = $e->{args};
       $line .= 'v' if @$args && $args->[-1][0] eq '...';
index 26c3e2a..6804fd6 100644 (file)
@@ -350,8 +350,8 @@ for $f (@f) {   # Loop through all the tests to add
 HEAD
 
   # #ifdef out if marked as todo (not known in) this version
-  if ($todo{$f->{'name'}}) {
-    my($five, $ver,$sub) = parse_version($todo{$f->{'name'}});
+  if (exists $todo{$f->{'name'}}) {
+    my($five, $ver,$sub) = parse_version($todo{$f->{'name'}}{'version'});
     print OUT "#if PERL_VERSION > $ver || (PERL_VERSION == $ver && PERL_SUBVERSION >= $sub) /* TODO */\n";
   }
 
@@ -384,7 +384,7 @@ $stack
 END
 
   $f->{'cond'} and print OUT "#endif\n";
-  $todo{$f->{'name'}} and print OUT "#endif\n";
+  exists $todo{$f->{'name'}} and print OUT "#endif\n";
 
   print OUT "\n";
 }
index d9fce1f..13a8d0e 100644 (file)
@@ -39,8 +39,16 @@ sub all_files_in_dir
 sub parse_todo
 {
   # Creates a hash with the keys being all symbols found in all the files in
-  # the input directory (default 'parts/todo'), and the values being the perl
-  # versions of each symbol.
+  # the input directory (default 'parts/todo'), and the values being each a
+  # subhash like so:
+  #     'utf8_hop_forward' => {
+  #                               'code' => 'U',
+  #                               'version' => '5.025007'
+  #                           },
+  #
+  # The input line that generated that was this:
+  #
+  #     utf8_hop_forward               # U
 
   my $dir = shift || 'parts/todo';
   local *TODO;
@@ -53,12 +61,14 @@ sub parse_todo
     chomp $version;
     while (<TODO>) {
       chomp;
-      s/#.*//;
+      s/#(?: (\w)\b)?.*//;  # 'code' is optional
+      my $code = $1;
       s/^\s+//; s/\s+$//;
       /^\s*$/ and next;
       /^\w+$/ or die "invalid identifier: $_\n";
       exists $todo{$_} and die "duplicate identifier: $_ ($todo{$_} <=> $version)\n";
-      $todo{$_} = $version;
+      $todo{$_}{'version'} = $version;
+      $todo{$_}{'code'} = $code if $code;
     }
     close TODO;
   }