mirror of https://github.com/python/cpython
Issue #6334: Fix buggy internal length calculation in builtin range function
This commit is contained in:
parent
eeb575f329
commit
eb36d31bb8
|
@ -924,6 +924,24 @@ class BuiltinTest(unittest.TestCase):
|
|||
self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
|
||||
#self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
|
||||
|
||||
#issue 6334: the internal stored range length was being
|
||||
#computed incorrectly in some cases involving large arguments.
|
||||
x = range(10**20, 10**20+10, 3)
|
||||
self.assertEqual(len(x), 4)
|
||||
self.assertEqual(len(list(x)), 4)
|
||||
|
||||
x = range(10**20+10, 10**20, 3)
|
||||
self.assertEqual(len(x), 0)
|
||||
self.assertEqual(len(list(x)), 0)
|
||||
|
||||
x = range(10**20, 10**20+10, -3)
|
||||
self.assertEqual(len(x), 0)
|
||||
self.assertEqual(len(list(x)), 0)
|
||||
|
||||
x = range(10**20+10, 10**20, -3)
|
||||
self.assertEqual(len(x), 4)
|
||||
self.assertEqual(len(list(x)), 4)
|
||||
|
||||
""" XXX(nnorwitz):
|
||||
# Now test range() with longs
|
||||
self.assertEqual(list(range(-2**100)), [])
|
||||
|
|
|
@ -581,7 +581,6 @@ range_iter(PyObject *seq)
|
|||
{
|
||||
rangeobject *r = (rangeobject *)seq;
|
||||
longrangeiterobject *it;
|
||||
PyObject *tmp, *len;
|
||||
long lstart, lstop, lstep;
|
||||
|
||||
assert(PyRange_Check(seq));
|
||||
|
@ -612,15 +611,9 @@ range_iter(PyObject *seq)
|
|||
|
||||
it->len = it->index = NULL;
|
||||
|
||||
/* Calculate length: (r->stop - r->start) / r->step */
|
||||
tmp = PyNumber_Subtract(r->stop, r->start);
|
||||
if (!tmp)
|
||||
it->len = range_length_obj(r);
|
||||
if (!it->len)
|
||||
goto create_failure;
|
||||
len = PyNumber_FloorDivide(tmp, r->step);
|
||||
Py_DECREF(tmp);
|
||||
if (!len)
|
||||
goto create_failure;
|
||||
it->len = len;
|
||||
it->index = PyLong_FromLong(0);
|
||||
if (!it->index)
|
||||
goto create_failure;
|
||||
|
|
Loading…
Reference in New Issue