This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Prefer EXACTish regnodes to ANYOFH nodes
authorKarl Williamson <khw@cpan.org>
Wed, 18 Sep 2019 19:12:51 +0000 (13:12 -0600)
committerKarl Williamson <khw@cpan.org>
Mon, 18 Nov 2019 03:34:24 +0000 (20:34 -0700)
commit1a9f5e2a7e9a7e40d7728d318182a61d39976d95
tree42d34d093cb5311c01a11e42c1cfbe3e75ddf5b2
parent5d7580af4b14229eafb27db9b7a34b8b918876b4
Prefer EXACTish regnodes to ANYOFH nodes

ANYOFH nodes (that match code points above 255) are smaller than regular
ANYOF nodes because they don't have a 256-bit bitmap.  But the
disadvantage of them over EXACT nodes is that the characters encountered
must first be converted from UTF-8 to code point to see if they match
the ANYOFH.  (The difference is less clearcut with /i, because typically,
currently, the UTF-8 must be converted to code point anyway in order to
fold them.)  But the EXACTFish node doesn't have an inversion list to do
lookup in, and occupies less space, because it doesn't have inversion
list data attached to it.

Also there is a bug in using ANYOFH under /l, as wide character warnings
should be emitted if the locale isn't a UTF-8 one.

The reason this change hasn't been made before (by me anyway) is that
the old way avoided upgrading the pattern to UTF-8.  But having thought
about this for a long time, to match this node, the target string must
be in UTF-8 anyway, and having a UTF8ness mismatch slows down pattern
matching, as things have to be continually converted, and reconverted
after backtracking.
regcomp.c
t/re/anyof.t
t/re/pat_advanced.t