Skip to content

Commit ff375d6

Browse files
authored
Fix xclass compilation (#646)
1 parent c36b2fb commit ff375d6

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

src/pcre2_jit_char_inc.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ jump_list **list = (cc[0] & XCL_NOT) == 0 ? &found : backtracks;
507507
sljit_uw c, charoffset;
508508
sljit_u32 max = READ_CHAR_MAX, min = 0;
509509
struct sljit_jump *jump = NULL;
510+
PCRE2_UCHAR flags;
510511
PCRE2_SPTR ccbegin;
511512
sljit_u32 compares, invertcmp, depth;
512513
sljit_u32 first_item, last_item, mid_item;
@@ -522,11 +523,11 @@ int typereg = TMP1;
522523

523524
SLJIT_ASSERT(common->locals_size >= SSIZE_OF(sw));
524525
/* Scanning the necessary info. */
525-
cc++;
526+
flags = *cc++;
526527
ccbegin = cc;
527528
compares = 0;
528529

529-
if (cc[-1] & XCL_MAP)
530+
if (flags & XCL_MAP)
530531
cc += 32 / sizeof(PCRE2_UCHAR);
531532

532533
#ifdef SUPPORT_UNICODE
@@ -638,7 +639,7 @@ if (*cc != XCL_END)
638639
{
639640
SLJIT_ASSERT(category_list == 0);
640641
max = 0;
641-
min = (ccbegin[-1] & XCL_MAP) != 0 ? 0 : READ_CHAR_MAX;
642+
min = (flags & XCL_MAP) != 0 ? 0 : READ_CHAR_MAX;
642643
xclass_update_min_max(common, cc, &min, &max);
643644
}
644645
#endif
@@ -658,7 +659,7 @@ SLJIT_ASSERT(compares > 0);
658659
cc = ccbegin;
659660
if (!(status & XCLASS_IS_ECLASS))
660661
{
661-
if ((cc[-1] & XCL_NOT) != 0)
662+
if ((flags & XCL_NOT) != 0)
662663
read_char(common, min, max, backtracks, READ_CHAR_UPDATE_STR_PTR);
663664
else
664665
{
@@ -670,7 +671,7 @@ if (!(status & XCLASS_IS_ECLASS))
670671
}
671672
}
672673

673-
if ((cc[-1] & XCL_MAP) != 0)
674+
if ((flags & XCL_MAP) != 0)
674675
{
675676
SLJIT_ASSERT(!(status & XCLASS_IS_ECLASS));
676677
xclass_check_bitset(common, (const sljit_u8 *)cc, &found, backtracks);
@@ -1092,10 +1093,14 @@ if (ranges.range_count == 2)
10921093
}
10931094

10941095
range_start = ranges.ranges[0];
1095-
range_end = ranges.ranges[ranges.range_count - 1];
10961096
SET_CHAR_OFFSET(range_start);
1097-
add_jump(compiler, (ccbegin[-1] & XCL_NOT) == 0 ? backtracks : &found,
1098-
CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, (sljit_sw)(range_end - range_start)));
1097+
if (ranges.range_count >= 6)
1098+
{
1099+
/* Early fail. */
1100+
range_end = ranges.ranges[ranges.range_count - 1];
1101+
add_jump(compiler, (flags & XCL_NOT) == 0 ? backtracks : &found,
1102+
CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, (sljit_sw)(range_end - range_start)));
1103+
}
10991104

11001105
depth = 0;
11011106
first_item = 0;

src/pcre2_jit_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ static struct regression_test_case regression_test_cases[] = {
428428
{ MUP, 0, 0, 0 | F_NOMATCH, "[^[:print:]\\x{f6f6}]", "\xef\x9b\xb6" },
429429
{ MUP, 0, 0, 0, "[[:xdigit:]\\x{6500}]#", "\xe6\x94\x80#" },
430430
{ MUP, 0, 0, 0 | F_PROPERTY, "[\\pC\\PC]#", "A#" },
431+
{ MUP, 0, 0, 0 | F_PROPERTY, "[\\x80-\\xff\\x{800}\\x{802}\\x{804}\\p{Cc}]", "\xdf\xbf\xe0\xa0\x80" },
431432

432433
/* Possible empty brackets. */
433434
{ MU, A, 0, 0, "(?:|ab||bc|a)+d", "abcxabcabd" },

0 commit comments

Comments
 (0)