| #include <Python.h> | |
| #include <stdio.h> | |
| #ifdef Py_LIMITED_API | |
| #error Py_LIMITED_API must not be defined. | |
| #endif | |
| /* This function explicitly calls functions whose declaration is elided when | |
| * Py_LIMITED_API is defined. This is to test that the linker is actually | |
| * linking to the right version of the library on Windows. */ | |
| static PyObject *meth_not_limited(PyObject *self, PyObject *args) | |
| { | |
| PyObject *list; | |
| Py_ssize_t size; | |
| if (!PyArg_ParseTuple(args, "o", & list)) | |
| return NULL; | |
| if (!PyList_Check(list)) { | |
| PyErr_Format(PyExc_TypeError, "expected 'list'"); | |
| return NULL; | |
| } | |
| /* PyList_GET_SIZE and PyList_GET_ITEM are only available if Py_LIMITED_API | |
| * is not defined. It seems likely that they will remain excluded from the | |
| * limited API as their checked counterparts (PyList_GetSize and | |
| * PyList_GetItem) are made available in that mode instead. */ | |
| size = PyList_GET_SIZE(list); | |
| for(Py_ssize_t i = 0; i < size; ++i) { | |
| PyObject *element = PyList_GET_ITEM(list, i); | |
| if (element == NULL) { | |
| return NULL; | |
| } | |
| if(PyObject_Print(element, stdout, Py_PRINT_RAW) == -1) { | |
| return NULL; | |
| } | |
| } | |
| Py_RETURN_NONE; | |
| } | |
| static struct PyMethodDef not_limited_methods[] = { | |
| { "not_limited", meth_not_limited, METH_VARARGS, | |
| "Calls functions whose declaration is elided by Py_LIMITED_API" }, | |
| { NULL, NULL, 0, NULL } | |
| }; | |
| static struct PyModuleDef not_limited_module = { | |
| PyModuleDef_HEAD_INIT, | |
| "not_limited_api_test", | |
| NULL, | |
| -1, | |
| not_limited_methods | |
| }; | |
| PyMODINIT_FUNC PyInit_not_limited(void) { | |
| return PyModule_Create(¬_limited_module); | |
| } |