89 lines
1.7 KiB
C
89 lines
1.7 KiB
C
/*
|
|
* 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 <windows.h>
|
|
|
|
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);
|
|
}
|