Cleaning up recursive pieces left in the reorganization.
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 74e3dbf..ee07342 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -64,37 +64,6 @@
 /* -------------------------------------------------------------------- */
 /* optional features */
 
-/* prevent run-away recursion (bad patterns on long strings) */
-
-#if !defined(USE_STACKCHECK)
-#if defined(MS_WIN64) || defined(__LP64__) || defined(_LP64)
-/* require smaller recursion limit for a number of 64-bit platforms:
-   Win64 (MS_WIN64), Linux64 (__LP64__), Monterey (64-bit AIX) (_LP64) */
-/* FIXME: maybe the limit should be 40000 / sizeof(void*) ? */
-#define USE_RECURSION_LIMIT 7500
-#else
-
-#if defined(__GNUC__) && defined(WITH_THREAD) && defined(__FreeBSD__)
-/* the pthreads library on FreeBSD has a fixed 1MB stack size for the
- * initial (or "primary") thread, which is insufficient for the default
- * recursion limit.  gcc 3.x at the default optimisation
- * level (-O3) uses stack space more aggressively than gcc 2.95.
- */
-#if (__GNUC__ > 2)
-#define USE_RECURSION_LIMIT 6500
-#else
-#define USE_RECURSION_LIMIT 7500
-#endif
-
-#else
-#define USE_RECURSION_LIMIT 10000
-#endif
-#endif
-#endif
-
-/* enables usage of recursive scheme */
-#undef USE_RECURSION
-
 /* enables fast searching */
 #define USE_FAST_SEARCH
 
@@ -536,10 +505,10 @@
     }
 }
 
-LOCAL(int) SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level);
+LOCAL(int) SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern);
 
 LOCAL(int)
-SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, int maxcount, int level)
+SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, int maxcount)
 {
     SRE_CODE chr;
     SRE_CHAR* ptr = state->ptr;
@@ -609,7 +578,7 @@
         /* repeated single character pattern */
         TRACE(("|%p|%p|COUNT SUBPATTERN\n", pattern, ptr));
         while ((SRE_CHAR*) state->ptr < end) {
-            i = SRE_MATCH(state, pattern, level);
+            i = SRE_MATCH(state, pattern);
             if (i < 0)
                 return i;
             if (!i)
@@ -827,7 +796,7 @@
 /* check if string matches the given pattern.  returns <0 for
    error, 0 for failure, and 1 for success */
 LOCAL(int)
-SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
+SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern)
 {
     SRE_CHAR* end = state->end;
     int alloc_pos, ctx_pos = -1;
@@ -837,17 +806,7 @@
     SRE_MATCH_CONTEXT* ctx;
     SRE_MATCH_CONTEXT* nextctx;
 
-    TRACE(("|%p|%p|ENTER %d\n", pattern, state->ptr, level));
-
-#if defined(USE_STACKCHECK)
-    if (level % 10 == 0 && PyOS_CheckStack())
-        return SRE_ERROR_RECURSION_LIMIT;
-#endif
-
-#if defined(USE_RECURSION_LIMIT)
-    if (level > USE_RECURSION_LIMIT)
-        return SRE_ERROR_RECURSION_LIMIT;
-#endif
+    TRACE(("|%p|%p|ENTER\n", pattern, state->ptr));
 
     DATA_ALLOC(SRE_MATCH_CONTEXT, ctx);
     ctx->last_ctx_pos = -1;
@@ -1029,11 +988,7 @@
                      !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) *ctx->ptr)))
                     continue;
                 state->ptr = ctx->ptr;
-#ifdef USE_RECURSION
-                ret = SRE_MATCH(state, ctx->pattern+1, level+1);
-#else
                 DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1);
-#endif
                 if (ret) {
                     if (ctx->u.rep)
                         MARK_POP_DISCARD(ctx->lastmark);
@@ -1066,8 +1021,7 @@
 
             state->ptr = ctx->ptr;
 
-            ctx->count = SRE_COUNT(state, ctx->pattern+3, ctx->pattern[2],
-                                   level+1);
+            ctx->count = SRE_COUNT(state, ctx->pattern+3, ctx->pattern[2]);
             RETURN_ON_ERROR(ctx->count);
 
             ctx->ptr += ctx->count;
@@ -1101,13 +1055,8 @@
                     if (ctx->count < (int) ctx->pattern[1])
                         break;
                     state->ptr = ctx->ptr;
-#ifdef USE_RECURSION
-                    ret = SRE_MATCH(state, ctx->pattern+ctx->pattern[0],
-                                    level+1);
-#else
                     DO_JUMP(JUMP_REPEAT_ONE_1, jump_repeat_one_1,
                             ctx->pattern+ctx->pattern[0]);
-#endif
                     if (ret) {
                         RETURN_ON_ERROR(ret);
                         RETURN_SUCCESS;
@@ -1123,13 +1072,8 @@
                 /* general case */
                 while (ctx->count >= (int) ctx->pattern[1]) {
                     state->ptr = ctx->ptr;
-#ifdef USE_RECURSION
-                    ret = SRE_MATCH(state, ctx->pattern+ctx->pattern[0],
-                                    level+1);
-#else
                     DO_JUMP(JUMP_REPEAT_ONE_2, jump_repeat_one_2,
                             ctx->pattern+ctx->pattern[0]);
-#endif
                     if (ret) {
                         RETURN_ON_ERROR(ret);
                         RETURN_SUCCESS;
@@ -1164,7 +1108,7 @@
             else {
                 /* count using pattern min as the maximum */
                 ctx->count = SRE_COUNT(state, ctx->pattern+3,
-                                       ctx->pattern[1], level+1);
+                                       ctx->pattern[1]);
                 RETURN_ON_ERROR(ctx->count);
                 if (ctx->count < (int) ctx->pattern[1])
                     /* didn't match minimum number of times */ 
@@ -1184,19 +1128,14 @@
                 while ((int)ctx->pattern[2] == 65535
                        || ctx->count <= (int)ctx->pattern[2]) {
                     state->ptr = ctx->ptr;
-#ifdef USE_RECURSION
-                    ret = SRE_MATCH(state, ctx->pattern+ctx->pattern[0],
-                                    level+1);
-#else
                     DO_JUMP(JUMP_MIN_REPEAT_ONE,jump_min_repeat_one,
                             ctx->pattern+ctx->pattern[0]);
-#endif
                     if (ret) {
                         RETURN_ON_ERROR(ret);
                         RETURN_SUCCESS;
                     }
                     state->ptr = ctx->ptr;
-                    ret = SRE_COUNT(state, ctx->pattern+3, 1, level+1);
+                    ret = SRE_COUNT(state, ctx->pattern+3, 1);
                     RETURN_ON_ERROR(ret);
                     if (ret == 0)
                         break;
@@ -1224,11 +1163,7 @@
             state->repeat = ctx->u.rep;
 
             state->ptr = ctx->ptr;
-#ifdef USE_RECURSION
-            ret = SRE_MATCH(state, ctx->pattern+ctx->pattern[0], level+1);
-#else
             DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0]);
-#endif
             state->repeat = ctx->u.rep->prev;
             free(ctx->u.rep);
 
@@ -1259,13 +1194,8 @@
             if (ctx->count < ctx->u.rep->pattern[1]) {
                 /* not enough matches */
                 ctx->u.rep->count = ctx->count;
-#ifdef USE_RECURSION
-                /* RECURSIVE */
-                ret = SRE_MATCH(state, ctx->u.rep->pattern+3, level+1);
-#else
                 DO_JUMP(JUMP_MAX_UNTIL_1, jump_max_until_1,
                         ctx->u.rep->pattern+3);
-#endif
                 if (ret) {
                     RETURN_ON_ERROR(ret);
                     RETURN_SUCCESS;
@@ -1286,13 +1216,8 @@
                 /* zero-width match protection */
                 DATA_PUSH(&ctx->u.rep->last_ptr);
                 ctx->u.rep->last_ptr = state->ptr;
-#ifdef USE_RECURSION
-                /* RECURSIVE */
-                ret = SRE_MATCH(state, ctx->u.rep->pattern+3, level+1);
-#else
                 DO_JUMP(JUMP_MAX_UNTIL_2, jump_max_until_2,
                         ctx->u.rep->pattern+3);
-#endif
                 DATA_POP(&ctx->u.rep->last_ptr);
                 if (ret) {
                     MARK_POP_DISCARD(ctx->lastmark);
@@ -1308,11 +1233,7 @@
             /* cannot match more repeated items here.  make sure the
                tail matches */
             state->repeat = ctx->u.rep->prev;
-#ifdef USE_RECURSION
-            ret = SRE_MATCH(state, ctx->pattern, level+1);
-#else
             DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern);
-#endif
             RETURN_ON_SUCCESS(ret);
             state->repeat = ctx->u.rep;
             state->ptr = ctx->ptr;
@@ -1336,13 +1257,8 @@
             if (ctx->count < ctx->u.rep->pattern[1]) {
                 /* not enough matches */
                 ctx->u.rep->count = ctx->count;
-#ifdef USE_RECURSION
-                /* RECURSIVE */
-                ret = SRE_MATCH(state, ctx->u.rep->pattern+3, level+1);
-#else
                 DO_JUMP(JUMP_MIN_UNTIL_1, jump_min_until_1,
                         ctx->u.rep->pattern+3);
-#endif
                 if (ret) {
                     RETURN_ON_ERROR(ret);
                     RETURN_SUCCESS;
@@ -1356,11 +1272,7 @@
 
             /* see if the tail matches */
             state->repeat = ctx->u.rep->prev;
-#ifdef USE_RECURSION
-            ret = SRE_MATCH(state, ctx->pattern, level+1);
-#else
             DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern);
-#endif
             if (ret) {
                 RETURN_ON_ERROR(ret);
                 RETURN_SUCCESS;
@@ -1376,13 +1288,8 @@
                 RETURN_FAILURE;
 
             ctx->u.rep->count = ctx->count;
-#ifdef USE_RECURSION
-            /* RECURSIVE */
-            ret = SRE_MATCH(state, ctx->u.rep->pattern+3, level+1);
-#else
             DO_JUMP(JUMP_MIN_UNTIL_3,jump_min_until_3,
                     ctx->u.rep->pattern+3);
-#endif
             if (ret) {
                 RETURN_ON_ERROR(ret);
                 RETURN_SUCCESS;
@@ -1470,11 +1377,7 @@
             state->ptr = ctx->ptr - ctx->pattern[1];
             if (state->ptr < state->beginning)
                 RETURN_FAILURE;
-#ifdef USE_RECURSION
-            ret = SRE_MATCH(state, ctx->pattern+2, level+1);
-#else
             DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2);
-#endif
             RETURN_ON_FAILURE(ret);
             ctx->pattern += ctx->pattern[0];
             break;
@@ -1486,11 +1389,7 @@
                    ctx->ptr, ctx->pattern[1]));
             state->ptr = ctx->ptr - ctx->pattern[1];
             if (state->ptr >= state->beginning) {
-#ifdef USE_RECURSION
-                ret = SRE_MATCH(state, ctx->pattern+2, level+1);
-#else
                 DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2);
-#endif
                 if (ret) {
                     RETURN_ON_ERROR(ret);
                     RETURN_FAILURE;
@@ -1519,7 +1418,6 @@
         return ret;
     DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos);
 
-#ifndef USE_RECURSION
     switch (jump) {
         case JUMP_MAX_UNTIL_2:
             TRACE(("|%p|%p|JUMP_MAX_UNTIL_2\n", ctx->pattern, ctx->ptr));
@@ -1564,7 +1462,6 @@
             TRACE(("|%p|%p|RETURN %d\n", ctx->pattern, ctx->ptr, ret));
             break;
     }
-#endif
 
     return ret; /* should never get here */
 }
@@ -1635,7 +1532,7 @@
                         state->ptr = ptr + 1 - prefix_len + prefix_skip;
                         if (flags & SRE_INFO_LITERAL)
                             return 1; /* we got all of it */
-                        status = SRE_MATCH(state, pattern + 2*prefix_skip, 1);
+                        status = SRE_MATCH(state, pattern + 2*prefix_skip);
                         if (status != 0)
                             return status;
                         /* close but no cigar -- try again */
@@ -1666,7 +1563,7 @@
             state->ptr = ++ptr;
             if (flags & SRE_INFO_LITERAL)
                 return 1; /* we got all of it */
-            status = SRE_MATCH(state, pattern + 2, 1);
+            status = SRE_MATCH(state, pattern + 2);
             if (status != 0)
                 break;
         }
@@ -1681,7 +1578,7 @@
             TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr));
             state->start = ptr;
             state->ptr = ptr;
-            status = SRE_MATCH(state, pattern, 1);
+            status = SRE_MATCH(state, pattern);
             if (status != 0)
                 break;
             ptr++;
@@ -1691,7 +1588,7 @@
         while (ptr <= end) {
             TRACE(("|%p|%p|SEARCH\n", pattern, ptr));
             state->start = state->ptr = ptr++;
-            status = SRE_MATCH(state, pattern, 1);
+            status = SRE_MATCH(state, pattern);
             if (status != 0)
                 break;
         }
@@ -2114,10 +2011,10 @@
     TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr));
 
     if (state.charsize == 1) {
-        status = sre_match(&state, PatternObject_GetCode(self), 1);
+        status = sre_match(&state, PatternObject_GetCode(self));
     } else {
 #if defined(HAVE_UNICODE)
-        status = sre_umatch(&state, PatternObject_GetCode(self), 1);
+        status = sre_umatch(&state, PatternObject_GetCode(self));
 #endif
     }
 
@@ -3311,10 +3208,10 @@
     state->ptr = state->start;
 
     if (state->charsize == 1) {
-        status = sre_match(state, PatternObject_GetCode(self->pattern), 1);
+        status = sre_match(state, PatternObject_GetCode(self->pattern));
     } else {
 #if defined(HAVE_UNICODE)
-        status = sre_umatch(state, PatternObject_GetCode(self->pattern), 1);
+        status = sre_umatch(state, PatternObject_GetCode(self->pattern));
 #endif
     }