]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 73547-73548 via svnmerge from
authorMark Dickinson <dickinsm@gmail.com>
Wed, 24 Jun 2009 19:22:42 +0000 (19:22 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Wed, 24 Jun 2009 19:22:42 +0000 (19:22 +0000)
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
Misc/NEWS
Objects/rangeobject.c

index a62e1244c2d632abd8172aaa04b4f43bcb3ed59b..fdb0ea28f51260842b37dc11065747de861e9b79 100644 (file)
@@ -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)), [])
index 1b61ff7506eb3c42b00ec28775890662ede1f77d..7a162824368dac565d5367ee16c0d338df2ca68d 100644 (file)
--- 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
index f8174caa4268983dc13f35dc3f2fe010e46f7f4d..11fd32e35c70efbcee0c577cc323435ba7ed615d 100644 (file)
@@ -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;