@@ -449,20 +449,20 @@ do { \
449
449
DATA_STACK_LOOKUP_AT(state,t,p,pos)
450
450
451
451
#define MARK_PUSH (lastmark ) \
452
- do if (lastmark > 0) { \
452
+ do if (lastmark >= 0) { \
453
453
i = lastmark; /* ctx->lastmark may change if reallocated */ \
454
454
DATA_STACK_PUSH (state , state -> mark , (i + 1 )* sizeof (void * )); \
455
455
} while (0 )
456
456
#define MARK_POP (lastmark ) \
457
- do if (lastmark > 0) { \
457
+ do if (lastmark >= 0) { \
458
458
DATA_STACK_POP(state, state->mark, (lastmark+1)*sizeof(void*), 1); \
459
459
} while (0)
460
460
#define MARK_POP_KEEP (lastmark ) \
461
- do if (lastmark > 0) { \
461
+ do if (lastmark >= 0) { \
462
462
DATA_STACK_POP(state, state->mark, (lastmark+1)*sizeof(void*), 0); \
463
463
} while (0)
464
464
#define MARK_POP_DISCARD (lastmark ) \
465
- do if (lastmark > 0) { \
465
+ do if (lastmark >= 0) { \
466
466
DATA_STACK_POP_DISCARD(state, (lastmark+1)*sizeof(void*)); \
467
467
} while (0)
468
468
@@ -770,8 +770,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
770
770
/* <BRANCH> <0=skip> code <JUMP> ... <NULL> */
771
771
TRACE (("|%p|%p|BRANCH\n" , ctx -> pattern , ctx -> ptr ));
772
772
LASTMARK_SAVE ();
773
- ctx -> u .rep = state -> repeat ;
774
- if (ctx -> u .rep )
773
+ if (state -> repeat )
775
774
MARK_PUSH (ctx -> lastmark );
776
775
for (; ctx -> pattern [0 ]; ctx -> pattern += ctx -> pattern [0 ]) {
777
776
if (ctx -> pattern [1 ] == SRE_OP_LITERAL &&
@@ -786,16 +785,16 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
786
785
state -> ptr = ctx -> ptr ;
787
786
DO_JUMP (JUMP_BRANCH , jump_branch , ctx -> pattern + 1 );
788
787
if (ret ) {
789
- if (ctx -> u . rep )
788
+ if (state -> repeat )
790
789
MARK_POP_DISCARD (ctx -> lastmark );
791
790
RETURN_ON_ERROR (ret );
792
791
RETURN_SUCCESS ;
793
792
}
794
- if (ctx -> u . rep )
793
+ if (state -> repeat )
795
794
MARK_POP_KEEP (ctx -> lastmark );
796
795
LASTMARK_RESTORE ();
797
796
}
798
- if (ctx -> u . rep )
797
+ if (state -> repeat )
799
798
MARK_POP_DISCARD (ctx -> lastmark );
800
799
RETURN_FAILURE ;
801
800
@@ -841,6 +840,8 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
841
840
}
842
841
843
842
LASTMARK_SAVE ();
843
+ if (state -> repeat )
844
+ MARK_PUSH (ctx -> lastmark );
844
845
845
846
if (ctx -> pattern [ctx -> pattern [0 ]] == SRE_OP_LITERAL ) {
846
847
/* tail starts with a literal. skip positions where
@@ -858,30 +859,41 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
858
859
DO_JUMP (JUMP_REPEAT_ONE_1 , jump_repeat_one_1 ,
859
860
ctx -> pattern + ctx -> pattern [0 ]);
860
861
if (ret ) {
862
+ if (state -> repeat )
863
+ MARK_POP_DISCARD (ctx -> lastmark );
861
864
RETURN_ON_ERROR (ret );
862
865
RETURN_SUCCESS ;
863
866
}
864
-
867
+ if (state -> repeat )
868
+ MARK_POP_KEEP (ctx -> lastmark );
865
869
LASTMARK_RESTORE ();
866
870
867
871
ctx -> ptr -- ;
868
872
ctx -> count -- ;
869
873
}
870
-
874
+ if (state -> repeat )
875
+ MARK_POP_DISCARD (ctx -> lastmark );
871
876
} else {
872
877
/* general case */
873
878
while (ctx -> count >= (Py_ssize_t ) ctx -> pattern [1 ]) {
874
879
state -> ptr = ctx -> ptr ;
875
880
DO_JUMP (JUMP_REPEAT_ONE_2 , jump_repeat_one_2 ,
876
881
ctx -> pattern + ctx -> pattern [0 ]);
877
882
if (ret ) {
883
+ if (state -> repeat )
884
+ MARK_POP_DISCARD (ctx -> lastmark );
878
885
RETURN_ON_ERROR (ret );
879
886
RETURN_SUCCESS ;
880
887
}
888
+ if (state -> repeat )
889
+ MARK_POP_KEEP (ctx -> lastmark );
890
+ LASTMARK_RESTORE ();
891
+
881
892
ctx -> ptr -- ;
882
893
ctx -> count -- ;
883
- LASTMARK_RESTORE ();
884
894
}
895
+ if (state -> repeat )
896
+ MARK_POP_DISCARD (ctx -> lastmark );
885
897
}
886
898
RETURN_FAILURE ;
887
899
@@ -930,15 +942,24 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
930
942
} else {
931
943
/* general case */
932
944
LASTMARK_SAVE ();
945
+ if (state -> repeat )
946
+ MARK_PUSH (ctx -> lastmark );
947
+
933
948
while ((Py_ssize_t )ctx -> pattern [2 ] == SRE_MAXREPEAT
934
949
|| ctx -> count <= (Py_ssize_t )ctx -> pattern [2 ]) {
935
950
state -> ptr = ctx -> ptr ;
936
951
DO_JUMP (JUMP_MIN_REPEAT_ONE ,jump_min_repeat_one ,
937
952
ctx -> pattern + ctx -> pattern [0 ]);
938
953
if (ret ) {
954
+ if (state -> repeat )
955
+ MARK_POP_DISCARD (ctx -> lastmark );
939
956
RETURN_ON_ERROR (ret );
940
957
RETURN_SUCCESS ;
941
958
}
959
+ if (state -> repeat )
960
+ MARK_POP_KEEP (ctx -> lastmark );
961
+ LASTMARK_RESTORE ();
962
+
942
963
state -> ptr = ctx -> ptr ;
943
964
ret = SRE (count )(state , ctx -> pattern + 3 , 1 );
944
965
RETURN_ON_ERROR (ret );
@@ -948,8 +969,9 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
948
969
assert (ret == 1 );
949
970
ctx -> ptr ++ ;
950
971
ctx -> count ++ ;
951
- LASTMARK_RESTORE ();
952
972
}
973
+ if (state -> repeat )
974
+ MARK_POP_DISCARD (ctx -> lastmark );
953
975
}
954
976
RETURN_FAILURE ;
955
977
@@ -1098,8 +1120,9 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
1098
1120
tail matches */
1099
1121
state -> repeat = ctx -> u .rep -> prev ;
1100
1122
DO_JUMP (JUMP_MAX_UNTIL_3 , jump_max_until_3 , ctx -> pattern );
1123
+ state -> repeat = ctx -> u .rep ; // restore repeat before return
1124
+
1101
1125
RETURN_ON_SUCCESS (ret );
1102
- state -> repeat = ctx -> u .rep ;
1103
1126
state -> ptr = ctx -> ptr ;
1104
1127
RETURN_FAILURE ;
1105
1128
@@ -1132,21 +1155,29 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
1132
1155
RETURN_FAILURE ;
1133
1156
}
1134
1157
1135
- LASTMARK_SAVE ();
1136
-
1137
1158
/* see if the tail matches */
1138
1159
state -> repeat = ctx -> u .rep -> prev ;
1160
+
1161
+ LASTMARK_SAVE ();
1162
+ if (state -> repeat )
1163
+ MARK_PUSH (ctx -> lastmark );
1164
+
1139
1165
DO_JUMP (JUMP_MIN_UNTIL_2 , jump_min_until_2 , ctx -> pattern );
1166
+ SRE_REPEAT * repeat_of_tail = state -> repeat ;
1167
+ state -> repeat = ctx -> u .rep ; // restore repeat before return
1168
+
1140
1169
if (ret ) {
1170
+ if (repeat_of_tail )
1171
+ MARK_POP_DISCARD (ctx -> lastmark );
1141
1172
RETURN_ON_ERROR (ret );
1142
1173
RETURN_SUCCESS ;
1143
1174
}
1175
+ if (repeat_of_tail )
1176
+ MARK_POP (ctx -> lastmark );
1177
+ LASTMARK_RESTORE ();
1144
1178
1145
- state -> repeat = ctx -> u .rep ;
1146
1179
state -> ptr = ctx -> ptr ;
1147
1180
1148
- LASTMARK_RESTORE ();
1149
-
1150
1181
if ((ctx -> count >= (Py_ssize_t ) ctx -> u .rep -> pattern [2 ]
1151
1182
&& ctx -> u .rep -> pattern [2 ] != SRE_MAXREPEAT ) ||
1152
1183
state -> ptr == ctx -> u .rep -> last_ptr )
@@ -1444,11 +1475,20 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
1444
1475
ctx -> ptr , ctx -> pattern [1 ]));
1445
1476
if (ctx -> ptr - (SRE_CHAR * )state -> beginning >= (Py_ssize_t )ctx -> pattern [1 ]) {
1446
1477
state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
1478
+ LASTMARK_SAVE ();
1479
+ if (state -> repeat )
1480
+ MARK_PUSH (ctx -> lastmark );
1481
+
1447
1482
DO_JUMP0 (JUMP_ASSERT_NOT , jump_assert_not , ctx -> pattern + 2 );
1448
1483
if (ret ) {
1484
+ if (state -> repeat )
1485
+ MARK_POP_DISCARD (ctx -> lastmark );
1449
1486
RETURN_ON_ERROR (ret );
1450
1487
RETURN_FAILURE ;
1451
1488
}
1489
+ if (state -> repeat )
1490
+ MARK_POP (ctx -> lastmark );
1491
+ LASTMARK_RESTORE ();
1452
1492
}
1453
1493
ctx -> pattern += ctx -> pattern [0 ];
1454
1494
break ;
0 commit comments