Commit 3c9068bb authored by Gustavo Niemeyer's avatar Gustavo Niemeyer

Made MAX_UNTIL/MIN_UNTIL code more coherent about mark protection,

accordingly to further discussions with Greg Chapman in patch #712900.
parent c8c8b94c
...@@ -1161,6 +1161,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) ...@@ -1161,6 +1161,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
return i; return i;
state->repeat = rp; state->repeat = rp;
state->ptr = ptr; state->ptr = ptr;
LASTMARK_RESTORE();
return 0; return 0;
case SRE_OP_MIN_UNTIL: case SRE_OP_MIN_UNTIL:
...@@ -1171,12 +1172,14 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) ...@@ -1171,12 +1172,14 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
if (!rp) if (!rp)
return SRE_ERROR_STATE; return SRE_ERROR_STATE;
state->ptr = ptr;
count = rp->count + 1; count = rp->count + 1;
TRACE(("|%p|%p|MIN_UNTIL %d %p\n", pattern, ptr, count, TRACE(("|%p|%p|MIN_UNTIL %d %p\n", pattern, ptr, count,
rp->pattern)); rp->pattern));
state->ptr = ptr; LASTMARK_SAVE();
if (count < rp->pattern[1]) { if (count < rp->pattern[1]) {
/* not enough matches */ /* not enough matches */
...@@ -1187,11 +1190,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) ...@@ -1187,11 +1190,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
return i; return i;
rp->count = count-1; rp->count = count-1;
state->ptr = ptr; state->ptr = ptr;
LASTMARK_RESTORE();
return 0; return 0;
} }
LASTMARK_SAVE();
/* see if the tail matches */ /* see if the tail matches */
state->repeat = rp->prev; state->repeat = rp->prev;
i = SRE_MATCH(state, pattern, level + 1); i = SRE_MATCH(state, pattern, level + 1);
...@@ -1202,7 +1204,6 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) ...@@ -1202,7 +1204,6 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
state->repeat = rp; state->repeat = rp;
LASTMARK_RESTORE(); LASTMARK_RESTORE();
if (count >= rp->pattern[2] && rp->pattern[2] != 65535) if (count >= rp->pattern[2] && rp->pattern[2] != 65535)
return 0; return 0;
...@@ -1213,6 +1214,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) ...@@ -1213,6 +1214,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
return i; return i;
rp->count = count - 1; rp->count = count - 1;
state->ptr = ptr; state->ptr = ptr;
LASTMARK_RESTORE();
return 0; return 0;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment