Mercurial > cpython-lru_cache-weakref
annotate Objects/enumobject.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 4ff234337e24 |
| children |
| rev | line source |
|---|---|
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /* enumerate object */ |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 #include "Python.h" |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
6 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
7 Py_ssize_t en_index; /* current index of enumeration */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
8 PyObject* en_sit; /* secondary iterator of enumeration */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
9 PyObject* en_result; /* result tuple */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
10 PyObject* en_longindex; /* index for sequences >= PY_SSIZE_T_MAX */ |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 } enumobject; |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 static PyObject * |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 enum_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
16 enumobject *en; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
17 PyObject *seq = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
18 PyObject *start = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
19 static char *kwlist[] = {"iterable", "start", 0}; |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
21 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
22 &seq, &start)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
23 return NULL; |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
25 en = (enumobject *)type->tp_alloc(type, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
26 if (en == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
27 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
28 if (start != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
29 start = PyNumber_Index(start); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
30 if (start == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
31 Py_DECREF(en); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
32 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
33 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
34 assert(PyLong_Check(start)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
35 en->en_index = PyLong_AsSsize_t(start); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
36 if (en->en_index == -1 && PyErr_Occurred()) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
37 PyErr_Clear(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
38 en->en_index = PY_SSIZE_T_MAX; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
39 en->en_longindex = start; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
40 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
41 en->en_longindex = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
42 Py_DECREF(start); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
43 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
44 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
45 en->en_index = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
46 en->en_longindex = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
47 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
48 en->en_sit = PyObject_GetIter(seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
49 if (en->en_sit == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
50 Py_DECREF(en); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
51 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
52 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
53 en->en_result = PyTuple_Pack(2, Py_None, Py_None); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
54 if (en->en_result == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
55 Py_DECREF(en); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
56 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
57 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
58 return (PyObject *)en; |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 } |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 static void |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 enum_dealloc(enumobject *en) |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
64 PyObject_GC_UnTrack(en); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
65 Py_XDECREF(en->en_sit); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
66 Py_XDECREF(en->en_result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
67 Py_XDECREF(en->en_longindex); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
68 Py_TYPE(en)->tp_free(en); |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 } |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 static int |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 enum_traverse(enumobject *en, visitproc visit, void *arg) |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
74 Py_VISIT(en->en_sit); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
75 Py_VISIT(en->en_result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
76 Py_VISIT(en->en_longindex); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
77 return 0; |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 } |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
79 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 static PyObject * |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
81 enum_next_long(enumobject *en, PyObject* next_item) |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
82 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
83 static PyObject *one = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
84 PyObject *result = en->en_result; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
85 PyObject *next_index; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
86 PyObject *stepped_up; |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
87 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
88 if (en->en_longindex == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
89 en->en_longindex = PyLong_FromSsize_t(PY_SSIZE_T_MAX); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
90 if (en->en_longindex == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
91 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
92 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
93 if (one == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
94 one = PyLong_FromLong(1); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
95 if (one == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
96 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
97 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
98 next_index = en->en_longindex; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
99 assert(next_index != NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
100 stepped_up = PyNumber_Add(next_index, one); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
101 if (stepped_up == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
102 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
103 en->en_longindex = stepped_up; |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
104 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
105 if (result->ob_refcnt == 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
106 Py_INCREF(result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
107 Py_DECREF(PyTuple_GET_ITEM(result, 0)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
108 Py_DECREF(PyTuple_GET_ITEM(result, 1)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
109 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
110 result = PyTuple_New(2); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
111 if (result == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
112 Py_DECREF(next_index); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
113 Py_DECREF(next_item); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
114 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
115 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
116 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
117 PyTuple_SET_ITEM(result, 0, next_index); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
118 PyTuple_SET_ITEM(result, 1, next_item); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
119 return result; |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
120 } |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
121 |
|
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
122 static PyObject * |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 enum_next(enumobject *en) |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
125 PyObject *next_index; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
126 PyObject *next_item; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
127 PyObject *result = en->en_result; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
128 PyObject *it = en->en_sit; |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
130 next_item = (*Py_TYPE(it)->tp_iternext)(it); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
131 if (next_item == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
132 return NULL; |
|
24261
27e94cacb43b
Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
133 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
134 if (en->en_index == PY_SSIZE_T_MAX) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
135 return enum_next_long(en, next_item); |
|
43734
3e5edf19d5f0
Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
136 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
137 next_index = PyLong_FromSsize_t(en->en_index); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
138 if (next_index == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
139 Py_DECREF(next_item); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
140 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
141 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
142 en->en_index++; |
| 29289 | 143 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
144 if (result->ob_refcnt == 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
145 Py_INCREF(result); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
146 Py_DECREF(PyTuple_GET_ITEM(result, 0)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
147 Py_DECREF(PyTuple_GET_ITEM(result, 1)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
148 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
149 result = PyTuple_New(2); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
150 if (result == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
151 Py_DECREF(next_index); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
152 Py_DECREF(next_item); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
153 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
154 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
155 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
156 PyTuple_SET_ITEM(result, 0, next_index); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
157 PyTuple_SET_ITEM(result, 1, next_item); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
158 return result; |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 } |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
161 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
162 enum_reduce(enumobject *en) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
163 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
164 if (en->en_longindex != NULL) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
165 return Py_BuildValue("O(OO)", Py_TYPE(en), en->en_sit, en->en_longindex); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
166 else |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
167 return Py_BuildValue("O(On)", Py_TYPE(en), en->en_sit, en->en_index); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
168 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
169 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
170 PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
171 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
172 static PyMethodDef enum_methods[] = { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
173 {"__reduce__", (PyCFunction)enum_reduce, METH_NOARGS, reduce_doc}, |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
174 {NULL, NULL} /* sentinel */ |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
175 }; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
176 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23285
diff
changeset
|
177 PyDoc_STRVAR(enum_doc, |
|
62566
504c499e8c95
Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
178 "enumerate(iterable[, start]) -> iterator for index, value of iterable\n" |
|
28711
820d9570edeb
Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28320
diff
changeset
|
179 "\n" |
|
56216
a07568c7a82a
Merged revisions 75057 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
54326
diff
changeset
|
180 "Return an enumerate object. iterable must be another object that supports\n" |
|
28711
820d9570edeb
Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
28320
diff
changeset
|
181 "iteration. The enumerate object yields pairs containing a count (from\n" |
|
62566
504c499e8c95
Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
182 "start, which defaults to zero) and a value yielded by the iterable argument.\n" |
|
504c499e8c95
Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
183 "enumerate is useful for obtaining an indexed list:\n" |
|
504c499e8c95
Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
184 " (0, seq[0]), (1, seq[1]), (2, seq[2]), ..."); |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 |
|
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
186 PyTypeObject PyEnum_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
187 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
188 "enumerate", /* tp_name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
189 sizeof(enumobject), /* tp_basicsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
190 0, /* tp_itemsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
191 /* methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
192 (destructor)enum_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
193 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
194 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
195 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
196 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
197 0, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
198 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
199 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
200 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
201 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
202 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
203 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
204 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
205 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
206 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
207 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
208 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
209 enum_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
210 (traverseproc)enum_traverse, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
211 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
212 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
213 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
214 PyObject_SelfIter, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
215 (iternextfunc)enum_next, /* tp_iternext */ |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
216 enum_methods, /* tp_methods */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
217 0, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
218 0, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
219 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
220 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
221 0, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
222 0, /* tp_descr_set */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
223 0, /* tp_dictoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
224 0, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
225 PyType_GenericAlloc, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
226 enum_new, /* tp_new */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
227 PyObject_GC_Del, /* tp_free */ |
|
23285
afe263672fd8
- New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 }; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
229 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
230 /* Reversed Object ***************************************************************/ |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
231 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
232 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
233 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
234 Py_ssize_t index; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
235 PyObject* seq; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
236 } reversedobject; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
237 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
238 static PyObject * |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
239 reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
240 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
241 Py_ssize_t n; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
242 PyObject *seq, *reversed_meth; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
243 reversedobject *ro; |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
62566
diff
changeset
|
244 _Py_IDENTIFIER(__reversed__); |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
245 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
246 if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
247 return NULL; |
|
47109
a02bc2a84d19
Merged revisions 63361-63373,63375,63377-63380 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
47097
diff
changeset
|
248 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
249 if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) ) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
250 return NULL; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
251 |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
62566
diff
changeset
|
252 reversed_meth = _PyObject_LookupSpecial(seq, &PyId___reversed__); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
253 if (reversed_meth != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
254 PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
255 Py_DECREF(reversed_meth); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
256 return res; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
257 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
258 else if (PyErr_Occurred()) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
259 return NULL; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
260 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
261 if (!PySequence_Check(seq)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
262 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
263 "argument to reversed() must be a sequence"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
264 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
265 } |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
266 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
267 n = PySequence_Size(seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
268 if (n == -1) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
269 return NULL; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
270 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
271 ro = (reversedobject *)type->tp_alloc(type, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
272 if (ro == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
273 return NULL; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
274 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
275 ro->index = n-1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
276 Py_INCREF(seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
277 ro->seq = seq; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
278 return (PyObject *)ro; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
279 } |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
280 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
281 static void |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
282 reversed_dealloc(reversedobject *ro) |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
283 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
284 PyObject_GC_UnTrack(ro); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
285 Py_XDECREF(ro->seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
286 Py_TYPE(ro)->tp_free(ro); |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
287 } |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
288 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
289 static int |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
290 reversed_traverse(reversedobject *ro, visitproc visit, void *arg) |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
291 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
292 Py_VISIT(ro->seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
293 return 0; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
294 } |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
295 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
296 static PyObject * |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
297 reversed_next(reversedobject *ro) |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
298 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
299 PyObject *item; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
300 Py_ssize_t index = ro->index; |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
301 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
302 if (index >= 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
303 item = PySequence_GetItem(ro->seq, index); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
304 if (item != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
305 ro->index--; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
306 return item; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
307 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
308 if (PyErr_ExceptionMatches(PyExc_IndexError) || |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
309 PyErr_ExceptionMatches(PyExc_StopIteration)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
310 PyErr_Clear(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
311 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
312 ro->index = -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
313 Py_CLEAR(ro->seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
314 return NULL; |
|
31502
59538d3b7cd2
Make reversed() transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31478
diff
changeset
|
315 } |
|
59538d3b7cd2
Make reversed() transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents:
31478
diff
changeset
|
316 |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
317 PyDoc_STRVAR(reversed_doc, |
| 33273 | 318 "reversed(sequence) -> reverse iterator over values of the sequence\n" |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
319 "\n" |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
320 "Return a reverse iterator"); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
321 |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
322 static PyObject * |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
31634
diff
changeset
|
323 reversed_len(reversedobject *ro) |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
31634
diff
changeset
|
324 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
325 Py_ssize_t position, seqsize; |
|
31908
058821d8aefd
* Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents:
31635
diff
changeset
|
326 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
327 if (ro->seq == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
328 return PyLong_FromLong(0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
329 seqsize = PySequence_Size(ro->seq); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
330 if (seqsize == -1) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
331 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
332 position = ro->index + 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
333 return PyLong_FromSsize_t((seqsize < position) ? 0 : position); |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
31634
diff
changeset
|
334 } |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
31634
diff
changeset
|
335 |
|
36484
20f75d5e79e9
Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents:
36002
diff
changeset
|
336 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
337 |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
338 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
339 reversed_reduce(reversedobject *ro) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
340 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
341 if (ro->seq) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
342 return Py_BuildValue("O(O)n", Py_TYPE(ro), ro->seq, ro->index); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
343 else |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
344 return Py_BuildValue("O(())", Py_TYPE(ro)); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
345 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
346 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
347 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
348 reversed_setstate(reversedobject *ro, PyObject *state) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
349 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
350 Py_ssize_t index = PyLong_AsSsize_t(state); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
351 if (index == -1 && PyErr_Occurred()) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
352 return NULL; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
353 if (ro->seq != 0) { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
354 Py_ssize_t n = PySequence_Size(ro->seq); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
355 if (n < 0) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
356 return NULL; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
357 if (index < -1) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
358 index = -1; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
359 else if (index > n-1) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
360 index = n-1; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
361 ro->index = index; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
362 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
363 Py_RETURN_NONE; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
364 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
365 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
366 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling."); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
367 |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
33386
diff
changeset
|
368 static PyMethodDef reversediter_methods[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
369 {"__length_hint__", (PyCFunction)reversed_len, METH_NOARGS, length_hint_doc}, |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
370 {"__reduce__", (PyCFunction)reversed_reduce, METH_NOARGS, reduce_doc}, |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
74578
diff
changeset
|
371 {"__setstate__", (PyCFunction)reversed_setstate, METH_O, setstate_doc}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
372 {NULL, NULL} /* sentinel */ |
|
31478
f30aaac00195
Let reversed() work with itself.
Raymond Hettinger <python@rcn.com>
parents:
31466
diff
changeset
|
373 }; |
|
f30aaac00195
Let reversed() work with itself.
Raymond Hettinger <python@rcn.com>
parents:
31466
diff
changeset
|
374 |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
375 PyTypeObject PyReversed_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
376 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
377 "reversed", /* tp_name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
378 sizeof(reversedobject), /* tp_basicsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
379 0, /* tp_itemsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
380 /* methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
381 (destructor)reversed_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
382 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
383 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
384 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
385 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
386 0, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
387 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
388 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
389 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
390 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
391 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
392 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
393 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
394 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
395 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
396 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
397 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
398 reversed_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
399 (traverseproc)reversed_traverse,/* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
400 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
401 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
402 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
403 PyObject_SelfIter, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
404 (iternextfunc)reversed_next, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
405 reversediter_methods, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
406 0, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
407 0, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
408 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
409 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
410 0, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
411 0, /* tp_descr_set */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
412 0, /* tp_dictoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
413 0, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
414 PyType_GenericAlloc, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
415 reversed_new, /* tp_new */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56216
diff
changeset
|
416 PyObject_GC_Del, /* tp_free */ |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
30835
diff
changeset
|
417 }; |
