diff -r 43b1b3c883ff Lib/_collections_abc.py --- a/Lib/_collections_abc.py Sat Oct 08 16:15:38 2016 +0300 +++ b/Lib/_collections_abc.py Sat Oct 08 19:08:08 2016 +0300 @@ -29,8 +29,8 @@ # so that they will pass tests like: # it = iter(somebytearray) # assert isinstance(it, Iterable) -# Note: in other implementations, these types many not be distinct -# and they make have their own implementation specific types that +# Note: in other implementations, these types might not be distinct +# and they may have their own implementation specific types that # are not included on this list. bytes_iterator = type(iter(b'')) bytearray_iterator = type(iter(bytearray())) @@ -41,6 +41,7 @@ list_iterator = type(iter([])) list_reverseiterator = type(iter(reversed([]))) range_iterator = type(iter(range(0))) +longrange_iterator = type(iter(range(1 << 1000))) set_iterator = type(iter(set())) str_iterator = type(iter("")) tuple_iterator = type(iter(())) @@ -225,6 +226,7 @@ Iterator.register(list_iterator) Iterator.register(list_reverseiterator) Iterator.register(range_iterator) +Iterator.register(longrange_iterator) Iterator.register(set_iterator) Iterator.register(str_iterator) Iterator.register(tuple_iterator) diff -r 43b1b3c883ff Lib/test/test_range.py --- a/Lib/test/test_range.py Sat Oct 08 16:15:38 2016 +0300 +++ b/Lib/test/test_range.py Sat Oct 08 19:08:08 2016 +0300 @@ -4,6 +4,8 @@ import sys import pickle import itertools +import test.support +import re # pure Python implementations (3 args only), for comparison def pyrange(start, stop, step): @@ -493,6 +495,14 @@ test_id = "reversed(range({}, {}, {}))".format(start, end, step) self.assert_iterators_equal(iter1, iter2, test_id, limit=100) + def test_range_iterators_invocation(self): + # verify range iterators instances cannot be created by + # calling their type + rangeiter_type = type(iter(range(0))) + long_rangeiter_type = type(iter(range(1 << 1000))) + for iter_type in [rangeiter_type, long_rangeiter_type]: + self.assertRaises(TypeError, iter_type, 1, 3, 1) + def test_slice(self): def check(start, stop, step=None): i = slice(start, stop, step) diff -r 43b1b3c883ff Objects/rangeobject.c --- a/Objects/rangeobject.c Sat Oct 08 16:15:38 2016 +0300 +++ b/Objects/rangeobject.c Sat Oct 08 19:08:08 2016 +0300 @@ -862,15 +862,6 @@ (iternextfunc)rangeiter_next, /* tp_iternext */ rangeiter_methods, /* tp_methods */ 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - rangeiter_new, /* tp_new */ }; /* Return number of items in range (lo, hi, step). step != 0 @@ -925,21 +916,6 @@ return (PyObject *)it; } -static PyObject * -rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw) -{ - long start, stop, step; - - if (!_PyArg_NoKeywords("rangeiter()", kw)) - return NULL; - - if (!PyArg_ParseTuple(args, "lll;rangeiter() requires 3 int arguments", - &start, &stop, &step)) - return NULL; - - return fast_range_iter(start, stop, step); -} - typedef struct { PyObject_HEAD PyObject *index;