Skip to content

Commit ba41b5d

Browse files
committed
Improve hexdigit and any class checks in JIT
1 parent ea4bb21 commit ba41b5d

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/pcre2_jit_compile.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7688,6 +7688,8 @@ while (*cc != XCL_END)
76887688
/* Any either accepts everything or ignored. */
76897689
if (cc[-1] == XCL_PROP)
76907690
items = UCPCAT_ALL;
7691+
else
7692+
compares--;
76917693
break;
76927694

76937695
case PT_LAMP:
@@ -7764,7 +7766,6 @@ while (*cc != XCL_END)
77647766
}
77657767
#endif /* SUPPORT_UNICODE */
77667768
}
7767-
SLJIT_ASSERT(compares > 0 || category_list > 0);
77687769

77697770
#ifdef SUPPORT_UNICODE
77707771
if (category_list == UCPCAT_ALL)
@@ -7775,6 +7776,17 @@ if (category_list == UCPCAT_ALL)
77757776
add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
77767777
return;
77777778
}
7779+
7780+
if (compares == 0 && category_list == 0)
7781+
{
7782+
/* No characters are accepted, same as (*F) or dotall. */
7783+
compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
7784+
if (list != backtracks)
7785+
add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
7786+
return;
7787+
}
7788+
#else /* !SUPPORT_UNICODE */
7789+
SLJIT_ASSERT(compares > 0);
77787790
#endif /* SUPPORT_UNICODE */
77797791

77807792
/* We are not necessary in utf mode even in 8 bit mode. */
@@ -8167,10 +8179,6 @@ while (*cc != XCL_END)
81678179
switch(*cc)
81688180
{
81698181
case PT_ANY:
8170-
if (!invertcmp)
8171-
jump = JUMP(SLJIT_JUMP);
8172-
break;
8173-
81748182
case PT_LAMP:
81758183
case PT_GC:
81768184
case PT_PC:
@@ -8334,16 +8342,13 @@ while (*cc != XCL_END)
83348342
break;
83358343

83368344
case PT_PXXDIGIT:
8337-
SET_CHAR_OFFSET(CHAR_0);
8338-
OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_9 - CHAR_0);
8339-
OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
8340-
83418345
SET_CHAR_OFFSET(CHAR_A);
8342-
OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_F - CHAR_A);
8343-
OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
8346+
OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, ~0x20);
8347+
OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP2, 0, SLJIT_IMM, CHAR_F - CHAR_A);
8348+
OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);
83448349

8345-
SET_CHAR_OFFSET(CHAR_a);
8346-
OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_f - CHAR_a);
8350+
SET_CHAR_OFFSET(CHAR_0);
8351+
OP2U(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_9 - CHAR_0);
83478352
OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);
83488353

83498354
SET_CHAR_OFFSET(0xff10);
@@ -8379,6 +8384,7 @@ while (*cc != XCL_END)
83798384
add_jump(compiler, compares > 0 ? list : backtracks, jump);
83808385
}
83818386

8387+
SLJIT_ASSERT(compares == 0);
83828388
if (found != NULL)
83838389
set_jumps(found, LABEL());
83848390
}

0 commit comments

Comments
 (0)