Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ arraytype_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ array_richcompare, /* tp_richcompare */ offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */ (getiterfunc)array_iter, /* tp_iter */ 0, /* tp_iternext */ array_methods, /* tp_methods */ 0, /* tp_members */ array_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ array_new, /* tp_new */ PyObject_Del, /* tp_free */}; /*********************** Array Iterator **************************/ typedef struct { PyObject_HEAD Py_ssize_t index; arrayobject *ao; PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);} arrayiterobject; static PyTypeObject PyArrayIter_Type; #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type) static PyObject *array_iter(arrayobject *ao){ arrayiterobject *it; if (!array_Check(ao)) { PyErr_BadInternalCall(); return NULL; } it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type); if (it == NULL) return NULL; Py_INCREF(ao); it->ao = ao; it->index = 0; it->getitem = ao->ob_descr->getitem; PyObject_GC_Track(it); return (PyObject *)it;} static PyObject *arrayiter_next(arrayiterobject *it){ assert(PyArrayIter_Check(it)); if (it->index < it->ao->ob_size) return (*it->getitem)(it->ao, it->index++); return NULL;} static voidarrayiter_dealloc(arrayiterobject *it){ PyObject_GC_UnTrack(it); Py_XDECREF(it->ao); PyObject_GC_Del(it);} static intarrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg){ Py_VISIT(it->ao); return 0;} static PyTypeObject PyArrayIter_Type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "arrayiterator", /* tp_name */ sizeof(arrayiterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)arrayiter_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 0, /* tp_doc */ (traverseproc)arrayiter_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)arrayiter_next, /* tp_iternext */ 0, /* tp_methods */}; /*********************** Install Module **************************/ /* No functions in array module. */static PyMethodDef a_methods[] = { {NULL, NULL, 0, NULL} /* Sentinel */}; PyMODINIT_FUNCinitarray(void){ PyObject *m; Arraytype.ob_type = &PyType_Type; PyArrayIter_Type.ob_type = &PyType_Type; m = Py_InitModule3("array", a_methods, module_doc); if (m == NULL) return; Py_INCREF((PyObject *)&Arraytype); PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype); Py_INCREF((PyObject *)&Arraytype); PyModule_AddObject(m, "array", (PyObject *)&Arraytype); /* No need to check the error here, the caller will do that */}Lines 2001–2141 of 2141. Previous lines
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ arraytype_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ array_richcompare, /* tp_richcompare */ offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */ (getiterfunc)array_iter, /* tp_iter */ 0, /* tp_iternext */ array_methods, /* tp_methods */ 0, /* tp_members */ array_getsets, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ array_new, /* tp_new */ PyObject_Del, /* tp_free */ }; /*********************** Array Iterator **************************/ typedef struct { PyObject_HEAD Py_ssize_t index; arrayobject *ao; PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); } arrayiterobject; static PyTypeObject PyArrayIter_Type; #define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type) static PyObject * array_iter(arrayobject *ao) { arrayiterobject *it; if (!array_Check(ao)) { PyErr_BadInternalCall(); return NULL; } it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type); if (it == NULL) return NULL; Py_INCREF(ao); it->ao = ao; it->index = 0; it->getitem = ao->ob_descr->getitem; PyObject_GC_Track(it); return (PyObject *)it; } static PyObject * arrayiter_next(arrayiterobject *it) { assert(PyArrayIter_Check(it)); if (it->index < it->ao->ob_size) return (*it->getitem)(it->ao, it->index++); return NULL; } static void arrayiter_dealloc(arrayiterobject *it) { PyObject_GC_UnTrack(it); Py_XDECREF(it->ao); PyObject_GC_Del(it); } static int arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg) { Py_VISIT(it->ao); return 0; } static PyTypeObject PyArrayIter_Type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "arrayiterator", /* tp_name */ sizeof(arrayiterobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)arrayiter_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 0, /* tp_doc */ (traverseproc)arrayiter_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)arrayiter_next, /* tp_iternext */ 0, /* tp_methods */ }; /*********************** Install Module **************************/ /* No functions in array module. */ static PyMethodDef a_methods[] = { {NULL, NULL, 0, NULL} /* Sentinel */ }; PyMODINIT_FUNC initarray(void) { PyObject *m; Arraytype.ob_type = &PyType_Type; PyArrayIter_Type.ob_type = &PyType_Type; m = Py_InitModule3("array", a_methods, module_doc); if (m == NULL) return; Py_INCREF((PyObject *)&Arraytype); PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype); Py_INCREF((PyObject *)&Arraytype); PyModule_AddObject(m, "array", (PyObject *)&Arraytype); /* No need to check the error here, the caller will do that */ }