/* * 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_initconfig.h" #ifdef MS_WINDOWS #include static int _add_windows_config(PyObject *configs) { HMODULE hPython3; wchar_t py3path[MAX_PATH]; PyObject *dict = PyDict_New(); PyObject *obj = NULL; if (!dict) { return -1; } hPython3 = GetModuleHandleW(PY3_DLLNAME); if (hPython3 && GetModuleFileNameW(hPython3, py3path, MAX_PATH)) { obj = PyUnicode_FromWideChar(py3path, -1); } else { obj = Py_None; Py_INCREF(obj); } if (obj && !PyDict_SetItemString(dict, "python3_dll", obj) && !PyDict_SetItemString(configs, "windows", dict)) { Py_DECREF(obj); Py_DECREF(dict); return 0; } Py_DECREF(obj); Py_DECREF(dict); return -1; } #endif static PyObject * get_configs(PyObject *self, PyObject *Py_UNUSED(args)) { PyObject *dict = _Py_GetConfigsAsDict(); #ifdef MS_WINDOWS if (dict) { if (_add_windows_config(dict) < 0) { Py_CLEAR(dict); } } #endif return dict; } static PyMethodDef TestMethods[] = { {"get_configs", get_configs, 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) { return PyModule_Create(&_testcapimodule); }