• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * C Extension module to test Python internal C APIs (Include/internal).
3  */
4 
5 #if !defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE_MODULE)
6 #  error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined"
7 #endif
8 
9 #define PY_SSIZE_T_CLEAN
10 
11 #include "Python.h"
12 #include "pycore_initconfig.h"
13 
14 
15 #ifdef MS_WINDOWS
16 #include <windows.h>
17 
18 static int
_add_windows_config(PyObject * configs)19 _add_windows_config(PyObject *configs)
20 {
21     HMODULE hPython3;
22     wchar_t py3path[MAX_PATH];
23     PyObject *dict = PyDict_New();
24     PyObject *obj = NULL;
25     if (!dict) {
26         return -1;
27     }
28 
29     hPython3 = GetModuleHandleW(PY3_DLLNAME);
30     if (hPython3 && GetModuleFileNameW(hPython3, py3path, MAX_PATH)) {
31         obj = PyUnicode_FromWideChar(py3path, -1);
32     } else {
33         obj = Py_None;
34         Py_INCREF(obj);
35     }
36     if (obj &&
37         !PyDict_SetItemString(dict, "python3_dll", obj) &&
38         !PyDict_SetItemString(configs, "windows", dict)) {
39         Py_DECREF(obj);
40         Py_DECREF(dict);
41         return 0;
42     }
43     Py_DECREF(obj);
44     Py_DECREF(dict);
45     return -1;
46 }
47 #endif
48 
49 
50 static PyObject *
get_configs(PyObject * self,PyObject * Py_UNUSED (args))51 get_configs(PyObject *self, PyObject *Py_UNUSED(args))
52 {
53     PyObject *dict = _Py_GetConfigsAsDict();
54 #ifdef MS_WINDOWS
55     if (dict) {
56         if (_add_windows_config(dict) < 0) {
57             Py_CLEAR(dict);
58         }
59     }
60 #endif
61     return dict;
62 }
63 
64 
65 static PyMethodDef TestMethods[] = {
66     {"get_configs", get_configs, METH_NOARGS},
67     {NULL, NULL} /* sentinel */
68 };
69 
70 
71 static struct PyModuleDef _testcapimodule = {
72     PyModuleDef_HEAD_INIT,
73     "_testinternalcapi",
74     NULL,
75     -1,
76     TestMethods,
77     NULL,
78     NULL,
79     NULL,
80     NULL
81 };
82 
83 
84 PyMODINIT_FUNC
PyInit__testinternalcapi(void)85 PyInit__testinternalcapi(void)
86 {
87     return PyModule_Create(&_testcapimodule);
88 }
89