regen/mk_invlists.pl: Handle earlier Unicode versions
authorKarl Williamson <khw@cpan.org>
Fri, 20 Mar 2015 03:35:11 +0000 (21:35 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 20 Mar 2015 04:53:01 +0000 (22:53 -0600)
There are now hard-coded references in regexec.c to enum values for
\b{}.  Perl is supposed to work when compiled with earlier Unicode
releases, but these had fewer of these enum values.  This commit causes
mk_invlists.pl to make sure any missing ones are defined.  This means we
don't have to #ifdef the code.  An earlier release without an enum value
obviously won't have any code points that map to that value.

charclass_invlists.h
regen/mk_invlists.pl

index c1266be..da6c043 100644 (file)
@@ -97323,5 +97323,5 @@ static const UV XPosixXDigit_invlist[] = { /* for EBCDIC POSIX-BC */
  * c2cb810a67cc5fb4a8d236b6c1bc6dd4d89733d8603881997e8aae2c816a3db1 lib/unicore/extracted/DNumValues.txt
  * 7aaa861571da8311a846f41437e326886f7c4b88c742bb8f0c319968fa5f7e65 lib/unicore/mktables
  * 746472de66b936ac885ca6d6e68058242b4e909e3260c6317f3ec719f78f76cc lib/unicore/version
- * 72754dc48de5bcad92cd0f84c691d099f429ddf2222f24531c928ad610cd8050 regen/mk_invlists.pl
+ * 4360c31f23eb368e0f3bfd045a44d3bc37ff0889e216f686ebea02543ac188d9 regen/mk_invlists.pl
  * ex: set ro: */
index 7cd5bac..48215c4 100644 (file)
@@ -56,6 +56,68 @@ my %exceptions_to_where_to_define =
                           _Perl_IDStart              => 'PERL_IN_UTF8_C',
                         );
 
+# This hash contains the properties with enums that have hard-coded references
+# to them in C code.  Its only use is to make sure that if perl is compiled
+# with an older Unicode data set, that all the enum values the code is
+# expecting will still be in the enum typedef.  Thus the code doesn't have to
+# change.  The Unicode version won't have any code points that have these enum
+# values, so the code that handles them will not get exercised.  This is far
+# better than having to #ifdef things.
+my %hard_coded_enums =
+ ( gcb => [
+            'Control',
+            'CR',
+            'Extend',
+            'L',
+            'LF',
+            'LV',
+            'LVT',
+            'Other',
+            'Prepend',
+            'Regional_Indicator',
+            'SpacingMark',
+            'T',
+            'V',
+        ],
+   sb  => [
+            'ATerm',
+            'Close',
+            'CR',
+            'Extend',
+            'Format',
+            'LF',
+            'Lower',
+            'Numeric',
+            'OLetter',
+            'Other',
+            'SContinue',
+            'Sep',
+            'Sp',
+            'STerm',
+            'Upper',
+        ],
+   wb  => [
+            'ALetter',
+            'CR',
+            'Double_Quote',
+            'Extend',
+            'ExtendNumLet',
+            'Format',
+            'Hebrew_Letter',
+            'Katakana',
+            'LF',
+            'MidLetter',
+            'MidNum',
+            'MidNumLet',
+            'Newline',
+            'Numeric',
+            'Other',
+            'Regional_Indicator',
+            'Single_Quote',
+            'UNKNOWN',
+        ],
+);
+
 my @a2n;
 
 sub uniques {
@@ -174,14 +236,31 @@ sub output_invmap ($$$$$$$) {
 
     if ($input_format eq 's') {
         $prop_name = (prop_aliases($prop_name))[1]; # Get full name
+        my $short_name = (prop_aliases($prop_name))[0];
             my @enums = prop_values($prop_name);
             if (! @enums) {
                 die "Only enum properties are currently handled; '$prop_name' isn't one";
             }
             else {
 
-                # Convert short names to long, add in the extras, and sort.
+                # Convert short names to long
                 @enums = map { (prop_value_aliases($prop_name, $_))[1] } @enums;
+
+                my @expected_enums = @{$hard_coded_enums{lc $short_name}};
+                die 'You need to update %hard_coded_enums to reflect new entries in this Unicode version'
+                    if @expected_enums < @enums;
+
+                # Remove the enums found in the input from the ones we expect
+                for (my $i = @expected_enums - 1; $i >= 0; $i--) {
+                    splice(@expected_enums, $i, 1)
+                                if grep { $expected_enums[$i] eq $_ } @enums;
+                }
+
+                # The ones remaining must be because we're using an older
+                # Unicode version.  Add them to the list.
+                push @enums, @expected_enums;
+
+                # Add in the extra values coded into this program, and sort.
                 push @enums, split /,/, $extra_enums if $extra_enums ne "";
                 @enums = sort @enums;
 
@@ -199,8 +278,6 @@ sub output_invmap ($$$$$$$) {
             switch_pound_if($name, 'PERL_IN_REGEXEC_C');
         {
 
-            my $short_name = (prop_aliases($prop_name))[0];
-
             # The short names tend to be two lower case letters, but it looks
             # better for those if they are upper. XXX
             $short_name = uc($short_name) if length($short_name) < 3