Blame SOURCES/00256-fix-incorrect-parsing-of-regular-expressions.patch

925e6b
diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
925e6b
index 7cda2b6..15d2324 100644
925e6b
--- a/Lib/sre_compile.py
925e6b
+++ b/Lib/sre_compile.py
925e6b
@@ -355,8 +355,6 @@ def _optimize_unicode(charset, fixup):
925e6b
 def _simple(av):
925e6b
     # check if av is a "simple" operator
925e6b
     lo, hi = av[2].getwidth()
925e6b
-    if lo == 0 and hi == MAXREPEAT:
925e6b
-        raise error, "nothing to repeat"
925e6b
     return lo == hi == 1 and av[2][0][0] != SUBPATTERN
925e6b
 
925e6b
 def _compile_info(code, pattern, flags):
925e6b
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
925e6b
index 75f8c96..644441d 100644
925e6b
--- a/Lib/sre_parse.py
925e6b
+++ b/Lib/sre_parse.py
925e6b
@@ -147,7 +147,7 @@ class SubPattern:
925e6b
         REPEATCODES = (MIN_REPEAT, MAX_REPEAT)
925e6b
         for op, av in self.data:
925e6b
             if op is BRANCH:
925e6b
-                i = sys.maxint
925e6b
+                i = MAXREPEAT - 1
925e6b
                 j = 0
925e6b
                 for av in av[1]:
925e6b
                     l, h = av.getwidth()
925e6b
@@ -165,14 +165,14 @@ class SubPattern:
925e6b
                 hi = hi + j
925e6b
             elif op in REPEATCODES:
925e6b
                 i, j = av[2].getwidth()
925e6b
-                lo = lo + long(i) * av[0]
925e6b
-                hi = hi + long(j) * av[1]
925e6b
+                lo = lo + i * av[0]
925e6b
+                hi = hi + j * av[1]
925e6b
             elif op in UNITCODES:
925e6b
                 lo = lo + 1
925e6b
                 hi = hi + 1
925e6b
             elif op == SUCCESS:
925e6b
                 break
925e6b
-        self.width = int(min(lo, sys.maxint)), int(min(hi, sys.maxint))
925e6b
+        self.width = min(lo, MAXREPEAT - 1), min(hi, MAXREPEAT)
925e6b
         return self.width
925e6b
 
925e6b
 class Tokenizer:
925e6b
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
925e6b
index 18a81a2..f0827d8 100644
925e6b
--- a/Lib/test/test_re.py
925e6b
+++ b/Lib/test/test_re.py
925e6b
@@ -897,6 +897,17 @@ class ReTests(unittest.TestCase):
925e6b
         with self.assertRaisesRegexp(sre_constants.error, '\?foo'):
925e6b
             re.compile('(?P)')
925e6b
 
925e6b
+    def test_bug_2537(self):
925e6b
+        # issue 2537: empty submatches
925e6b
+        for outer_op in ('{0,}', '*', '+', '{1,187}'):
925e6b
+            for inner_op in ('{0,}', '*', '?'):
925e6b
+                r = re.compile("^((x|y)%s)%s" % (inner_op, outer_op))
925e6b
+                m = r.match("xyyzy")
925e6b
+                self.assertEqual(m.group(0), "xyy")
925e6b
+                self.assertEqual(m.group(1), "")
925e6b
+                self.assertEqual(m.group(2), "y")
925e6b
+
925e6b
+
925e6b
 
925e6b
 def run_re_tests():
925e6b
     from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR
925e6b
diff --git a/Lib/doctest.py b/Lib/doctest.py
925e6b
index 90bcca1..0ee40a2 100644
925e6b
--- a/Lib/doctest.py
925e6b
+++ b/Lib/doctest.py
925e6b
@@ -564,7 +564,7 @@ class DocTestParser:
925e6b
         # Want consists of any non-blank lines that do not start with PS1.
925e6b
         (?P<want> (?:(?![ ]*$)    # Not a blank line
925e6b
                      (?![ ]*>>>)  # Not a line starting with PS1
925e6b
-                     .*$\n?       # But any other line
925e6b
+                     .+$\n?       # But any other line
925e6b
                   )*)
925e6b
         ''', re.MULTILINE | re.VERBOSE)
925e6b
 
925e6b