diff options
author | Guido van Rossum <guido@python.org> | 2006-08-17 21:11:47 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2006-08-17 21:11:47 (GMT) |
commit | 49d6b07c6b4b16d35f160726a59de819d077ee30 (patch) | |
tree | 45686ed91cc46f46e206bb52a45d7c8abd3cf67b | |
parent | bf12cdbb2880eb402f65ce8d1db09caa84c6b801 (diff) | |
download | cpython-49d6b07c6b4b16d35f160726a59de819d077ee30.zip cpython-49d6b07c6b4b16d35f160726a59de819d077ee30.tar.gz cpython-49d6b07c6b4b16d35f160726a59de819d077ee30.tar.bz2 |
Make the it_index field in the str/unicode iterators Py_ssize_t's.
Test the new iterators on str/unicode.
-rw-r--r-- | Lib/test/test_str.py | 8 | ||||
-rw-r--r-- | Lib/test/test_unicode.py | 8 | ||||
-rw-r--r-- | Objects/stringobject.c | 15 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 10 |
4 files changed, 31 insertions, 10 deletions
diff --git a/Lib/test/test_str.py b/Lib/test/test_str.py index 45942a6..226a168 100644 --- a/Lib/test/test_str.py +++ b/Lib/test/test_str.py @@ -19,6 +19,14 @@ class StrTest( string_tests.MixinStrUnicodeUserStringTest.test_formatting(self) self.assertRaises(OverflowError, '%c'.__mod__, 0x1234) + def test_iterators(self): + # Make sure str objects have an __iter__ method + it = "abc".__iter__() + self.assertEqual(it.next(), "a") + self.assertEqual(it.next(), "b") + self.assertEqual(it.next(), "c") + self.assertRaises(StopIteration, it.next) + def test_conversion(self): # Make sure __str__() behaves properly class Foo0: diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 34f9371..517ecfd 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -93,6 +93,14 @@ class UnicodeTest( testrepr = repr(u''.join(map(unichr, xrange(256)))) self.assertEqual(testrepr, latin1repr) + def test_iterators(self): + # Make sure unicode objects have an __iter__ method + it = u"\u1111\u2222\u3333".__iter__() + self.assertEqual(it.next(), u"\u1111") + self.assertEqual(it.next(), u"\u2222") + self.assertEqual(it.next(), u"\u3333") + self.assertRaises(StopIteration, it.next) + def test_count(self): string_tests.CommonTest.test_count(self) # check mixed argument types diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 3ba85e6..7ba15a0 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -4992,7 +4992,7 @@ void _Py_ReleaseInternedStrings(void) typedef struct { PyObject_HEAD - long it_index; + Py_ssize_t it_index; PyStringObject *it_seq; /* Set to NULL when iterator is exhausted */ } striterobject; @@ -5024,7 +5024,8 @@ striter_next(striterobject *it) assert(PyString_Check(seq)); if (it->it_index < PyString_GET_SIZE(seq)) { - item = PyString_FromStringAndSize(PyString_AS_STRING(seq)+it->it_index, 1); + item = PyString_FromStringAndSize( + PyString_AS_STRING(seq)+it->it_index, 1); if (item != NULL) ++it->it_index; return item; @@ -5044,18 +5045,20 @@ striter_len(striterobject *it) return PyInt_FromSsize_t(len); } -PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); +PyDoc_STRVAR(length_hint_doc, + "Private method returning an estimate of len(list(it))."); static PyMethodDef striter_methods[] = { - {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS, length_hint_doc}, + {"__length_hint__", (PyCFunction)striter_len, METH_NOARGS, + length_hint_doc}, {NULL, NULL} /* sentinel */ }; PyTypeObject PyStringIter_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ - "striterator", /* tp_name */ - sizeof(striterobject), /* tp_basicsize */ + "striterator", /* tp_name */ + sizeof(striterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)striter_dealloc, /* tp_dealloc */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index a87916c..e63e629 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7969,7 +7969,7 @@ _PyUnicode_Fini(void) typedef struct { PyObject_HEAD - long it_index; + Py_ssize_t it_index; PyUnicodeObject *it_seq; /* Set to NULL when iterator is exhausted */ } unicodeiterobject; @@ -8001,7 +8001,8 @@ unicodeiter_next(unicodeiterobject *it) assert(PyUnicode_Check(seq)); if (it->it_index < PyUnicode_GET_SIZE(seq)) { - item = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(seq)+it->it_index, 1); + item = PyUnicode_FromUnicode( + PyUnicode_AS_UNICODE(seq)+it->it_index, 1); if (item != NULL) ++it->it_index; return item; @@ -8024,7 +8025,8 @@ unicodeiter_len(unicodeiterobject *it) PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); static PyMethodDef unicodeiter_methods[] = { - {"__length_hint__", (PyCFunction)unicodeiter_len, METH_NOARGS, length_hint_doc}, + {"__length_hint__", (PyCFunction)unicodeiter_len, METH_NOARGS, + length_hint_doc}, {NULL, NULL} /* sentinel */ }; @@ -8035,7 +8037,7 @@ PyTypeObject PyUnicodeIter_Type = { sizeof(unicodeiterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ - (destructor)unicodeiter_dealloc, /* tp_dealloc */ + (destructor)unicodeiter_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ |