mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Make the it_index field in the str/unicode iterators Py_ssize_t's.
Test the new iterators on str/unicode.
This commit is contained in:
parent
bf12cdbb28
commit
49d6b07c6b
4 changed files with 31 additions and 10 deletions
|
@ -19,6 +19,14 @@ class StrTest(
|
||||||
string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
|
string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
|
||||||
self.assertRaises(OverflowError, '%c'.__mod__, 0x1234)
|
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):
|
def test_conversion(self):
|
||||||
# Make sure __str__() behaves properly
|
# Make sure __str__() behaves properly
|
||||||
class Foo0:
|
class Foo0:
|
||||||
|
|
|
@ -93,6 +93,14 @@ class UnicodeTest(
|
||||||
testrepr = repr(u''.join(map(unichr, xrange(256))))
|
testrepr = repr(u''.join(map(unichr, xrange(256))))
|
||||||
self.assertEqual(testrepr, latin1repr)
|
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):
|
def test_count(self):
|
||||||
string_tests.CommonTest.test_count(self)
|
string_tests.CommonTest.test_count(self)
|
||||||
# check mixed argument types
|
# check mixed argument types
|
||||||
|
|
|
@ -4992,7 +4992,7 @@ void _Py_ReleaseInternedStrings(void)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
long it_index;
|
Py_ssize_t it_index;
|
||||||
PyStringObject *it_seq; /* Set to NULL when iterator is exhausted */
|
PyStringObject *it_seq; /* Set to NULL when iterator is exhausted */
|
||||||
} striterobject;
|
} striterobject;
|
||||||
|
|
||||||
|
@ -5024,7 +5024,8 @@ striter_next(striterobject *it)
|
||||||
assert(PyString_Check(seq));
|
assert(PyString_Check(seq));
|
||||||
|
|
||||||
if (it->it_index < PyString_GET_SIZE(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)
|
if (item != NULL)
|
||||||
++it->it_index;
|
++it->it_index;
|
||||||
return item;
|
return item;
|
||||||
|
@ -5044,18 +5045,20 @@ striter_len(striterobject *it)
|
||||||
return PyInt_FromSsize_t(len);
|
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[] = {
|
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 */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject PyStringIter_Type = {
|
PyTypeObject PyStringIter_Type = {
|
||||||
PyObject_HEAD_INIT(&PyType_Type)
|
PyObject_HEAD_INIT(&PyType_Type)
|
||||||
0, /* ob_size */
|
0, /* ob_size */
|
||||||
"striterator", /* tp_name */
|
"striterator", /* tp_name */
|
||||||
sizeof(striterobject), /* tp_basicsize */
|
sizeof(striterobject), /* tp_basicsize */
|
||||||
0, /* tp_itemsize */
|
0, /* tp_itemsize */
|
||||||
/* methods */
|
/* methods */
|
||||||
(destructor)striter_dealloc, /* tp_dealloc */
|
(destructor)striter_dealloc, /* tp_dealloc */
|
||||||
|
|
|
@ -7969,7 +7969,7 @@ _PyUnicode_Fini(void)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
long it_index;
|
Py_ssize_t it_index;
|
||||||
PyUnicodeObject *it_seq; /* Set to NULL when iterator is exhausted */
|
PyUnicodeObject *it_seq; /* Set to NULL when iterator is exhausted */
|
||||||
} unicodeiterobject;
|
} unicodeiterobject;
|
||||||
|
|
||||||
|
@ -8001,7 +8001,8 @@ unicodeiter_next(unicodeiterobject *it)
|
||||||
assert(PyUnicode_Check(seq));
|
assert(PyUnicode_Check(seq));
|
||||||
|
|
||||||
if (it->it_index < PyUnicode_GET_SIZE(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)
|
if (item != NULL)
|
||||||
++it->it_index;
|
++it->it_index;
|
||||||
return item;
|
return item;
|
||||||
|
@ -8024,7 +8025,8 @@ unicodeiter_len(unicodeiterobject *it)
|
||||||
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 unicodeiter_methods[] = {
|
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 */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -8035,7 +8037,7 @@ PyTypeObject PyUnicodeIter_Type = {
|
||||||
sizeof(unicodeiterobject), /* tp_basicsize */
|
sizeof(unicodeiterobject), /* tp_basicsize */
|
||||||
0, /* tp_itemsize */
|
0, /* tp_itemsize */
|
||||||
/* methods */
|
/* methods */
|
||||||
(destructor)unicodeiter_dealloc, /* tp_dealloc */
|
(destructor)unicodeiter_dealloc, /* tp_dealloc */
|
||||||
0, /* tp_print */
|
0, /* tp_print */
|
||||||
0, /* tp_getattr */
|
0, /* tp_getattr */
|
||||||
0, /* tp_setattr */
|
0, /* tp_setattr */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue