diff -r 4accc35cbfcf Modules/_sre.c --- a/Modules/_sre.c Tue Mar 17 10:49:17 2015 +0100 +++ b/Modules/_sre.c Tue Mar 17 20:31:00 2015 +0200 @@ -280,6 +280,18 @@ sre_getlower(PyObject* self, PyObject* a } LOCAL(void) +state_clean_repeat_data(SRE_STATE* state) +{ + SRE_REPEAT *rep = state->repeat; + state->repeat = NULL; + while (rep) { + SRE_REPEAT *prev = rep->prev; + PyObject_FREE(rep); + rep = prev; + } +} + +LOCAL(void) state_reset(SRE_STATE* state) { /* FIXME: dynamic! */ @@ -288,8 +300,7 @@ state_reset(SRE_STATE* state) state->lastmark = -1; state->lastindex = -1; - state->repeat = NULL; - + state_clean_repeat_data(state); data_stack_dealloc(state); } @@ -420,6 +431,7 @@ state_fini(SRE_STATE* state) if (state->buffer.buf) PyBuffer_Release(&state->buffer); Py_XDECREF(state->string); + state_clean_repeat_data(state); data_stack_dealloc(state); PyMem_Del(state->mark); state->mark = NULL;