From 3c9068bbec1f237feec96aaad64a6c73fa95bf8b Mon Sep 17 00:00:00 2001
From: Gustavo Niemeyer <gustavo@niemeyer.net>
Date: Tue, 22 Apr 2003 15:39:09 +0000
Subject: Made MAX_UNTIL/MIN_UNTIL code more coherent about mark protection,
 accordingly to further discussions with Greg Chapman in patch #712900.

---
 Modules/_sre.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/Modules/_sre.c b/Modules/_sre.c
index 3183a6e..be6920d 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -1161,6 +1161,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
                 return i;
             state->repeat = rp;
             state->ptr = ptr;
+            LASTMARK_RESTORE();
             return 0;
 
         case SRE_OP_MIN_UNTIL:
@@ -1171,12 +1172,14 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
             if (!rp)
                 return SRE_ERROR_STATE;
 
+            state->ptr = ptr;
+
             count = rp->count + 1;
 
             TRACE(("|%p|%p|MIN_UNTIL %d %p\n", pattern, ptr, count,
                    rp->pattern));
 
-            state->ptr = ptr;
+            LASTMARK_SAVE();
 
             if (count < rp->pattern[1]) {
                 /* not enough matches */
@@ -1187,11 +1190,10 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
                     return i;
                 rp->count = count-1;
                 state->ptr = ptr;
+                LASTMARK_RESTORE();
                 return 0;
             }
 
-            LASTMARK_SAVE();
-
             /* see if the tail matches */
             state->repeat = rp->prev;
             i = SRE_MATCH(state, pattern, level + 1);
@@ -1202,7 +1204,6 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
             state->repeat = rp;
 
             LASTMARK_RESTORE();
-
             if (count >= rp->pattern[2] && rp->pattern[2] != 65535)
                 return 0;
 
@@ -1213,6 +1214,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
                 return i;
             rp->count = count - 1;
             state->ptr = ptr;
+            LASTMARK_RESTORE();
             return 0;
 
         default:
-- 
cgit v0.12

