| #include "parts.h" | |
| #include "util.h" | |
| static PyObject * | |
| list_get_size(PyObject *Py_UNUSED(module), PyObject *obj) | |
| { | |
| NULLABLE(obj); | |
| RETURN_SIZE(PyList_GET_SIZE(obj)); | |
| } | |
| static PyObject * | |
| list_get_item(PyObject *Py_UNUSED(module), PyObject *args) | |
| { | |
| PyObject *obj; | |
| Py_ssize_t i; | |
| if (!PyArg_ParseTuple(args, "On", &obj, &i)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| return Py_XNewRef(PyList_GET_ITEM(obj, i)); | |
| } | |
| static PyObject * | |
| list_set_item(PyObject *Py_UNUSED(module), PyObject *args) | |
| { | |
| PyObject *obj, *value; | |
| Py_ssize_t i; | |
| if (!PyArg_ParseTuple(args, "OnO", &obj, &i, &value)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| NULLABLE(value); | |
| PyList_SET_ITEM(obj, i, Py_XNewRef(value)); | |
| Py_RETURN_NONE; | |
| } | |
| static PyObject * | |
| list_clear(PyObject* Py_UNUSED(module), PyObject *obj) | |
| { | |
| NULLABLE(obj); | |
| RETURN_INT(PyList_Clear(obj)); | |
| } | |
| static PyObject * | |
| list_extend(PyObject* Py_UNUSED(module), PyObject *args) | |
| { | |
| PyObject *obj, *arg; | |
| if (!PyArg_ParseTuple(args, "OO", &obj, &arg)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| NULLABLE(arg); | |
| RETURN_INT(PyList_Extend(obj, arg)); | |
| } | |
| static PyObject* | |
| test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored)) | |
| { | |
| PyObject* list; | |
| int i; | |
| /* SF bug 132008: PyList_Reverse segfaults */ | |
| #define NLIST 30 | |
| list = PyList_New(NLIST); | |
| if (list == (PyObject*)NULL) | |
| return (PyObject*)NULL; | |
| /* list = range(NLIST) */ | |
| for (i = 0; i < NLIST; ++i) { | |
| PyObject* anint = PyLong_FromLong(i); | |
| if (anint == (PyObject*)NULL) { | |
| Py_DECREF(list); | |
| return (PyObject*)NULL; | |
| } | |
| PyList_SET_ITEM(list, i, anint); | |
| } | |
| /* list.reverse(), via PyList_Reverse() */ | |
| i = PyList_Reverse(list); /* should not blow up! */ | |
| if (i != 0) { | |
| Py_DECREF(list); | |
| return (PyObject*)NULL; | |
| } | |
| /* Check that list == range(29, -1, -1) now */ | |
| for (i = 0; i < NLIST; ++i) { | |
| PyObject* anint = PyList_GET_ITEM(list, i); | |
| if (PyLong_AS_LONG(anint) != NLIST-1-i) { | |
| PyErr_SetString(PyExc_AssertionError, | |
| "test_list_api: reverse screwed up"); | |
| Py_DECREF(list); | |
| return (PyObject*)NULL; | |
| } | |
| } | |
| Py_DECREF(list); | |
| #undef NLIST | |
| Py_RETURN_NONE; | |
| } | |
| static PyMethodDef test_methods[] = { | |
| {"list_get_size", list_get_size, METH_O}, | |
| {"list_get_item", list_get_item, METH_VARARGS}, | |
| {"list_set_item", list_set_item, METH_VARARGS}, | |
| {"list_clear", list_clear, METH_O}, | |
| {"list_extend", list_extend, METH_VARARGS}, | |
| {"test_list_api", test_list_api, METH_NOARGS}, | |
| {NULL}, | |
| }; | |
| int | |
| _PyTestCapi_Init_List(PyObject *m) | |
| { | |
| return PyModule_AddFunctions(m, test_methods); | |
| } |