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:55:12 +01:00
commit d8d1a0ab78
3 changed files with 24 additions and 6 deletions

View File

@ -1,4 +1,4 @@
from test.support import verbose, run_unittest, gc_collect from test.support import verbose, run_unittest, gc_collect, bigmemtest, _2G
import io import io
import re import re
from re import Scanner from re import Scanner
@ -949,6 +949,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.
@bigmemtest(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

@ -145,6 +145,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10182: The re module doesn't truncate indices to 32 bits anymore.
Patch by Serhiy Storchaka.
- Issue #16333: use (",", ": ") as default separator when indent is specified - Issue #16333: use (",", ": ") as default separator when indent is specified
to avoid trailing whitespace. Patch by Serhiy Storchaka. to avoid trailing whitespace. Patch by Serhiy Storchaka.

View File

@ -1618,7 +1618,7 @@ sre_literal_template(int charsize, char* ptr, Py_ssize_t len)
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 *
@ -2435,7 +2435,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;
@ -3387,7 +3387,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*
@ -3410,7 +3410,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*)
@ -3560,7 +3560,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;
} }