aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Modules/_sre/sre_lib.h
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_sre/sre_lib.h')
-rw-r--r--Modules/_sre/sre_lib.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/Modules/_sre/sre_lib.h b/Modules/_sre/sre_lib.h
index 0c93f512110..af4bfc56083 100644
--- a/Modules/_sre/sre_lib.h
+++ b/Modules/_sre/sre_lib.h
@@ -1306,6 +1306,17 @@ dispatch:
pointer */
state->ptr = ptr;
+ /* Set state->repeat to non-NULL */
+ ctx->u.rep = repeat_pool_malloc(state);
+ if (!ctx->u.rep) {
+ RETURN_ERROR(SRE_ERROR_MEMORY);
+ }
+ ctx->u.rep->count = -1;
+ ctx->u.rep->pattern = NULL;
+ ctx->u.rep->prev = state->repeat;
+ ctx->u.rep->last_ptr = NULL;
+ state->repeat = ctx->u.rep;
+
/* Initialize Count to 0 */
ctx->count = 0;
@@ -1320,6 +1331,9 @@ dispatch:
}
else {
state->ptr = ptr;
+ /* Restore state->repeat */
+ state->repeat = ctx->u.rep->prev;
+ repeat_pool_free(state, ctx->u.rep);
RETURN_FAILURE;
}
}
@@ -1392,6 +1406,10 @@ dispatch:
}
}
+ /* Restore state->repeat */
+ state->repeat = ctx->u.rep->prev;
+ repeat_pool_free(state, ctx->u.rep);
+
/* Evaluate Tail */
/* Jump to end of pattern indicated by skip, and then skip
the SUCCESS op code that follows it. */