Skip to content

Commit 266325f

Browse files
authored
Improve iterator backtrack handling (#642)
Previous backtracks can be used for escaping iterators. Don't allocate backtrack data when unnecessary.
1 parent 3b11f31 commit 266325f

File tree

1 file changed

+53
-59
lines changed

1 file changed

+53
-59
lines changed

src/pcre2_jit_compile.c

Lines changed: 53 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -313,14 +313,12 @@ typedef struct char_iterator_backtrack {
313313
backtrack_common common;
314314
/* Next iteration. */
315315
struct sljit_label *matchingpath;
316-
union {
317-
jump_list *backtracks;
318-
struct {
319-
unsigned int othercasebit;
320-
PCRE2_UCHAR chr;
321-
} charpos;
322-
} u;
323-
BOOL charpos_enabled;
316+
/* Creating a range based on the next character. */
317+
struct {
318+
unsigned int othercasebit;
319+
PCRE2_UCHAR chr;
320+
BOOL charpos_enabled;
321+
} charpos;
324322
} char_iterator_backtrack;
325323

326324
typedef struct ref_iterator_backtrack {
@@ -10535,10 +10533,11 @@ if (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc);
1053510533
return cc;
1053610534
}
1053710535

10538-
static PCRE2_SPTR compile_iterator_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
10536+
static PCRE2_SPTR compile_iterator_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent, jump_list **prev_backtracks)
1053910537
{
1054010538
DEFINE_COMPILER;
10541-
backtrack_common *backtrack;
10539+
backtrack_common *backtrack = NULL;
10540+
PCRE2_SPTR begin = cc;
1054210541
PCRE2_UCHAR opcode;
1054310542
PCRE2_UCHAR type;
1054410543
sljit_u32 max = 0, exact;
@@ -10558,8 +10557,6 @@ int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;
1055810557
int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + SSIZE_OF(sw);
1055910558
int tmp_base, tmp_offset;
1056010559

10561-
PUSH_BACKTRACK(sizeof(char_iterator_backtrack), cc, NULL);
10562-
1056310560
early_fail_type = (early_fail_ptr & 0x7);
1056410561
early_fail_ptr >>= 3;
1056510562

@@ -10574,7 +10571,7 @@ SLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || early_fail_ptr == 0
1057410571
|| (early_fail_ptr >= common->early_fail_start_ptr && early_fail_ptr <= common->early_fail_end_ptr));
1057510572

1057610573
if (early_fail_type == type_fail)
10577-
add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr));
10574+
add_jump(compiler, prev_backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr));
1057810575

1057910576
cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
1058010577

@@ -10600,7 +10597,7 @@ if (opcode == OP_EXACT)
1060010597
&& type != OP_ANYNL && type != OP_EXTUNI)
1060110598
{
1060210599
OP2(SLJIT_SUB, TMP1, 0, STR_END, 0, STR_PTR, 0);
10603-
add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, IN_UCHARS(exact)));
10600+
add_jump(compiler, prev_backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, IN_UCHARS(exact)));
1060410601

1060510602
#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 32
1060610603
if (type == OP_ALLANY && !common->invalid_utf)
@@ -10612,7 +10609,7 @@ if (opcode == OP_EXACT)
1061210609
{
1061310610
OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
1061410611
label = LABEL();
10615-
compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, FALSE);
10612+
compile_char1_matchingpath(common, type, cc, prev_backtracks, FALSE);
1061610613
OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
1061710614
JUMPTO(SLJIT_NOT_ZERO, label);
1061810615
}
@@ -10622,7 +10619,7 @@ if (opcode == OP_EXACT)
1062210619
SLJIT_ASSERT(tmp_base == TMP3 || common->locals_size >= 3 * SSIZE_OF(sw));
1062310620
OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
1062410621
label = LABEL();
10625-
compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
10622+
compile_char1_matchingpath(common, type, cc, prev_backtracks, TRUE);
1062610623
OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
1062710624
JUMPTO(SLJIT_NOT_ZERO, label);
1062810625
}
@@ -10635,17 +10632,20 @@ if (early_fail_type == type_fail_range)
1063510632
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + SSIZE_OF(sw));
1063610633
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, TMP2, 0);
1063710634
OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, TMP2, 0);
10638-
add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
10635+
add_jump(compiler, prev_backtracks, CMP(SLJIT_LESS_EQUAL, TMP2, 0, TMP1, 0));
1063910636

1064010637
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
1064110638
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr + SSIZE_OF(sw), STR_PTR, 0);
1064210639
}
1064310640

10641+
if (opcode < OP_EXACT)
10642+
PUSH_BACKTRACK(sizeof(char_iterator_backtrack), begin, NULL);
10643+
1064410644
switch(opcode)
1064510645
{
1064610646
case OP_STAR:
1064710647
case OP_UPTO:
10648-
SLJIT_ASSERT(early_fail_ptr == 0 || opcode == OP_STAR);
10648+
SLJIT_ASSERT(backtrack != NULL && (early_fail_ptr == 0 || opcode == OP_STAR));
1064910649
max += exact;
1065010650

1065110651
if (type == OP_EXTUNI)
@@ -10676,7 +10676,7 @@ switch(opcode)
1067610676
}
1067710677

1067810678
label = LABEL();
10679-
compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
10679+
compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
1068010680
if (opcode == OP_UPTO)
1068110681
{
1068210682
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCAL2);
@@ -10703,7 +10703,7 @@ switch(opcode)
1070310703
if (opcode == OP_STAR)
1070410704
{
1070510705
if (exact == 1)
10706-
detect_partial_match(common, &backtrack->own_backtracks);
10706+
detect_partial_match(common, prev_backtracks);
1070710707

1070810708
if (private_data_ptr == 0)
1070910709
allocate_stack(common, 2);
@@ -10789,9 +10789,9 @@ switch(opcode)
1078910789
if (charpos_othercasebit != 0)
1079010790
charpos_char |= charpos_othercasebit;
1079110791

10792-
BACKTRACK_AS(char_iterator_backtrack)->charpos_enabled = TRUE;
10793-
BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char;
10794-
BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit;
10792+
BACKTRACK_AS(char_iterator_backtrack)->charpos.charpos_enabled = TRUE;
10793+
BACKTRACK_AS(char_iterator_backtrack)->charpos.chr = charpos_char;
10794+
BACKTRACK_AS(char_iterator_backtrack)->charpos.othercasebit = charpos_othercasebit;
1079510795

1079610796
if (private_data_ptr == 0)
1079710797
allocate_stack(common, 2);
@@ -10988,11 +10988,11 @@ switch(opcode)
1098810988
else
1098910989
jump = CMP(SLJIT_GREATER, TMP3, 0, SLJIT_IMM, max - exact);
1099010990

10991-
add_jump(compiler, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, jump);
10991+
add_jump(compiler, &backtrack->own_backtracks, jump);
1099210992
}
1099310993
}
1099410994
else if (exact == 1)
10995-
add_jump(compiler, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, CMP(SLJIT_EQUAL, base, offset1, STR_PTR, 0));
10995+
add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_EQUAL, base, offset1, STR_PTR, 0));
1099610996

1099710997
if (early_fail_ptr != 0)
1099810998
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
@@ -11001,17 +11001,17 @@ switch(opcode)
1100111001
break;
1100211002

1100311003
case OP_QUERY:
11004-
SLJIT_ASSERT(early_fail_ptr == 0);
11004+
SLJIT_ASSERT(backtrack != NULL && early_fail_ptr == 0);
1100511005
if (private_data_ptr == 0)
1100611006
allocate_stack(common, 1);
1100711007
OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
11008-
compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
11008+
compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
1100911009
BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
1101011010
break;
1101111011

1101211012
case OP_MINSTAR:
1101311013
case OP_MINQUERY:
11014-
SLJIT_ASSERT(opcode == OP_MINSTAR || early_fail_ptr == 0);
11014+
SLJIT_ASSERT(backtrack != NULL && (opcode == OP_MINSTAR || early_fail_ptr == 0));
1101511015
if (private_data_ptr == 0)
1101611016
allocate_stack(common, 1);
1101711017

@@ -11030,7 +11030,7 @@ switch(opcode)
1103011030
label = LABEL();
1103111031
BACKTRACK_AS(char_iterator_backtrack)->matchingpath = label;
1103211032

11033-
compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
11033+
compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
1103411034

1103511035
if (exact >= 2)
1103611036
{
@@ -11054,7 +11054,7 @@ switch(opcode)
1105411054
break;
1105511055

1105611056
case OP_MINUPTO:
11057-
SLJIT_ASSERT(early_fail_ptr == 0);
11057+
SLJIT_ASSERT(backtrack != NULL && early_fail_ptr == 0);
1105811058
if (private_data_ptr == 0)
1105911059
allocate_stack(common, 2);
1106011060

@@ -11077,7 +11077,7 @@ switch(opcode)
1107711077
label = LABEL();
1107811078
BACKTRACK_AS(char_iterator_backtrack)->matchingpath = label;
1107911079

11080-
compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
11080+
compile_char1_matchingpath(common, type, cc, &backtrack->own_backtracks, TRUE);
1108111081

1108211082
if (exact >= 2)
1108311083
{
@@ -11089,17 +11089,19 @@ switch(opcode)
1108911089
break;
1109011090

1109111091
case OP_EXACT:
11092+
SLJIT_ASSERT(backtrack == NULL);
1109211093
break;
1109311094

1109411095
case OP_POSSTAR:
11096+
SLJIT_ASSERT(backtrack == NULL);
1109511097
#if defined SUPPORT_UNICODE
1109611098
if (type == OP_ALLANY && !common->invalid_utf)
1109711099
#else
1109811100
if (type == OP_ALLANY)
1109911101
#endif
1110011102
{
1110111103
if (exact == 1)
11102-
detect_partial_match(common, &backtrack->own_backtracks);
11104+
detect_partial_match(common, prev_backtracks);
1110311105

1110411106
OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
1110511107
process_partial_match(common);
@@ -11133,7 +11135,7 @@ switch(opcode)
1113311135
OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LOCAL2);
1113411136

1113511137
if (exact == 1)
11136-
add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0));
11138+
add_jump(compiler, prev_backtracks, CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0));
1113711139

1113811140
if (early_fail_ptr != 0)
1113911141
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
@@ -11160,14 +11162,14 @@ switch(opcode)
1116011162
set_jumps(no_match, LABEL());
1116111163

1116211164
if (exact == 1)
11163-
add_jump(compiler, &backtrack->own_backtracks, CMP(SLJIT_EQUAL, tmp_base, tmp_offset, STR_PTR, 0));
11165+
add_jump(compiler, prev_backtracks, CMP(SLJIT_EQUAL, tmp_base, tmp_offset, STR_PTR, 0));
1116411166

1116511167
if (early_fail_ptr != 0)
1116611168
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), early_fail_ptr, STR_PTR, 0);
1116711169
break;
1116811170

1116911171
case OP_POSUPTO:
11170-
SLJIT_ASSERT(early_fail_ptr == 0);
11172+
SLJIT_ASSERT(backtrack == NULL && early_fail_ptr == 0);
1117111173
max += exact;
1117211174

1117311175
#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
@@ -11212,7 +11214,7 @@ switch(opcode)
1121211214
OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LOCAL2);
1121311215

1121411216
if (exact > 0)
11215-
add_jump(compiler, &backtrack->own_backtracks, JUMP(exact == max ? SLJIT_LESS : SLJIT_GREATER));
11217+
add_jump(compiler, prev_backtracks, JUMP(exact == max ? SLJIT_LESS : SLJIT_GREATER));
1121611218
OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
1121711219
break;
1121811220
}
@@ -11246,12 +11248,12 @@ switch(opcode)
1124611248
else
1124711249
jump = CMP(SLJIT_GREATER, TMP3, 0, SLJIT_IMM, max - exact);
1124811250

11249-
add_jump(compiler, &backtrack->own_backtracks, jump);
11251+
add_jump(compiler, prev_backtracks, jump);
1125011252
}
1125111253
break;
1125211254

1125311255
case OP_POSQUERY:
11254-
SLJIT_ASSERT(early_fail_ptr == 0);
11256+
SLJIT_ASSERT(backtrack == NULL && early_fail_ptr == 0);
1125511257
SLJIT_ASSERT(tmp_base == TMP3 || common->locals_size >= 3 * SSIZE_OF(sw));
1125611258
OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
1125711259
compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
@@ -11551,13 +11553,13 @@ while (cc < ccend)
1155111553
case OP_TYPEPOSPLUS:
1155211554
case OP_TYPEPOSQUERY:
1155311555
case OP_TYPEPOSUPTO:
11554-
cc = compile_iterator_matchingpath(common, cc, parent);
11556+
cc = compile_iterator_matchingpath(common, cc, parent, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks);
1155511557
break;
1155611558

1155711559
case OP_CLASS:
1155811560
case OP_NCLASS:
1155911561
if (cc[1 + (32 / sizeof(PCRE2_UCHAR))] >= OP_CRSTAR && cc[1 + (32 / sizeof(PCRE2_UCHAR))] <= OP_CRPOSRANGE)
11560-
cc = compile_iterator_matchingpath(common, cc, parent);
11562+
cc = compile_iterator_matchingpath(common, cc, parent, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks);
1156111563
else
1156211564
cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE);
1156311565
break;
@@ -11567,7 +11569,7 @@ while (cc < ccend)
1156711569
case OP_ECLASS:
1156811570
op_len = GET(cc, 1);
1156911571
if (cc[op_len] >= OP_CRSTAR && cc[op_len] <= OP_CRPOSRANGE)
11570-
cc = compile_iterator_matchingpath(common, cc, parent);
11572+
cc = compile_iterator_matchingpath(common, cc, parent, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks);
1157111573
else
1157211574
cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->simple_backtracks : &parent->own_backtracks, TRUE);
1157311575
break;
@@ -11794,14 +11796,14 @@ switch(opcode)
1179411796
if (type == OP_EXTUNI)
1179511797
{
1179611798
SLJIT_ASSERT(private_data_ptr == 0);
11797-
set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
11799+
set_jumps(current->own_backtracks, LABEL());
1179811800
OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
1179911801
free_stack(common, 1);
1180011802
CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
1180111803
}
1180211804
else
1180311805
{
11804-
if (CURRENT_AS(char_iterator_backtrack)->charpos_enabled)
11806+
if (CURRENT_AS(char_iterator_backtrack)->charpos.charpos_enabled)
1180511807
{
1180611808
OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
1180711809
OP1(SLJIT_MOV, TMP2, 0, base, offset1);
@@ -11813,9 +11815,9 @@ switch(opcode)
1181311815
move_back(common, NULL, TRUE);
1181411816

1181511817
OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
11816-
if (CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit != 0)
11817-
OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit);
11818-
CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath);
11818+
if (CURRENT_AS(char_iterator_backtrack)->charpos.othercasebit != 0)
11819+
OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->charpos.othercasebit);
11820+
CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath);
1181911821
/* The range beginning must match, no need to compare. */
1182011822
JUMPTO(SLJIT_JUMP, label);
1182111823

@@ -11854,7 +11856,7 @@ switch(opcode)
1185411856
OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
1185511857
JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
1185611858

11857-
set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
11859+
set_jumps(current->own_backtracks, LABEL());
1185811860
}
1185911861

1186011862
JUMPHERE(jump);
@@ -11868,7 +11870,7 @@ switch(opcode)
1186811870
OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
1186911871
CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
1187011872
jump = JUMP(SLJIT_JUMP);
11871-
set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
11873+
set_jumps(current->own_backtracks, LABEL());
1187211874
OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
1187311875
OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
1187411876
JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
@@ -11888,7 +11890,7 @@ switch(opcode)
1188811890
OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 1);
1188911891

1189011892
JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
11891-
set_jumps(exact > 0 ? CURRENT_AS(char_iterator_backtrack)->u.backtracks : jumplist, LABEL());
11893+
set_jumps(exact > 0 ? current->own_backtracks : jumplist, LABEL());
1189211894
if (private_data_ptr == 0)
1189311895
free_stack(common, 1);
1189411896
break;
@@ -11916,7 +11918,7 @@ switch(opcode)
1191611918
OP1(SLJIT_MOV, base, offset1, TMP1, 0);
1191711919
JUMPTO(SLJIT_NOT_ZERO, CURRENT_AS(char_iterator_backtrack)->matchingpath);
1191811920

11919-
set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
11921+
set_jumps(current->own_backtracks, LABEL());
1192011922
}
1192111923

1192211924
if (private_data_ptr == 0)
@@ -11932,7 +11934,7 @@ switch(opcode)
1193211934
if (exact >= 2)
1193311935
OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 1);
1193411936
CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
11935-
set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
11937+
set_jumps(current->own_backtracks, LABEL());
1193611938
}
1193711939
else
1193811940
{
@@ -11947,18 +11949,10 @@ switch(opcode)
1194711949
free_stack(common, 1);
1194811950
break;
1194911951

11950-
case OP_EXACT:
11951-
case OP_POSSTAR:
11952-
case OP_POSQUERY:
11953-
case OP_POSUPTO:
11954-
break;
11955-
1195611952
default:
1195711953
SLJIT_UNREACHABLE();
1195811954
break;
1195911955
}
11960-
11961-
set_jumps(current->own_backtracks, LABEL());
1196211956
}
1196311957

1196411958
static SLJIT_INLINE void compile_ref_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)

0 commit comments

Comments
 (0)