Do not let overflows in enumerate() and count() pass silently.
This commit is contained in:
parent
bbe92887ce
commit
9f0e1ea964
|
@ -52,8 +52,7 @@ class TestBasicOps(unittest.TestCase):
|
|||
self.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
|
||||
self.assertRaises(TypeError, count, 2, 3)
|
||||
self.assertRaises(TypeError, count, 'a')
|
||||
c = count(sys.maxint-2) # verify that rollover doesn't crash
|
||||
c.next(); c.next(); c.next(); c.next(); c.next()
|
||||
self.assertRaises(OverflowError, list, islice(count(sys.maxint-5), 10))
|
||||
c = count(3)
|
||||
self.assertEqual(repr(c), 'count(3)')
|
||||
c.next()
|
||||
|
|
|
@ -12,6 +12,8 @@ What's New in Python 2.5.1c1?
|
|||
Core and builtins
|
||||
-----------------
|
||||
|
||||
- SF #151204: enumerate() now raises an Overflow error at sys.maxint items.
|
||||
|
||||
- Bug #1377858: Fix the segfaulting of the interpreter when an object created
|
||||
a weakref on itself during a __del__ call for new-style classes (classic
|
||||
classes still have the bug).
|
||||
|
@ -103,6 +105,8 @@ Core and builtins
|
|||
Extension Modules
|
||||
-----------------
|
||||
|
||||
- operator.count() now raises an OverflowError when the count reaches sys.maxint.
|
||||
|
||||
- Bug #1575169: operator.isSequenceType() now returns False for subclasses of dict.
|
||||
|
||||
- collections.defaultdict() now verifies that the factory function is callable.
|
||||
|
|
|
@ -2073,6 +2073,11 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
static PyObject *
|
||||
count_next(countobject *lz)
|
||||
{
|
||||
if (lz->cnt == LONG_MAX) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"cannot count beyond LONG_MAX");
|
||||
return NULL;
|
||||
}
|
||||
return PyInt_FromSsize_t(lz->cnt++);
|
||||
}
|
||||
|
||||
|
|
|
@ -62,6 +62,12 @@ enum_next(enumobject *en)
|
|||
PyObject *result = en->en_result;
|
||||
PyObject *it = en->en_sit;
|
||||
|
||||
if (en->en_index == LONG_MAX) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"enumerate() is limited to LONG_MAX items");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
next_item = (*it->ob_type->tp_iternext)(it);
|
||||
if (next_item == NULL)
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue