Skip to content

Commit 4940768

Browse files
author
rhettinger
committed
Created PyObject_GenericGetIter().
Factors out the common case of returning self. git-svn-id: http://svn.python.org/projects/python/trunk@31867 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 988298c commit 4940768

10 files changed

Lines changed: 30 additions & 147 deletions

File tree

Include/object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *);
385385
PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *);
386386
PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *);
387387
PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *);
388+
PyAPI_FUNC(PyObject *) PyObject_GenericGetIter(PyObject *);
388389
PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *);
389390
PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *,
390391
PyObject *, PyObject *);

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ Build
8686
C API
8787
-----
8888

89+
- Added PyObject_GenericGetIter() to fill the tp_iter slot for the
90+
typical case where the method returns its self argument.
91+
8992
- The extended type structure used for heap types (new-style
9093
classes defined by Python code using a class statement) is now
9194
exported from object.h as PyHeapTypeObject. (SF patch #696193.)

Modules/itertoolsmodule.c

Lines changed: 12 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,6 @@ cycle_next(cycleobject *lz)
105105
}
106106
}
107107

108-
static PyObject *
109-
cycle_getiter(PyObject *lz)
110-
{
111-
Py_INCREF(lz);
112-
return lz;
113-
}
114-
115108
PyDoc_STRVAR(cycle_doc,
116109
"cycle(iterable) --> cycle object\n\
117110
\n\
@@ -147,7 +140,7 @@ PyTypeObject cycle_type = {
147140
0, /* tp_clear */
148141
0, /* tp_richcompare */
149142
0, /* tp_weaklistoffset */
150-
(getiterfunc)cycle_getiter, /* tp_iter */
143+
PyObject_GenericGetIter, /* tp_iter */
151144
(iternextfunc)cycle_next, /* tp_iternext */
152145
0, /* tp_methods */
153146
0, /* tp_members */
@@ -261,13 +254,6 @@ dropwhile_next(dropwhileobject *lz)
261254
}
262255
}
263256

264-
static PyObject *
265-
dropwhile_getiter(PyObject *lz)
266-
{
267-
Py_INCREF(lz);
268-
return lz;
269-
}
270-
271257
PyDoc_STRVAR(dropwhile_doc,
272258
"dropwhile(predicate, iterable) --> dropwhile object\n\
273259
\n\
@@ -303,7 +289,7 @@ PyTypeObject dropwhile_type = {
303289
0, /* tp_clear */
304290
0, /* tp_richcompare */
305291
0, /* tp_weaklistoffset */
306-
(getiterfunc)dropwhile_getiter, /* tp_iter */
292+
PyObject_GenericGetIter, /* tp_iter */
307293
(iternextfunc)dropwhile_next, /* tp_iternext */
308294
0, /* tp_methods */
309295
0, /* tp_members */
@@ -416,13 +402,6 @@ takewhile_next(takewhileobject *lz)
416402
return NULL;
417403
}
418404

419-
static PyObject *
420-
takewhile_getiter(PyObject *lz)
421-
{
422-
Py_INCREF(lz);
423-
return lz;
424-
}
425-
426405
PyDoc_STRVAR(takewhile_doc,
427406
"takewhile(predicate, iterable) --> takewhile object\n\
428407
\n\
@@ -458,7 +437,7 @@ PyTypeObject takewhile_type = {
458437
0, /* tp_clear */
459438
0, /* tp_richcompare */
460439
0, /* tp_weaklistoffset */
461-
(getiterfunc)takewhile_getiter, /* tp_iter */
440+
PyObject_GenericGetIter, /* tp_iter */
462441
(iternextfunc)takewhile_next, /* tp_iternext */
463442
0, /* tp_methods */
464443
0, /* tp_members */
@@ -589,13 +568,6 @@ islice_next(isliceobject *lz)
589568
return item;
590569
}
591570

592-
static PyObject *
593-
islice_getiter(PyObject *lz)
594-
{
595-
Py_INCREF(lz);
596-
return lz;
597-
}
598-
599571
PyDoc_STRVAR(islice_doc,
600572
"islice(iterable, [start,] stop [, step]) --> islice object\n\
601573
\n\
@@ -635,7 +607,7 @@ PyTypeObject islice_type = {
635607
0, /* tp_clear */
636608
0, /* tp_richcompare */
637609
0, /* tp_weaklistoffset */
638-
(getiterfunc)islice_getiter, /* tp_iter */
610+
PyObject_GenericGetIter, /* tp_iter */
639611
(iternextfunc)islice_next, /* tp_iternext */
640612
0, /* tp_methods */
641613
0, /* tp_members */
@@ -739,13 +711,6 @@ starmap_next(starmapobject *lz)
739711
return result;
740712
}
741713

742-
static PyObject *
743-
starmap_getiter(PyObject *lz)
744-
{
745-
Py_INCREF(lz);
746-
return lz;
747-
}
748-
749714
PyDoc_STRVAR(starmap_doc,
750715
"starmap(function, sequence) --> starmap object\n\
751716
\n\
@@ -781,7 +746,7 @@ PyTypeObject starmap_type = {
781746
0, /* tp_clear */
782747
0, /* tp_richcompare */
783748
0, /* tp_weaklistoffset */
784-
(getiterfunc)starmap_getiter, /* tp_iter */
749+
PyObject_GenericGetIter, /* tp_iter */
785750
(iternextfunc)starmap_next, /* tp_iternext */
786751
0, /* tp_methods */
787752
0, /* tp_members */
@@ -930,13 +895,6 @@ imap_next(imapobject *lz)
930895
return result;
931896
}
932897

933-
static PyObject *
934-
imap_getiter(PyObject *lz)
935-
{
936-
Py_INCREF(lz);
937-
return lz;
938-
}
939-
940898
PyDoc_STRVAR(imap_doc,
941899
"imap(func, *iterables) --> imap object\n\
942900
\n\
@@ -975,7 +933,7 @@ PyTypeObject imap_type = {
975933
0, /* tp_clear */
976934
0, /* tp_richcompare */
977935
0, /* tp_weaklistoffset */
978-
(getiterfunc)imap_getiter, /* tp_iter */
936+
PyObject_GenericGetIter, /* tp_iter */
979937
(iternextfunc)imap_next, /* tp_iternext */
980938
0, /* tp_methods */
981939
0, /* tp_members */
@@ -1074,13 +1032,6 @@ chain_next(chainobject *lz)
10741032
return NULL;
10751033
}
10761034

1077-
static PyObject *
1078-
chain_getiter(PyObject *lz)
1079-
{
1080-
Py_INCREF(lz);
1081-
return lz;
1082-
}
1083-
10841035
PyDoc_STRVAR(chain_doc,
10851036
"chain(*iterables) --> chain object\n\
10861037
\n\
@@ -1117,7 +1068,7 @@ PyTypeObject chain_type = {
11171068
0, /* tp_clear */
11181069
0, /* tp_richcompare */
11191070
0, /* tp_weaklistoffset */
1120-
(getiterfunc)chain_getiter, /* tp_iter */
1071+
PyObject_GenericGetIter, /* tp_iter */
11211072
(iternextfunc)chain_next, /* tp_iternext */
11221073
0, /* tp_methods */
11231074
0, /* tp_members */
@@ -1231,13 +1182,6 @@ ifilter_next(ifilterobject *lz)
12311182
}
12321183
}
12331184

1234-
static PyObject *
1235-
ifilter_getiter(PyObject *lz)
1236-
{
1237-
Py_INCREF(lz);
1238-
return lz;
1239-
}
1240-
12411185
PyDoc_STRVAR(ifilter_doc,
12421186
"ifilter(function or None, sequence) --> ifilter object\n\
12431187
\n\
@@ -1273,7 +1217,7 @@ PyTypeObject ifilter_type = {
12731217
0, /* tp_clear */
12741218
0, /* tp_richcompare */
12751219
0, /* tp_weaklistoffset */
1276-
(getiterfunc)ifilter_getiter, /* tp_iter */
1220+
PyObject_GenericGetIter, /* tp_iter */
12771221
(iternextfunc)ifilter_next, /* tp_iternext */
12781222
0, /* tp_methods */
12791223
0, /* tp_members */
@@ -1387,13 +1331,6 @@ ifilterfalse_next(ifilterfalseobject *lz)
13871331
}
13881332
}
13891333

1390-
static PyObject *
1391-
ifilterfalse_getiter(PyObject *lz)
1392-
{
1393-
Py_INCREF(lz);
1394-
return lz;
1395-
}
1396-
13971334
PyDoc_STRVAR(ifilterfalse_doc,
13981335
"ifilterfalse(function or None, sequence) --> ifilterfalse object\n\
13991336
\n\
@@ -1429,7 +1366,7 @@ PyTypeObject ifilterfalse_type = {
14291366
0, /* tp_clear */
14301367
0, /* tp_richcompare */
14311368
0, /* tp_weaklistoffset */
1432-
(getiterfunc)ifilterfalse_getiter, /* tp_iter */
1369+
PyObject_GenericGetIter, /* tp_iter */
14331370
(iternextfunc)ifilterfalse_next, /* tp_iternext */
14341371
0, /* tp_methods */
14351372
0, /* tp_members */
@@ -1479,13 +1416,6 @@ count_next(countobject *lz)
14791416
return PyInt_FromLong(lz->cnt++);
14801417
}
14811418

1482-
static PyObject *
1483-
count_getiter(PyObject *lz)
1484-
{
1485-
Py_INCREF(lz);
1486-
return lz;
1487-
}
1488-
14891419
PyDoc_STRVAR(count_doc,
14901420
"count([firstval]) --> count object\n\
14911421
\n\
@@ -1520,7 +1450,7 @@ PyTypeObject count_type = {
15201450
0, /* tp_clear */
15211451
0, /* tp_richcompare */
15221452
0, /* tp_weaklistoffset */
1523-
(getiterfunc)count_getiter, /* tp_iter */
1453+
PyObject_GenericGetIter, /* tp_iter */
15241454
(iternextfunc)count_next, /* tp_iternext */
15251455
0, /* tp_methods */
15261456
0, /* tp_members */
@@ -1665,13 +1595,6 @@ izip_next(izipobject *lz)
16651595
return result;
16661596
}
16671597

1668-
static PyObject *
1669-
izip_getiter(PyObject *lz)
1670-
{
1671-
Py_INCREF(lz);
1672-
return lz;
1673-
}
1674-
16751598
PyDoc_STRVAR(izip_doc,
16761599
"izip(iter1 [,iter2 [...]]) --> izip object\n\
16771600
\n\
@@ -1711,7 +1634,7 @@ PyTypeObject izip_type = {
17111634
0, /* tp_clear */
17121635
0, /* tp_richcompare */
17131636
0, /* tp_weaklistoffset */
1714-
(getiterfunc)izip_getiter, /* tp_iter */
1637+
PyObject_GenericGetIter, /* tp_iter */
17151638
(iternextfunc)izip_next, /* tp_iternext */
17161639
0, /* tp_methods */
17171640
0, /* tp_members */
@@ -1784,13 +1707,6 @@ repeat_next(repeatobject *ro)
17841707
return ro->element;
17851708
}
17861709

1787-
static PyObject *
1788-
repeat_getiter(PyObject *ro)
1789-
{
1790-
Py_INCREF(ro);
1791-
return ro;
1792-
}
1793-
17941710
PyDoc_STRVAR(repeat_doc,
17951711
"repeat(element [,times]) -> create an iterator which returns the element\n\
17961712
for the specified number of times. If not specified, returns the element\n\
@@ -1825,7 +1741,7 @@ PyTypeObject repeat_type = {
18251741
0, /* tp_clear */
18261742
0, /* tp_richcompare */
18271743
0, /* tp_weaklistoffset */
1828-
(getiterfunc)repeat_getiter, /* tp_iter */
1744+
PyObject_GenericGetIter, /* tp_iter */
18291745
(iternextfunc)repeat_next, /* tp_iternext */
18301746
0, /* tp_methods */
18311747
0, /* tp_members */

Objects/dictobject.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,13 +2013,6 @@ dictiter_dealloc(dictiterobject *di)
20132013
PyObject_Del(di);
20142014
}
20152015

2016-
static PyObject *
2017-
dictiter_getiter(PyObject *it)
2018-
{
2019-
Py_INCREF(it);
2020-
return it;
2021-
}
2022-
20232016
static PyObject *dictiter_iternext(dictiterobject *di)
20242017
{
20252018
PyObject *key, *value;
@@ -2069,7 +2062,7 @@ PyTypeObject PyDictIter_Type = {
20692062
0, /* tp_clear */
20702063
0, /* tp_richcompare */
20712064
0, /* tp_weaklistoffset */
2072-
(getiterfunc)dictiter_getiter, /* tp_iter */
2065+
PyObject_GenericGetIter, /* tp_iter */
20732066
(iternextfunc)dictiter_iternext, /* tp_iternext */
20742067
0, /* tp_methods */
20752068
0, /* tp_members */

Objects/enumobject.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,6 @@ enum_next(enumobject *en)
7878
return result;
7979
}
8080

81-
static PyObject *
82-
enum_getiter(PyObject *en)
83-
{
84-
Py_INCREF(en);
85-
return en;
86-
}
87-
8881
PyDoc_STRVAR(enum_doc,
8982
"enumerate(iterable) -> create an enumerating-iterator");
9083

@@ -117,7 +110,7 @@ PyTypeObject PyEnum_Type = {
117110
0, /* tp_clear */
118111
0, /* tp_richcompare */
119112
0, /* tp_weaklistoffset */
120-
(getiterfunc)enum_getiter, /* tp_iter */
113+
PyObject_GenericGetIter, /* tp_iter */
121114
(iternextfunc)enum_next, /* tp_iternext */
122115
0, /* tp_methods */
123116
0, /* tp_members */

Objects/iterobject.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,6 @@ iter_traverse(seqiterobject *it, visitproc visit, void *arg)
4343
return visit(it->it_seq, arg);
4444
}
4545

46-
static PyObject *
47-
iter_getiter(PyObject *it)
48-
{
49-
Py_INCREF(it);
50-
return it;
51-
}
52-
5346
static PyObject *
5447
iter_iternext(PyObject *iterator)
5548
{
@@ -106,7 +99,7 @@ PyTypeObject PySeqIter_Type = {
10699
0, /* tp_clear */
107100
0, /* tp_richcompare */
108101
0, /* tp_weaklistoffset */
109-
(getiterfunc)iter_getiter, /* tp_iter */
102+
PyObject_GenericGetIter, /* tp_iter */
110103
(iternextfunc)iter_iternext, /* tp_iternext */
111104
0, /* tp_methods */
112105
0, /* tp_members */
@@ -223,7 +216,7 @@ PyTypeObject PyCallIter_Type = {
223216
0, /* tp_clear */
224217
0, /* tp_richcompare */
225218
0, /* tp_weaklistoffset */
226-
(getiterfunc)iter_getiter, /* tp_iter */
219+
PyObject_GenericGetIter, /* tp_iter */
227220
(iternextfunc)calliter_iternext, /* tp_iternext */
228221
0, /* tp_methods */
229222
0, /* tp_members */

Objects/listobject.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2398,14 +2398,6 @@ listiter_traverse(listiterobject *it, visitproc visit, void *arg)
23982398
return visit((PyObject *)it->it_seq, arg);
23992399
}
24002400

2401-
2402-
static PyObject *
2403-
listiter_getiter(PyObject *it)
2404-
{
2405-
Py_INCREF(it);
2406-
return it;
2407-
}
2408-
24092401
static PyObject *
24102402
listiter_next(listiterobject *it)
24112403
{
@@ -2458,7 +2450,7 @@ PyTypeObject PyListIter_Type = {
24582450
0, /* tp_clear */
24592451
0, /* tp_richcompare */
24602452
0, /* tp_weaklistoffset */
2461-
(getiterfunc)listiter_getiter, /* tp_iter */
2453+
PyObject_GenericGetIter, /* tp_iter */
24622454
(iternextfunc)listiter_next, /* tp_iternext */
24632455
0, /* tp_methods */
24642456
0, /* tp_members */

0 commit comments

Comments
 (0)