| /* |
| * C Extension module to test Python internal C APIs (Include/internal). |
| */ |
| |
| #if !defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE_MODULE) |
| # error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined" |
| #endif |
| |
| /* Always enable assertions */ |
| #undef NDEBUG |
| |
| #define PY_SSIZE_T_CLEAN |
| |
| #include "Python.h" |
| #include "pycore_byteswap.h" // _Py_bswap32() |
| #include "pycore_initconfig.h" // _Py_GetConfigsAsDict() |
| #include "pycore_gc.h" // PyGC_Head |
| |
| |
| static PyObject * |
| get_configs(PyObject *self, PyObject *Py_UNUSED(args)) |
| { |
| return _Py_GetConfigsAsDict(); |
| } |
| |
| |
| static PyObject* |
| get_recursion_depth(PyObject *self, PyObject *Py_UNUSED(args)) |
| { |
| PyThreadState *tstate = PyThreadState_Get(); |
| |
| /* subtract one to ignore the frame of the get_recursion_depth() call */ |
| return PyLong_FromLong(tstate->recursion_depth - 1); |
| } |
| |
| |
| static PyObject* |
| test_bswap(PyObject *self, PyObject *Py_UNUSED(args)) |
| { |
| uint16_t u16 = _Py_bswap16(UINT16_C(0x3412)); |
| if (u16 != UINT16_C(0x1234)) { |
| PyErr_Format(PyExc_AssertionError, |
| "_Py_bswap16(0x3412) returns %u", u16); |
| return NULL; |
| } |
| |
| uint32_t u32 = _Py_bswap32(UINT32_C(0x78563412)); |
| if (u32 != UINT32_C(0x12345678)) { |
| PyErr_Format(PyExc_AssertionError, |
| "_Py_bswap32(0x78563412) returns %lu", u32); |
| return NULL; |
| } |
| |
| uint64_t u64 = _Py_bswap64(UINT64_C(0xEFCDAB9078563412)); |
| if (u64 != UINT64_C(0x1234567890ABCDEF)) { |
| PyErr_Format(PyExc_AssertionError, |
| "_Py_bswap64(0xEFCDAB9078563412) returns %llu", u64); |
| return NULL; |
| } |
| |
| Py_RETURN_NONE; |
| } |
| |
| |
| static PyMethodDef TestMethods[] = { |
| {"get_configs", get_configs, METH_NOARGS}, |
| {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, |
| {"test_bswap", test_bswap, METH_NOARGS}, |
| {NULL, NULL} /* sentinel */ |
| }; |
| |
| |
| static struct PyModuleDef _testcapimodule = { |
| PyModuleDef_HEAD_INIT, |
| "_testinternalcapi", |
| NULL, |
| -1, |
| TestMethods, |
| NULL, |
| NULL, |
| NULL, |
| NULL |
| }; |
| |
| |
| PyMODINIT_FUNC |
| PyInit__testinternalcapi(void) |
| { |
| PyObject *module = PyModule_Create(&_testcapimodule); |
| if (module == NULL) { |
| return NULL; |
| } |
| |
| if (PyModule_AddObject(module, "SIZEOF_PYGC_HEAD", |
| PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) { |
| goto error; |
| } |
| |
| return module; |
| |
| error: |
| Py_DECREF(module); |
| return NULL; |
| } |