From 4442e2c8e4ebf408336e7e2100b25eebcafa1555 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Wed, 24 Jun 2009 19:22:42 +0000 Subject: [PATCH] Merged revisions 73547-73548 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r73547 | mark.dickinson | 2009-06-24 19:36:46 +0100 (Wed, 24 Jun 2009) | 1 line Issue #6334: Fix buggy internal length calculation in builtin range function ........ r73548 | mark.dickinson | 2009-06-24 20:01:32 +0100 (Wed, 24 Jun 2009) | 1 line Misc/NEWS entry for r73547 ........ --- Lib/test/test_builtin.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ Objects/rangeobject.c | 11 ++--------- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index a62e1244c2d6..fdb0ea28f512 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -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)), []) diff --git a/Misc/NEWS b/Misc/NEWS index 1b61ff7506eb..7a162824368d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 3.0.2? Core and Builtins ----------------- +- Issue #6334: Fix bug in range length calculation for ranges with + large arguments. + - Fixed SystemError triggered by "range([], 1, -1)". - Issue #5924: On Windows, a large PYTHONPATH environment variable diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index f8174caa4268..11fd32e35c70 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -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; -- 2.47.3