This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add ANYOFRb regnode
authorKarl Williamson <khw@cpan.org>
Sat, 21 Sep 2019 15:51:52 +0000 (09:51 -0600)
committerKarl Williamson <khw@cpan.org>
Mon, 18 Nov 2019 04:20:07 +0000 (21:20 -0700)
commit2d5613be2139e3ec2e5cf6a54ecbae6ba8b3a1e0
tree1859d23b3dfab71ab0416d4e0d7746b4db5ac8a1
parent13fcf6522466471a1b1c5fc2d760dd5367fd8940
Add ANYOFRb regnode

This is like the ANYOFR regnode added in the previous commit, but all
code points in the range it matches are known to have the same first
UTF-8 start byte.  That means it can't match UTF-8 invariant characters,
like ASCII, because the "start" byte is different on each one, so it
could only match a range of 1, and the compiler wouldn't generate this
node for that; instead using an EXACT.

Pattern matching can rule out most code points by looking at the first
character of their UTF-8 representation, before having to convert from
UTF-8.

On ASCII this rules out all but 64 2-byte UTF-8 characters from this
simple comparison.  3-byte it's up to 4096, and 4-byte, 2**18, so the
test is less effective for higher code points.

I believe that most UTF-8 patterns that otherwise would compile to
ANYOFR will instead compile to this, as I can't envision real life
applications wanting to match large single ranges.  Even the 2048
surrogates all have the same first byte.
pod/perldebguts.pod
regcomp.c
regcomp.sym
regexec.c
regnodes.h
t/re/anyof.t