Fixed an issue in the backtracking optimization of character repeats in JIT (#135)
This commit is contained in:
parent
3e52db5209
commit
4851890ede
|
@ -29,6 +29,9 @@ supported (even though that function would do nothing in that case) at the
|
||||||
request of a user who doesn't even want to link with pcre_jit_compile.o. Also
|
request of a user who doesn't even want to link with pcre_jit_compile.o. Also
|
||||||
tidied up an untidy #ifdef arrangement in pcre2test.
|
tidied up an untidy #ifdef arrangement in pcre2test.
|
||||||
|
|
||||||
|
8. Fixed an issue in the backtracking optimization of character repeats in
|
||||||
|
JIT. Furthermore optimize star repetitions, not just plus repetitions.
|
||||||
|
|
||||||
|
|
||||||
Version 10.40 15-April-2022
|
Version 10.40 15-April-2022
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
|
@ -11517,20 +11517,20 @@ if (exact > 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (exact == 1)
|
else if (exact == 1)
|
||||||
{
|
|
||||||
compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
|
compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
|
||||||
|
|
||||||
if (early_fail_type == type_fail_range)
|
if (early_fail_type == type_fail_range)
|
||||||
{
|
{
|
||||||
|
/* Range end first, followed by range start. */
|
||||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr);
|
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr);
|
||||||
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw));
|
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw));
|
||||||
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, TMP2, 0);
|
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, TMP2, 0);
|
||||||
OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, TMP2, 0);
|
OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, TMP2, 0);
|
||||||
add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
|
add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
|
||||||
|
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
|
||||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw), STR_PTR, 0);
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + (int)sizeof(sljit_sw), STR_PTR, 0);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
switch(opcode)
|
switch(opcode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -354,6 +354,7 @@ static struct regression_test_case regression_test_cases[] = {
|
||||||
{ MU, A, 0, 0, "_[ab]+_*a", "_aa" },
|
{ MU, A, 0, 0, "_[ab]+_*a", "_aa" },
|
||||||
{ MU, A, 0, 0, "#(A+)#\\d+", "#A#A#0" },
|
{ MU, A, 0, 0, "#(A+)#\\d+", "#A#A#0" },
|
||||||
{ MU, A, 0, 0, "(?P<size>\\d+)m|M", "4M" },
|
{ MU, A, 0, 0, "(?P<size>\\d+)m|M", "4M" },
|
||||||
|
{ M, PCRE2_NEWLINE_CRLF, 0, 0, "\\n?.+#", "\n,\n,#" },
|
||||||
|
|
||||||
/* Bracket repeats with limit. */
|
/* Bracket repeats with limit. */
|
||||||
{ MU, A, 0, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
|
{ MU, A, 0, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
|
||||||
|
|
Loading…
Reference in New Issue