17dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum/* enumerate object */ 27dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 37dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum#include "Python.h" 47dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 57dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumtypedef struct { 6f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_HEAD 7f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_ssize_t en_index; /* current index of enumeration */ 8f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject* en_sit; /* secondary iterator of enumeration */ 9f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject* en_result; /* result tuple */ 10f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject* en_longindex; /* index for sequences >= PY_SSIZE_T_MAX */ 117dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum} enumobject; 127dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 137dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic PyObject * 147dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 157dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{ 16f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou enumobject *en; 17f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *seq = NULL; 18f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *start = NULL; 19f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou static char *kwlist[] = {"iterable", "start", 0}; 20f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 21f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist, 22f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou &seq, &start)) 23f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 24f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 25f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en = (enumobject *)type->tp_alloc(type, 0); 26f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en == NULL) 27f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 28f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (start != NULL) { 29f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou start = PyNumber_Index(start); 30f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (start == NULL) { 31f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(en); 32f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 33f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 34f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou assert(PyLong_Check(start)); 35f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_index = PyLong_AsSsize_t(start); 36f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en->en_index == -1 && PyErr_Occurred()) { 37f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 38f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_index = PY_SSIZE_T_MAX; 39f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_longindex = start; 40f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 41f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_longindex = NULL; 42f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(start); 43f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 44f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 45f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_index = 0; 46f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_longindex = NULL; 47f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 48f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_sit = PyObject_GetIter(seq); 49f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en->en_sit == NULL) { 50f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(en); 51f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 52f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 53f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_result = PyTuple_Pack(2, Py_None, Py_None); 54f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en->en_result == NULL) { 55f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(en); 56f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 57f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 58f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return (PyObject *)en; 597dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum} 607dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 617dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic void 627dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_dealloc(enumobject *en) 637dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{ 64f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_GC_UnTrack(en); 65f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(en->en_sit); 66f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(en->en_result); 67f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(en->en_longindex); 68f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_TYPE(en)->tp_free(en); 697dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum} 707dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 717dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic int 727dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_traverse(enumobject *en, visitproc visit, void *arg) 737dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{ 74f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_VISIT(en->en_sit); 75f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_VISIT(en->en_result); 76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_VISIT(en->en_longindex); 77f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 787dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum} 797dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 807dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumstatic PyObject * 818ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossumenum_next_long(enumobject *en, PyObject* next_item) 828ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossum{ 83f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou static PyObject *one = NULL; 84f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *result = en->en_result; 85f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *next_index; 86f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *stepped_up; 87f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 88f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en->en_longindex == NULL) { 89f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_longindex = PyLong_FromSsize_t(PY_SSIZE_T_MAX); 90f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en->en_longindex == NULL) 91f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 92f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 93f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (one == NULL) { 94f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou one = PyLong_FromLong(1); 95f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (one == NULL) 96f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 97f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 98f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou next_index = en->en_longindex; 99f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou assert(next_index != NULL); 100f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou stepped_up = PyNumber_Add(next_index, one); 101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (stepped_up == NULL) 102f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_longindex = stepped_up; 104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result->ob_refcnt == 1) { 106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(result); 107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(PyTuple_GET_ITEM(result, 0)); 108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(PyTuple_GET_ITEM(result, 1)); 109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou result = PyTuple_New(2); 111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result == NULL) { 112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(next_index); 113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(next_item); 114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyTuple_SET_ITEM(result, 0, next_index); 118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyTuple_SET_ITEM(result, 1, next_item); 119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return result; 1208ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossum} 1218ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossum 1228ce8a784bd672ba42975dec752848392ff9a7797Guido van Rossumstatic PyObject * 1237dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossumenum_next(enumobject *en) 1247dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum{ 125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *next_index; 126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *next_item; 127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *result = en->en_result; 128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *it = en->en_sit; 129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou next_item = (*Py_TYPE(it)->tp_iternext)(it); 131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (next_item == NULL) 132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (en->en_index == PY_SSIZE_T_MAX) 135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return enum_next_long(en, next_item); 136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou next_index = PyLong_FromSsize_t(en->en_index); 138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (next_index == NULL) { 139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(next_item); 140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou en->en_index++; 143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result->ob_refcnt == 1) { 145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(result); 146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(PyTuple_GET_ITEM(result, 0)); 147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(PyTuple_GET_ITEM(result, 1)); 148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou result = PyTuple_New(2); 150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result == NULL) { 151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(next_index); 152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(next_item); 153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyTuple_SET_ITEM(result, 0, next_index); 157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyTuple_SET_ITEM(result, 1, next_item); 158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return result; 1597dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum} 1607dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 16131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyObject * 16231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonenum_reduce(enumobject *en) 16331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson{ 16431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson if (en->en_longindex != NULL) 16531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson return Py_BuildValue("O(OO)", Py_TYPE(en), en->en_sit, en->en_longindex); 16631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson else 16731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson return Py_BuildValue("O(On)", Py_TYPE(en), en->en_sit, en->en_index); 16831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson} 16931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson 17031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur JónssonPyDoc_STRVAR(reduce_doc, "Return state information for pickling."); 17131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson 17231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyMethodDef enum_methods[] = { 17331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson {"__reduce__", (PyCFunction)enum_reduce, METH_NOARGS, reduce_doc}, 17431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson {NULL, NULL} /* sentinel */ 17531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson}; 17631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson 17714f8b4cfcb98de74b9c6e9316539be9e2a5cd31fMartin v. LöwisPyDoc_STRVAR(enum_doc, 1783e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"enumerate(iterable[, start]) -> iterator for index, value of iterable\n" 179fbbe34789e62725cac074a188826e53d8cc95e16Jeremy Hylton"\n" 180ed61093277b3e987f9856e8a04498ce103362ff6Ezio Melotti"Return an enumerate object. iterable must be another object that supports\n" 181fbbe34789e62725cac074a188826e53d8cc95e16Jeremy Hylton"iteration. The enumerate object yields pairs containing a count (from\n" 1823e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"start, which defaults to zero) and a value yielded by the iterable argument.\n" 1833e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson"enumerate is useful for obtaining an indexed list:\n" 1843e5cd1d04e8a39130752a1e888707a68a2943274Benjamin Peterson" (0, seq[0]), (1, seq[1]), (2, seq[2]), ..."); 1857dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum 1867dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van RossumPyTypeObject PyEnum_Type = { 187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyVarObject_HEAD_INIT(&PyType_Type, 0) 188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "enumerate", /* tp_name */ 189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou sizeof(enumobject), /* tp_basicsize */ 190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_itemsize */ 191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* methods */ 192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (destructor)enum_dealloc, /* tp_dealloc */ 193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_print */ 194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_getattr */ 195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_setattr */ 196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_reserved */ 197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_repr */ 198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_number */ 199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_sequence */ 200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_mapping */ 201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_hash */ 202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_call */ 203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_str */ 204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_GenericGetAttr, /* tp_getattro */ 205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_setattro */ 206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_buffer */ 207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | 208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_TPFLAGS_BASETYPE, /* tp_flags */ 209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou enum_doc, /* tp_doc */ 210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (traverseproc)enum_traverse, /* tp_traverse */ 211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_clear */ 212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_richcompare */ 213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_weaklistoffset */ 214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_SelfIter, /* tp_iter */ 215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (iternextfunc)enum_next, /* tp_iternext */ 21631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson enum_methods, /* tp_methods */ 217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_members */ 218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_getset */ 219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_base */ 220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_dict */ 221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_descr_get */ 222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_descr_set */ 223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_dictoffset */ 224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_init */ 225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyType_GenericAlloc, /* tp_alloc */ 226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou enum_new, /* tp_new */ 227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_GC_Del, /* tp_free */ 2287dab2426ca0bae36fde565407ddb4b2d2cbf2575Guido van Rossum}; 22985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 23085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger/* Reversed Object ***************************************************************/ 23185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 23285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingertypedef struct { 233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_HEAD 234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_ssize_t index; 235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject* seq; 23685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger} reversedobject; 23785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 23885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * 23985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 24085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{ 241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_ssize_t n; 242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *seq, *reversed_meth; 243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou reversedobject *ro; 244ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson _Py_IDENTIFIER(__reversed__); 245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (type == &PyReversed_Type && !_PyArg_NoKeywords("reversed()", kwds)) 247f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 249f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) ) 250f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 251f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 252ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson reversed_meth = _PyObject_LookupSpecial(seq, &PyId___reversed__); 25397c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum if (reversed_meth == Py_None) { 25497c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum Py_DECREF(reversed_meth); 25597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum PyErr_Format(PyExc_TypeError, 25697c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum "'%.200s' object is not reversible", 25797c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum Py_TYPE(seq)->tp_name); 25897c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return NULL; 25997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum } 260f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (reversed_meth != NULL) { 261f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL); 262f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(reversed_meth); 263f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return res; 264f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 265f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (PyErr_Occurred()) 266f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 267f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 268f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!PySequence_Check(seq)) { 26997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum PyErr_Format(PyExc_TypeError, 27097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum "'%.200s' object is not reversible", 27197c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum Py_TYPE(seq)->tp_name); 272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou n = PySequence_Size(seq); 276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (n == -1) 277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ro = (reversedobject *)type->tp_alloc(type, 0); 280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (ro == NULL) 281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ro->index = n-1; 284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(seq); 285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ro->seq = seq; 286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return (PyObject *)ro; 28785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger} 28885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 28985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic void 29085c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_dealloc(reversedobject *ro) 29185c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{ 292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_GC_UnTrack(ro); 293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(ro->seq); 294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_TYPE(ro)->tp_free(ro); 29585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger} 29685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 29785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic int 29885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_traverse(reversedobject *ro, visitproc visit, void *arg) 29985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{ 300f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_VISIT(ro->seq); 301f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 30285c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger} 30385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 30485c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerstatic PyObject * 30585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettingerreversed_next(reversedobject *ro) 30685c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger{ 307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *item; 308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_ssize_t index = ro->index; 309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (index >= 0) { 311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou item = PySequence_GetItem(ro->seq, index); 312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (item != NULL) { 313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ro->index--; 314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return item; 315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyErr_ExceptionMatches(PyExc_IndexError) || 317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_ExceptionMatches(PyExc_StopIteration)) 318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ro->index = -1; 321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_CLEAR(ro->seq); 322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 323029dba5a4078bc1e9dc262d24aaa481936af49d3Raymond Hettinger} 324029dba5a4078bc1e9dc262d24aaa481936af49d3Raymond Hettinger 32585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyDoc_STRVAR(reversed_doc, 326d2afee47b13854c265a5fb8eb5a53daf7b27ecf9Raymond Hettinger"reversed(sequence) -> reverse iterator over values of the sequence\n" 32785c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"\n" 32885c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger"Return a reverse iterator"); 32985c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger 3306b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyObject * 331ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettingerreversed_len(reversedobject *ro) 332ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger{ 333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_ssize_t position, seqsize; 334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (ro->seq == NULL) 336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyLong_FromLong(0); 337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou seqsize = PySequence_Size(ro->seq); 338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (seqsize == -1) 339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou position = ro->index + 1; 341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyLong_FromSsize_t((seqsize < position) ? 0 : position); 342ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger} 343ef9bf4031a2f9ec674817274c93a90e0f21db114Raymond Hettinger 344f5b3e36493da275334e29afdbd238863697dca35Armin RigoPyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); 3456b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 34631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyObject * 34731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonreversed_reduce(reversedobject *ro) 34831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson{ 34931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson if (ro->seq) 35031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson return Py_BuildValue("O(O)n", Py_TYPE(ro), ro->seq, ro->index); 35131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson else 35231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson return Py_BuildValue("O(())", Py_TYPE(ro)); 35331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson} 35431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson 35531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonstatic PyObject * 35631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónssonreversed_setstate(reversedobject *ro, PyObject *state) 35731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson{ 35831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson Py_ssize_t index = PyLong_AsSsize_t(state); 35931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson if (index == -1 && PyErr_Occurred()) 36031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson return NULL; 36131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson if (ro->seq != 0) { 36231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson Py_ssize_t n = PySequence_Size(ro->seq); 36331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson if (n < 0) 36431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson return NULL; 36531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson if (index < -1) 36631668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson index = -1; 36731668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson else if (index > n-1) 36831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson index = n-1; 36931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson ro->index = index; 37031668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson } 37131668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson Py_RETURN_NONE; 37231668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson} 37331668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson 37431668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur JónssonPyDoc_STRVAR(setstate_doc, "Set state information for unpickling."); 37531668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson 3766b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettingerstatic PyMethodDef reversediter_methods[] = { 377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou {"__length_hint__", (PyCFunction)reversed_len, METH_NOARGS, length_hint_doc}, 37831668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson {"__reduce__", (PyCFunction)reversed_reduce, METH_NOARGS, reduce_doc}, 37931668b8f7a3efc7b17511bb08525b28e8ff5f23aKristján Valur Jónsson {"__setstate__", (PyCFunction)reversed_setstate, METH_O, setstate_doc}, 380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou {NULL, NULL} /* sentinel */ 38106353f76beab69a538d3a55ca9b6df7e9754b999Raymond Hettinger}; 38206353f76beab69a538d3a55ca9b6df7e9754b999Raymond Hettinger 38385c20a41dfcec04d161ad7da7260e7b94c62d228Raymond HettingerPyTypeObject PyReversed_Type = { 384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyVarObject_HEAD_INIT(&PyType_Type, 0) 385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "reversed", /* tp_name */ 386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou sizeof(reversedobject), /* tp_basicsize */ 387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_itemsize */ 388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* methods */ 389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (destructor)reversed_dealloc, /* tp_dealloc */ 390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_print */ 391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_getattr */ 392f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_setattr */ 393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_reserved */ 394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_repr */ 395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_number */ 396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_sequence */ 397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_mapping */ 398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_hash */ 399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_call */ 400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_str */ 401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_GenericGetAttr, /* tp_getattro */ 402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_setattro */ 403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_as_buffer */ 404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | 405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_TPFLAGS_BASETYPE, /* tp_flags */ 406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou reversed_doc, /* tp_doc */ 407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (traverseproc)reversed_traverse,/* tp_traverse */ 408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_clear */ 409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_richcompare */ 410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_weaklistoffset */ 411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_SelfIter, /* tp_iter */ 412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (iternextfunc)reversed_next, /* tp_iternext */ 413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou reversediter_methods, /* tp_methods */ 414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_members */ 415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_getset */ 416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_base */ 417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_dict */ 418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_descr_get */ 419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_descr_set */ 420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_dictoffset */ 421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 0, /* tp_init */ 422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyType_GenericAlloc, /* tp_alloc */ 423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou reversed_new, /* tp_new */ 424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_GC_Del, /* tp_free */ 42585c20a41dfcec04d161ad7da7260e7b94c62d228Raymond Hettinger}; 426