annotate Objects/enumobject.c @ 49955:878d40468c4e legacy-trunk

Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
author Vinay Sajip <vinay_sajip@yahoo.co.uk>
date Wed, 03 Dec 2008 23:22:58 +0000
parents 4203b7f087c1
children e073fc88dc89 73986a9ca1d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 {
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 PyObject_HEAD
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
7 Py_ssize_t en_index; /* current index of enumeration */
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 PyObject* en_sit; /* secondary iterator of enumeration */
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
9 PyObject* en_result; /* result tuple */
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
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 {
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 enumobject *en;
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 PyObject *seq = NULL;
46982
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
18 PyObject *start = NULL;
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
19 static char *kwlist[] = {"sequence", "start", 0};
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
46982
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
21 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist,
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
22 &seq, &start))
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 return NULL;
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 en = (enumobject *)type->tp_alloc(type, 0);
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 if (en == NULL)
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 return NULL;
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
28 if (start != NULL) {
46982
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
29 start = PyNumber_Index(start);
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
30 if (start == NULL) {
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
31 Py_DECREF(en);
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
32 return NULL;
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
33 }
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
34 assert(PyInt_Check(start) || PyLong_Check(start));
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
35 en->en_index = PyInt_AsSsize_t(start);
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
36 if (en->en_index == -1 && PyErr_Occurred()) {
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
37 PyErr_Clear();
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
38 en->en_index = PY_SSIZE_T_MAX;
46982
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
39 en->en_longindex = start;
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
40 } else {
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
41 en->en_longindex = NULL;
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
42 Py_DECREF(start);
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
43 }
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
44 } else {
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
45 en->en_index = 0;
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
46 en->en_longindex = NULL;
47692f6c815e #2831: add start argument to enumerate(). Patch by Scott Dial and me.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
47 }
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 en->en_sit = PyObject_GetIter(seq);
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 if (en->en_sit == NULL) {
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 Py_DECREF(en);
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 return NULL;
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 }
30835
562143c1c7ae Use PyTuple_Pack() to simplify enumerate().
Raymond Hettinger <python@rcn.com>
parents: 29289
diff changeset
53 en->en_result = PyTuple_Pack(2, Py_None, Py_None);
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
54 if (en->en_result == NULL) {
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
55 Py_DECREF(en);
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
56 return NULL;
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
57 }
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 return (PyObject *)en;
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 {
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 PyObject_GC_UnTrack(en);
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 Py_XDECREF(en->en_sit);
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
66 Py_XDECREF(en->en_result);
43457
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
67 Py_XDECREF(en->en_longindex);
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43457
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 {
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
74 Py_VISIT(en->en_sit);
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
75 Py_VISIT(en->en_result);
43457
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
76 Py_VISIT(en->en_longindex);
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 return 0;
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 *
43457
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
81 enum_next_long(enumobject *en, PyObject* next_item)
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
82 {
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
83 static PyObject *one = NULL;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
84 PyObject *result = en->en_result;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
85 PyObject *next_index;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
86 PyObject *stepped_up;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
87
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
88 if (en->en_longindex == NULL) {
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
89 en->en_longindex = PyInt_FromSsize_t(PY_SSIZE_T_MAX);
43457
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
90 if (en->en_longindex == NULL)
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
91 return NULL;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
92 }
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
93 if (one == NULL) {
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
94 one = PyInt_FromLong(1);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
95 if (one == NULL)
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
96 return NULL;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
97 }
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
98 next_index = en->en_longindex;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
99 assert(next_index != NULL);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
100 stepped_up = PyNumber_Add(next_index, one);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
101 if (stepped_up == NULL)
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
102 return NULL;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
103 en->en_longindex = stepped_up;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
104
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
105 if (result->ob_refcnt == 1) {
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
106 Py_INCREF(result);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
107 Py_DECREF(PyTuple_GET_ITEM(result, 0));
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
108 Py_DECREF(PyTuple_GET_ITEM(result, 1));
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
109 } else {
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
110 result = PyTuple_New(2);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
111 if (result == NULL) {
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
112 Py_DECREF(next_index);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
113 Py_DECREF(next_item);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
114 return NULL;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
115 }
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
116 }
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
117 PyTuple_SET_ITEM(result, 0, next_index);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
118 PyTuple_SET_ITEM(result, 1, next_item);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
119 return result;
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
120 }
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
121
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
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 {
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 PyObject *next_index;
24261
27e94cacb43b Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
126 PyObject *next_item;
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
127 PyObject *result = en->en_result;
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
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
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43457
diff changeset
130 next_item = (*Py_TYPE(it)->tp_iternext)(it);
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
131 if (next_item == NULL)
24261
27e94cacb43b Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
132 return NULL;
27e94cacb43b Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
133
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
134 if (en->en_index == PY_SSIZE_T_MAX)
43457
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
135 return enum_next_long(en, next_item);
b12cf467b05c enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
Raymond Hettinger <python@rcn.com>
parents: 42333
diff changeset
136
48065
4203b7f087c1 Convert from long to Py_ssize_t.
Raymond Hettinger <python@rcn.com>
parents: 47096
diff changeset
137 next_index = PyInt_FromSsize_t(en->en_index);
24261
27e94cacb43b Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
138 if (next_index == NULL) {
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
139 Py_DECREF(next_item);
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 return NULL;
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 }
29289
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
142 en->en_index++;
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
143
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
144 if (result->ob_refcnt == 1) {
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
145 Py_INCREF(result);
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
146 Py_DECREF(PyTuple_GET_ITEM(result, 0));
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
147 Py_DECREF(PyTuple_GET_ITEM(result, 1));
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
148 } else {
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
149 result = PyTuple_New(2);
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
150 if (result == NULL) {
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
151 Py_DECREF(next_index);
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
152 Py_DECREF(next_item);
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
153 return NULL;
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
154 }
811ad5f2f701 * Beefed-up tests
Raymond Hettinger <python@rcn.com>
parents: 28711
diff changeset
155 }
24261
27e94cacb43b Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
156 PyTuple_SET_ITEM(result, 0, next_index);
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 PyTuple_SET_ITEM(result, 1, next_item);
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 return result;
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
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23285
diff changeset
161 PyDoc_STRVAR(enum_doc,
28711
820d9570edeb Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28320
diff changeset
162 "enumerate(iterable) -> iterator for index, value of iterable\n"
820d9570edeb Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28320
diff changeset
163 "\n"
820d9570edeb Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28320
diff changeset
164 "Return an enumerate object. iterable must be an other object that supports\n"
820d9570edeb Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28320
diff changeset
165 "iteration. The enumerate object yields pairs containing a count (from\n"
820d9570edeb Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28320
diff changeset
166 "zero) and a value yielded by the iterable argument. enumerate is useful\n"
820d9570edeb Add a useful docstring to enumerate.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28320
diff changeset
167 "for obtaining an indexed list: (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
168
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 PyTypeObject PyEnum_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 40766
diff changeset
170 PyVarObject_HEAD_INIT(&PyType_Type, 0)
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 "enumerate", /* tp_name */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 sizeof(enumobject), /* tp_basicsize */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 0, /* tp_itemsize */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 /* methods */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 (destructor)enum_dealloc, /* tp_dealloc */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 0, /* tp_print */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 0, /* tp_getattr */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 0, /* tp_setattr */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 0, /* tp_compare */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 0, /* tp_repr */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 0, /* tp_as_number */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 0, /* tp_as_sequence */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 0, /* tp_as_mapping */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 0, /* tp_hash */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 0, /* tp_call */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 0, /* tp_str */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 PyObject_GenericGetAttr, /* tp_getattro */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 0, /* tp_setattro */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 0, /* tp_as_buffer */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 Py_TPFLAGS_BASETYPE, /* tp_flags */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 enum_doc, /* tp_doc */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 (traverseproc)enum_traverse, /* tp_traverse */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 0, /* tp_clear */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 0, /* tp_richcompare */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 0, /* tp_weaklistoffset */
28320
fd5ef7003469 Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents: 28308
diff changeset
197 PyObject_SelfIter, /* tp_iter */
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 (iternextfunc)enum_next, /* tp_iternext */
24261
27e94cacb43b Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
199 0, /* tp_methods */
23285
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 0, /* tp_members */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 0, /* tp_getset */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 0, /* tp_base */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 0, /* tp_dict */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 0, /* tp_descr_get */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 0, /* tp_descr_set */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 0, /* tp_dictoffset */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 0, /* tp_init */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 PyType_GenericAlloc, /* tp_alloc */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 enum_new, /* tp_new */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 PyObject_GC_Del, /* tp_free */
afe263672fd8 - New builtin function enumerate(x), from PEP 279. Example:
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 };
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
212
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
213 /* Reversed Object ***************************************************************/
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
214
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
215 typedef struct {
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
216 PyObject_HEAD
36519
d6d415df0df0 Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
217 Py_ssize_t index;
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
218 PyObject* seq;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
219 } reversedobject;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
220
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
221 static PyObject *
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
222 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
223 {
36519
d6d415df0df0 Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
224 Py_ssize_t n;
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
225 PyObject *seq;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
226 reversedobject *ro;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
227
47096
5d1aff46cc0d Don't allow keyword arguments to reversed().
Georg Brandl <georg@python.org>
parents: 46982
diff changeset
228 if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds))
5d1aff46cc0d Don't allow keyword arguments to reversed().
Georg Brandl <georg@python.org>
parents: 46982
diff changeset
229 return NULL;
5d1aff46cc0d Don't allow keyword arguments to reversed().
Georg Brandl <georg@python.org>
parents: 46982
diff changeset
230
5d1aff46cc0d Don't allow keyword arguments to reversed().
Georg Brandl <georg@python.org>
parents: 46982
diff changeset
231 if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
232 return NULL;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
233
31466
f04ccc288542 * Fix ref counting in extend() and extendleft().
Raymond Hettinger <python@rcn.com>
parents: 30874
diff changeset
234 if (PyObject_HasAttrString(seq, "__reversed__"))
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
235 return PyObject_CallMethod(seq, "__reversed__", NULL);
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
236
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
237 if (!PySequence_Check(seq)) {
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
238 PyErr_SetString(PyExc_TypeError,
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
239 "argument to reversed() must be a sequence");
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
240 return NULL;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
241 }
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
242
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
243 n = PySequence_Size(seq);
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
244 if (n == -1)
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
245 return NULL;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
246
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
247 ro = (reversedobject *)type->tp_alloc(type, 0);
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
248 if (ro == NULL)
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
249 return NULL;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
250
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
251 ro->index = n-1;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
252 Py_INCREF(seq);
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
253 ro->seq = seq;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
254 return (PyObject *)ro;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
255 }
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
256
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
257 static void
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
258 reversed_dealloc(reversedobject *ro)
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
259 {
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
260 PyObject_GC_UnTrack(ro);
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
261 Py_XDECREF(ro->seq);
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43457
diff changeset
262 Py_TYPE(ro)->tp_free(ro);
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
263 }
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
264
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
265 static int
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
266 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
267 {
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
268 Py_VISIT(ro->seq);
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
269 return 0;
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
270 }
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
271
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
272 static PyObject *
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
273 reversed_next(reversedobject *ro)
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
274 {
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
275 PyObject *item;
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36675
diff changeset
276 Py_ssize_t index = ro->index;
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
277
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
278 if (index >= 0) {
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
279 item = PySequence_GetItem(ro->seq, index);
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
280 if (item != NULL) {
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
281 ro->index--;
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
282 return item;
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
283 }
31908
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
284 if (PyErr_ExceptionMatches(PyExc_IndexError) ||
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
285 PyErr_ExceptionMatches(PyExc_StopIteration))
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
286 PyErr_Clear();
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
287 }
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
288 ro->index = -1;
33386
c2c49ee727d0 SF patch #1020188: Use Py_CLEAR where necessary to avoid crashes
Raymond Hettinger <python@rcn.com>
parents: 33273
diff changeset
289 Py_CLEAR(ro->seq);
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
290 return NULL;
31502
59538d3b7cd2 Make reversed() transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents: 31478
diff changeset
291 }
59538d3b7cd2 Make reversed() transparent with respect to length.
Raymond Hettinger <python@rcn.com>
parents: 31478
diff changeset
292
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
293 PyDoc_STRVAR(reversed_doc,
33273
4ca9fa2353bf Fix docstring typo.
Raymond Hettinger <python@rcn.com>
parents: 31908
diff changeset
294 "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
295 "\n"
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
296 "Return a reverse iterator");
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
297
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
298 static PyObject *
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
299 reversed_len(reversedobject *ro)
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
300 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
301 Py_ssize_t position, seqsize;
31908
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
302
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
303 if (ro->seq == NULL)
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
304 return PyInt_FromLong(0);
31908
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
305 seqsize = PySequence_Size(ro->seq);
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
306 if (seqsize == -1)
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
307 return NULL;
31908
058821d8aefd * Add unittests for iterators that report their length
Raymond Hettinger <python@rcn.com>
parents: 31635
diff changeset
308 position = ro->index + 1;
36519
d6d415df0df0 Use Py_ssize_t for counts and sizes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
309 return PyInt_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
310 }
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31634
diff changeset
311
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 36002
diff changeset
312 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
313
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
314 static PyMethodDef reversediter_methods[] = {
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 36002
diff changeset
315 {"__length_hint__", (PyCFunction)reversed_len, METH_NOARGS, length_hint_doc},
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
316 {NULL, NULL} /* sentinel */
31478
f30aaac00195 Let reversed() work with itself.
Raymond Hettinger <python@rcn.com>
parents: 31466
diff changeset
317 };
f30aaac00195 Let reversed() work with itself.
Raymond Hettinger <python@rcn.com>
parents: 31466
diff changeset
318
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
319 PyTypeObject PyReversed_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 40766
diff changeset
320 PyVarObject_HEAD_INIT(&PyType_Type, 0)
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
321 "reversed", /* tp_name */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
322 sizeof(reversedobject), /* tp_basicsize */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
323 0, /* tp_itemsize */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
324 /* methods */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
325 (destructor)reversed_dealloc, /* tp_dealloc */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
326 0, /* tp_print */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
327 0, /* tp_getattr */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
328 0, /* tp_setattr */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
329 0, /* tp_compare */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
330 0, /* tp_repr */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
331 0, /* tp_as_number */
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
332 0, /* tp_as_sequence */
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
333 0, /* tp_as_mapping */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
334 0, /* tp_hash */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
335 0, /* tp_call */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
336 0, /* tp_str */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
337 PyObject_GenericGetAttr, /* tp_getattro */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
338 0, /* tp_setattro */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
339 0, /* tp_as_buffer */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
340 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
341 Py_TPFLAGS_BASETYPE, /* tp_flags */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
342 reversed_doc, /* tp_doc */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
343 (traverseproc)reversed_traverse,/* tp_traverse */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
344 0, /* tp_clear */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
345 0, /* tp_richcompare */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
346 0, /* tp_weaklistoffset */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
347 PyObject_SelfIter, /* tp_iter */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
348 (iternextfunc)reversed_next, /* tp_iternext */
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 33386
diff changeset
349 reversediter_methods, /* tp_methods */
30865
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
350 0, /* tp_members */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
351 0, /* tp_getset */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
352 0, /* tp_base */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
353 0, /* tp_dict */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
354 0, /* tp_descr_get */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
355 0, /* tp_descr_set */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
356 0, /* tp_dictoffset */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
357 0, /* tp_init */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
358 PyType_GenericAlloc, /* tp_alloc */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
359 reversed_new, /* tp_new */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
360 PyObject_GC_Del, /* tp_free */
41c4e143e6e6 Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents: 30835
diff changeset
361 };