regcomp.c: Remove redundant matching possibilities
authorKarl Williamson <public@khwilliamson.com>
Sun, 21 Jul 2013 16:10:56 +0000 (10:10 -0600)
committerKarl Williamson <public@khwilliamson.com>
Tue, 24 Sep 2013 17:36:11 +0000 (11:36 -0600)
The flag ANYOF_UNICODE_ALL is for performance.  It is set when the
inversion list for the ANYOF node includes every code point above
Latin1, and avoids runtime searching through the list.  We don't need
both, as the flag being set short-circuits even looking at the other
list.  By removing the code points from the list, we perhaps will get
rid of the list entirely, thus saving some operations, or will shorten
it so that later binary searches run faster.

regcomp.c

index 3a17cc6..f5064a9 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -13982,10 +13982,14 @@ parseit:
        invlist_iterfinish(cp_list);
 
         /* Done with loop; remove any code points that are in the bitmap from
-         * <cp_list> */
+         * <cp_list>; similarly for code points above latin1 if we have a flag
+         * to match all of them anyways */
        if (change_invlist) {
            _invlist_subtract(cp_list, PL_Latin1, &cp_list);
        }
+        if (ANYOF_FLAGS(ret) & ANYOF_UNICODE_ALL) {
+           _invlist_intersection(cp_list, PL_Latin1, &cp_list);
+       }
 
        /* If have completely emptied it, remove it completely */
        if (_invlist_len(cp_list) == 0) {