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.assertEqual(take(2, zip('abc',count(3))), [('a', 3), ('b', 4)])
|
||||||
self.assertRaises(TypeError, count, 2, 3)
|
self.assertRaises(TypeError, count, 2, 3)
|
||||||
self.assertRaises(TypeError, count, 'a')
|
self.assertRaises(TypeError, count, 'a')
|
||||||
c = count(sys.maxint-2) # verify that rollover doesn't crash
|
self.assertRaises(OverflowError, list, islice(count(sys.maxint-5), 10))
|
||||||
c.next(); c.next(); c.next(); c.next(); c.next()
|
|
||||||
c = count(3)
|
c = count(3)
|
||||||
self.assertEqual(repr(c), 'count(3)')
|
self.assertEqual(repr(c), 'count(3)')
|
||||||
c.next()
|
c.next()
|
||||||
|
|
|
@ -12,6 +12,8 @@ What's New in Python 2.5.1c1?
|
||||||
Core and builtins
|
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
|
- 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
|
a weakref on itself during a __del__ call for new-style classes (classic
|
||||||
classes still have the bug).
|
classes still have the bug).
|
||||||
|
@ -103,6 +105,8 @@ Core and builtins
|
||||||
Extension Modules
|
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.
|
- Bug #1575169: operator.isSequenceType() now returns False for subclasses of dict.
|
||||||
|
|
||||||
- collections.defaultdict() now verifies that the factory function is callable.
|
- collections.defaultdict() now verifies that the factory function is callable.
|
||||||
|
|
|
@ -2073,6 +2073,11 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
count_next(countobject *lz)
|
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++);
|
return PyInt_FromSsize_t(lz->cnt++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,12 @@ enum_next(enumobject *en)
|
||||||
PyObject *result = en->en_result;
|
PyObject *result = en->en_result;
|
||||||
PyObject *it = en->en_sit;
|
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);
|
next_item = (*it->ob_type->tp_iternext)(it);
|
||||||
if (next_item == NULL)
|
if (next_item == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue