diff options
| author | Guido van Rossum <guido@python.org> | 2006-08-17 21:11:47 +0000 | 
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 2006-08-17 21:11:47 +0000 | 
| commit | 49d6b07c6b4b16d35f160726a59de819d077ee30 (patch) | |
| tree | 45686ed91cc46f46e206bb52a45d7c8abd3cf67b | |
| parent | bf12cdbb2880eb402f65ce8d1db09caa84c6b801 (diff) | |
| download | cpython-git-49d6b07c6b4b16d35f160726a59de819d077ee30.tar.gz | |
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 45942a66ef..226a16809e 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 34f9371658..517ecfddfe 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 3ba85e6438..7ba15a00f8 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 a87916c15c..e63e629309 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 */  | 
