| #include <Python.h> |
| |
| typedef struct { |
| PyListObject list; |
| int state; |
| } SubListObject; |
| |
| static PyObject * |
| SubList_increment(SubListObject *self, PyObject *unused) |
| { |
| self->state++; |
| return PyLong_FromLong(self->state); |
| } |
| |
| static PyMethodDef SubList_methods[] = { |
| {"increment", (PyCFunction) SubList_increment, METH_NOARGS, |
| PyDoc_STR("increment state counter")}, |
| {NULL}, |
| }; |
| |
| static int |
| SubList_init(SubListObject *self, PyObject *args, PyObject *kwds) |
| { |
| if (PyList_Type.tp_init((PyObject *) self, args, kwds) < 0) |
| return -1; |
| self->state = 0; |
| return 0; |
| } |
| |
| static PyTypeObject SubListType = { |
| PyVarObject_HEAD_INIT(NULL, 0) |
| .tp_name = "sublist.SubList", |
| .tp_doc = "SubList objects", |
| .tp_basicsize = sizeof(SubListObject), |
| .tp_itemsize = 0, |
| .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, |
| .tp_init = (initproc) SubList_init, |
| .tp_methods = SubList_methods, |
| }; |
| |
| static PyModuleDef sublistmodule = { |
| PyModuleDef_HEAD_INIT, |
| .m_name = "sublist", |
| .m_doc = "Example module that creates an extension type.", |
| .m_size = -1, |
| }; |
| |
| PyMODINIT_FUNC |
| PyInit_sublist(void) |
| { |
| PyObject *m; |
| SubListType.tp_base = &PyList_Type; |
| if (PyType_Ready(&SubListType) < 0) |
| return NULL; |
| |
| m = PyModule_Create(&sublistmodule); |
| if (m == NULL) |
| return NULL; |
| |
| Py_INCREF(&SubListType); |
| PyModule_AddObject(m, "SubList", (PyObject *) &SubListType); |
| return m; |
| } |