/* * 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 #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; }