Issue #10182: The re module doesn't truncate indices to 32 bits anymore.

Patch by Serhiy Storchaka.
This commit is contained in:
Antoine Pitrou 2012-12-02 12:52:36 +01:00
parent 4fc0082602
commit b83575b0a5
3 changed files with 24 additions and 5 deletions

View File

@ -1,4 +1,5 @@
from test.test_support import verbose, run_unittest, import_module from test.test_support import verbose, run_unittest, import_module
from test.test_support import precisionbigmemtest, _2G
import re import re
from re import Scanner from re import Scanner
import sys import sys
@ -819,6 +820,21 @@ class ReTests(unittest.TestCase):
# Test behaviour when not given a string or pattern as parameter # Test behaviour when not given a string or pattern as parameter
self.assertRaises(TypeError, re.compile, 0) self.assertRaises(TypeError, re.compile, 0)
# The huge memuse is because of re.sub() using a list and a join()
# to create the replacement result.
@precisionbigmemtest(size=_2G, memuse=20)
def test_large(self, size):
# Issue #10182: indices were 32-bit-truncated.
s = 'a' * size
m = re.search('$', s)
self.assertIsNotNone(m)
self.assertEqual(m.start(), size)
self.assertEqual(m.end(), size)
r, n = re.subn('', '', s)
self.assertEqual(r, s)
self.assertEqual(n, size + 1)
def run_re_tests(): def run_re_tests():
from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR
if verbose: if verbose:

View File

@ -154,6 +154,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10182: The re module doesn't truncate indices to 32 bits anymore.
Patch by Serhiy Storchaka.
- Issue #16573: In 2to3, treat enumerate() like a consuming call, so superfluous - Issue #16573: In 2to3, treat enumerate() like a consuming call, so superfluous
list() calls aren't added to filter(), map(), and zip() which are directly list() calls aren't added to filter(), map(), and zip() which are directly
passed enumerate(). passed enumerate().

View File

@ -1636,7 +1636,7 @@ static PyObject*pattern_scanner(PatternObject*, PyObject*);
static PyObject * static PyObject *
sre_codesize(PyObject* self, PyObject *unused) sre_codesize(PyObject* self, PyObject *unused)
{ {
return Py_BuildValue("l", sizeof(SRE_CODE)); return PyLong_FromSize_t(sizeof(SRE_CODE));
} }
static PyObject * static PyObject *
@ -2448,7 +2448,7 @@ next:
return NULL; return NULL;
if (subn) if (subn)
return Py_BuildValue("Ni", item, n); return Py_BuildValue("Nn", item, n);
return item; return item;
@ -3389,7 +3389,7 @@ match_start(MatchObject* self, PyObject* args)
} }
/* mark is -1 if group is undefined */ /* mark is -1 if group is undefined */
return Py_BuildValue("i", self->mark[index*2]); return PyLong_FromSsize_t(self->mark[index*2]);
} }
static PyObject* static PyObject*
@ -3412,7 +3412,7 @@ match_end(MatchObject* self, PyObject* args)
} }
/* mark is -1 if group is undefined */ /* mark is -1 if group is undefined */
return Py_BuildValue("i", self->mark[index*2+1]); return PyLong_FromSsize_t(self->mark[index*2+1]);
} }
LOCAL(PyObject*) LOCAL(PyObject*)
@ -3562,7 +3562,7 @@ static PyObject *
match_lastindex_get(MatchObject *self) match_lastindex_get(MatchObject *self)
{ {
if (self->lastindex >= 0) if (self->lastindex >= 0)
return Py_BuildValue("i", self->lastindex); return PyLong_FromSsize_t(self->lastindex);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }