Commit f4d8f390 authored by Thomas Wouters's avatar Thomas Wouters

Make xrange more Py_ssize_t aware, by assuming a Py_ssize_t is always at

least as big as a long. I believe this to be a safe assumption that is being
made in many parts of CPython, but a check could be added.

len(xrange(sys.maxint)) works now, so fix the testsuite's odd exception for
64-bit platforms too. It also fixes 'zip(xrange(sys.maxint), it)' as a
portable-ish (if expensive) alternative to enumerate(it); since zip() now
calls len(), this was breaking on (real) 64-bit platforms. No additional
test was added for that behaviour.
parent 4aaaa49b
...@@ -54,11 +54,6 @@ class XrangeTest(unittest.TestCase): ...@@ -54,11 +54,6 @@ class XrangeTest(unittest.TestCase):
self.assertRaises(OverflowError, xrange, 0, 2*sys.maxint) self.assertRaises(OverflowError, xrange, 0, 2*sys.maxint)
r = xrange(-sys.maxint, sys.maxint, 2) r = xrange(-sys.maxint, sys.maxint, 2)
if sys.maxint > 0x7fffffff:
# XXX raising ValueError is less than ideal, but this can't
# be fixed until range_length() returns a long in rangeobject.c
self.assertRaises(ValueError, len, r)
else:
self.assertEqual(len(r), sys.maxint) self.assertEqual(len(r), sys.maxint)
self.assertRaises(OverflowError, xrange, -sys.maxint-1, sys.maxint, 2) self.assertRaises(OverflowError, xrange, -sys.maxint-1, sys.maxint, 2)
......
...@@ -104,13 +104,6 @@ range_item(rangeobject *r, Py_ssize_t i) ...@@ -104,13 +104,6 @@ range_item(rangeobject *r, Py_ssize_t i)
static Py_ssize_t static Py_ssize_t
range_length(rangeobject *r) range_length(rangeobject *r)
{ {
#if LONG_MAX != INT_MAX /* XXX ssize_t_max */
if (r->len > INT_MAX) {
PyErr_SetString(PyExc_ValueError,
"xrange object size cannot be reported");
return -1;
}
#endif
return (Py_ssize_t)(r->len); return (Py_ssize_t)(r->len);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment