]> granicus.if.org Git - python/commitdiff
-- don't use recursion for unbounded non-greedy repeat
authorFredrik Lundh <fredrik@pythonware.com>
Sun, 14 Jan 2001 23:55:55 +0000 (23:55 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Sun, 14 Jan 2001 23:55:55 +0000 (23:55 +0000)
(bugs #115903, #115696)

This is based on a patch by Darrel Gallion.  I'm not 100%
sure about this fix, but I haven't managed to come up with
any test case it cannot handle...

Lib/test/test_sre.py
Modules/_sre.c

index 9c01c666fff4daf9599afccc354f5d15757cb75d..5d19d40988dd337a580482486121de179c700ea1 100644 (file)
@@ -248,7 +248,7 @@ test(r"""sre.match(r'(x)*', 50000*'x').span()""",
 test(r"""sre.match(r'(x)*y', 50000*'x'+'y').span()""",
      (0, 50001), RuntimeError)
 test(r"""sre.match(r'(x)*?y', 50000*'x'+'y').span()""",
-     (0, 50001), RuntimeError)
+     (0, 50001)) # this works in 2.1
 
 from re_tests import *
 
index 28ec61c21006830e55ab14c44784f2be268174df..b040d8739336ac3bd9c5056e67e02dff20aecf57 100644 (file)
@@ -24,6 +24,7 @@
  * 2000-10-24 fl  really fixed assert_not; reset groups in findall
  * 2000-12-21 fl  fixed memory leak in groupdict
  * 2001-01-02 fl  properly reset pointer after failed assertion in MIN_UNTIL
+ * 2001-01-15 fl  don't use recursion for unbounded MIN_UTIL
  *
  * Copyright (c) 1997-2001 by Secret Labs AB.  All rights reserved.
  *
@@ -38,7 +39,7 @@
 
 #ifndef SRE_RECURSIVE
 
-char copyright[] = " SRE 0.9.9 Copyright (c) 1997-2000 by Secret Labs AB ";
+char copyright[] = " SRE 0.9.9 Copyright (c) 1997-2001 by Secret Labs AB ";
 
 #include "Python.h"
 
@@ -1012,11 +1013,21 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
 
             /* see if the tail matches */
             state->repeat = rp->prev;
-            i = SRE_MATCH(state, pattern, level + 1);
+            if (rp->pattern[2] == 65535) {
+                /* unbounded repeat */
+                for (;;) {
+                    i = SRE_MATCH(state, pattern, level + 1);
+                    if (i || ptr >= end)
+                        break;
+                    state->ptr = ++ptr;
+                }
+            } else
+                i = SRE_MATCH(state, pattern, level + 1);
             if (i) {
                 /* free(rp); */
                 return i;
             }
+
             state->ptr = ptr;
             state->repeat = rp;