aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Herczeg <hzmester@freemail.hu>2023-12-30 05:46:46 +0000
committerZoltan Herczeg <hzmester@freemail.hu>2023-12-30 05:46:46 +0000
commitba41b5da3bc6f870a37b3776da352dd3127c694a (patch)
tree514d86089b1a93dbe85ba9a41a5b0e63724091ab
parentea4bb21daa5e2e3d587432ea921ef40d4efeb3e6 (diff)
downloadpcre-ba41b5da3bc6f870a37b3776da352dd3127c694a.tar.gz
Improve hexdigit and any class checks in JIT
-rw-r--r--src/pcre2_jit_compile.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c
index d490d776..83b68c4b 100644
--- a/src/pcre2_jit_compile.c
+++ b/src/pcre2_jit_compile.c
@@ -7688,6 +7688,8 @@ while (*cc != XCL_END)
/* Any either accepts everything or ignored. */
if (cc[-1] == XCL_PROP)
items = UCPCAT_ALL;
+ else
+ compares--;
break;
case PT_LAMP:
@@ -7764,7 +7766,6 @@ while (*cc != XCL_END)
}
#endif /* SUPPORT_UNICODE */
}
-SLJIT_ASSERT(compares > 0 || category_list > 0);
#ifdef SUPPORT_UNICODE
if (category_list == UCPCAT_ALL)
@@ -7775,6 +7776,17 @@ if (category_list == UCPCAT_ALL)
add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
return;
}
+
+if (compares == 0 && category_list == 0)
+ {
+ /* No characters are accepted, same as (*F) or dotall. */
+ compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
+ if (list != backtracks)
+ add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
+ return;
+ }
+#else /* !SUPPORT_UNICODE */
+SLJIT_ASSERT(compares > 0);
#endif /* SUPPORT_UNICODE */
/* We are not necessary in utf mode even in 8 bit mode. */
@@ -8167,10 +8179,6 @@ while (*cc != XCL_END)
switch(*cc)
{
case PT_ANY:
- if (!invertcmp)
- jump = JUMP(SLJIT_JUMP);
- break;
-
case PT_LAMP:
case PT_GC:
case PT_PC:
@@ -8334,16 +8342,13 @@ while (*cc != XCL_END)
break;
case PT_PXXDIGIT:
- SET_CHAR_OFFSET(CHAR_0);
- OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_9 - CHAR_0);
- OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
-
SET_CHAR_OFFSET(CHAR_A);
- OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_F - CHAR_A);
- OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
+ OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, ~0x20);
+ OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP2, 0, SLJIT_IMM, CHAR_F - CHAR_A);
+ OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
- SET_CHAR_OFFSET(CHAR_a);
- OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_f - CHAR_a);
+ SET_CHAR_OFFSET(CHAR_0);
+ OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_9 - CHAR_0);
OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
SET_CHAR_OFFSET(0xff10);
@@ -8379,6 +8384,7 @@ while (*cc != XCL_END)
add_jump(compiler, compares > 0 ? list : backtracks, jump);
}
+SLJIT_ASSERT(compares == 0);
if (found != NULL)
set_jumps(found, LABEL());
}