This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add common UTF-8 first byte to ANYOFH regnodes
authorKarl Williamson <khw@cpan.org>
Wed, 20 Mar 2019 17:47:15 +0000 (11:47 -0600)
committerKarl Williamson <khw@cpan.org>
Wed, 20 Mar 2019 18:12:44 +0000 (12:12 -0600)
commit765e6ecf32a570694dcff91c1c72f98306a9390e
tree6f2b8a6cd5bd5c4c24a80459d052d1c4f348853d
parent80e7c5414423d633f11ec93a7990915e97489502
Add common UTF-8 first byte to ANYOFH regnodes

An ANYOFH regnode is generated instead of a plain ANYOF one when
nothing it can match is in the bitmap used in ANYOF nodes.  It is
therefore smaller as the 4 word (or more) bitmap is omitted.

This means that for it to match a target string, that string must be
UTF-8 (since the bitmap is for at least the lowest 256 code points).
And only in rare circumstances are there any flags associated with it in
the regnode flags field.

This commit changes things so that the flags field in an ANYOFH node is
repurposed to be the first UTF-8 encoded byte of every code point
matched by the class if there is a common byte for all of them; or 0 if
some have different first bytes.

(That means that those rare cases where the flags field isn't otherwise
empty can no longer be ANYOFH nodes.)

The purpose of this is so that a future commit can take advantage of
this, and more quickly scan the target string for places that this node
can match.  A problem with ANYOF nodes is that they are code point
oriented (U32 or U64), and the target string is UTF-8, so conversion has
to be done.  By having the partial conversion compiled in, we can look
for that at runtime instead of having to look at every character in the
scan.
pod/perldebguts.pod
regcomp.c
regcomp.sym
regexec.c
regnodes.h
t/re/anyof.t