GCC Code Coverage Report


Directory: src/gate/
File: src/gate/scripting/pythonscripts.c
Date: 2025-09-14 13:10:38
Exec Total Coverage
Lines: 0 67 0.0%
Functions: 0 1 0.0%
Branches: 0 110 0.0%

Line Branch Exec Source
1 /* GATE PROJECT LICENSE:
2 +----------------------------------------------------------------------------+
3 | Copyright(c) 2018-2025, Stefan Meislinger <sm@opengate.at> |
4 | All rights reserved. |
5 | |
6 | Redistribution and use in source and binary forms, with or without |
7 | modification, are permitted provided that the following conditions are met:|
8 | |
9 | 1. Redistributions of source code must retain the above copyright notice, |
10 | this list of conditions and the following disclaimer. |
11 | 2. Redistributions in binary form must reproduce the above copyright |
12 | notice, this list of conditions and the following disclaimer in the |
13 | documentation and/or other materials provided with the distribution. |
14 | |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"|
16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
19 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
20 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
21 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
25 | THE POSSIBILITY OF SUCH DAMAGE. |
26 +----------------------------------------------------------------------------+
27 */
28
29 #include "gate/scripting/pythonscripts.h"
30 #include "gate/libraries.h"
31 #include "gate/atomics.h"
32 #include "gate/results.h"
33
34 static gate_atomic_flag_t gate_python_init_done = GATE_ATOMIC_FLAG_INIT;
35 static gate_library_t gate_python_library;
36 static gate_python_t gate_py;
37 static gate_string_t const python3_libname = { "python3", 7, NULL };
38
39 gate_result_t gate_python_init(gate_python_t* python)
40 {
41 gate_result_t ret = GATE_RESULT_FAILED;
42 gate_bool_t close_library = false;
43
44 do
45 {
46 if (gate_atomic_flag_set(&gate_python_init_done))
47 {
48 /* already initialized */
49 ret = GATE_RESULT_OK;
50 break;
51 }
52
53 GATE_BREAK_IF_FAILED(
54 ret = gate_library_open(&python3_libname, &gate_python_library, GATE_LIBRARY_FLAG_DEFAULT)
55 );
56 close_library = true;
57
58 #define GATE_PYTHON_LOAD_FUNC(name, func) \
59 GATE_BREAK_IF_FAILED(gate_library_get_function_name(gate_python_library, name, &gate_py. func ))
60
61 GATE_PYTHON_LOAD_FUNC("Py_Initialize", Initialize);
62 GATE_PYTHON_LOAD_FUNC("Py_InitializeEx", InitializeEx);
63 GATE_PYTHON_LOAD_FUNC("Py_IsInitialized", IsInitialized);
64 GATE_PYTHON_LOAD_FUNC("Py_Finalize", Finalize);
65
66 GATE_PYTHON_LOAD_FUNC("Py_SetProgramName", SetProgramName);
67 GATE_PYTHON_LOAD_FUNC("Py_GetProgramName", GetProgramName);
68 GATE_PYTHON_LOAD_FUNC("Py_GetPrefix", GetPrefix);
69 GATE_PYTHON_LOAD_FUNC("Py_GetExecPrefix", GetExecPrefix);
70 GATE_PYTHON_LOAD_FUNC("Py_GetProgramFullPath", GetProgramFullPath);
71 GATE_PYTHON_LOAD_FUNC("Py_GetPath", GetPath);
72 GATE_PYTHON_LOAD_FUNC("Py_GetVersion", GetVersion);
73 GATE_PYTHON_LOAD_FUNC("Py_GetPlatform", GetPlatform);
74 GATE_PYTHON_LOAD_FUNC("Py_GetCopyright", GetCopyright);
75 GATE_PYTHON_LOAD_FUNC("Py_GetCompiler", GetCompiler);
76 GATE_PYTHON_LOAD_FUNC("Py_GetBuildInfo", GetBuildInfo);
77 GATE_PYTHON_LOAD_FUNC("PySys_SetArgvEx", Sys_SetArgvEx);
78 GATE_PYTHON_LOAD_FUNC("PySys_SetArgv", Sys_SetArgv);
79 GATE_PYTHON_LOAD_FUNC("Py_SetPythonHome", SetPythonHome);
80 GATE_PYTHON_LOAD_FUNC("Py_GetPythonHome", GetPythonHome);
81 GATE_PYTHON_LOAD_FUNC("PyEval_InitThreads", Eval_InitThreads);
82 GATE_PYTHON_LOAD_FUNC("PyEval_ThreadsInitialized", Eval_ThreadsInitialized);
83 GATE_PYTHON_LOAD_FUNC("PyEval_SaveThread", Eval_SaveThread);
84 GATE_PYTHON_LOAD_FUNC("PyEval_RestoreThread", Eval_RestoreThread);
85 GATE_PYTHON_LOAD_FUNC("PyThreadState_Get", ThreadState_Get);
86 GATE_PYTHON_LOAD_FUNC("PyThreadState_Swap", ThreadState_Swap);
87 GATE_PYTHON_LOAD_FUNC("PyEval_ReInitThreads", Eval_ReInitThreads);
88 GATE_PYTHON_LOAD_FUNC("PyGILState_Ensure", GILState_Ensure);
89 GATE_PYTHON_LOAD_FUNC("PyGILState_Release", GILState_Release);
90 GATE_PYTHON_LOAD_FUNC("PyGILState_GetThisThreadState", GILState_GetThisThreadState);
91 GATE_PYTHON_LOAD_FUNC("PyInterpreterState_New", InterpreterState_New);
92 GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Clear", InterpreterState_Clear);
93 GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Delete", InterpreterState_Delete);
94 GATE_PYTHON_LOAD_FUNC("PyThreadState_New", ThreadState_New);
95 GATE_PYTHON_LOAD_FUNC("PyThreadState_Clear", ThreadState_Clear);
96 GATE_PYTHON_LOAD_FUNC("PyThreadState_Delete", ThreadState_Delete);
97 GATE_PYTHON_LOAD_FUNC("PyThreadState_GetDict", ThreadState_GetDict);
98 GATE_PYTHON_LOAD_FUNC("PyThreadState_SetAsyncExc", ThreadState_SetAsyncExc);
99 GATE_PYTHON_LOAD_FUNC("PyEval_AcquireThread", Eval_AcquireThread);
100 GATE_PYTHON_LOAD_FUNC("PyEval_ReleaseThread", Eval_ReleaseThread);
101 GATE_PYTHON_LOAD_FUNC("PyEval_AcquireLock", Eval_AcquireLock);
102 GATE_PYTHON_LOAD_FUNC("PyEval_ReleaseLock", Eval_ReleaseLock);
103 GATE_PYTHON_LOAD_FUNC("Py_NewInterpreter", NewInterpreter);
104 GATE_PYTHON_LOAD_FUNC("Py_EndInterpreter", EndInterpreter);
105 GATE_PYTHON_LOAD_FUNC("Py_AddPendingCall", AddPendingCall);
106 GATE_PYTHON_LOAD_FUNC("PyEval_SetProfile", Eval_SetProfile);
107 GATE_PYTHON_LOAD_FUNC("PyEval_SetTrace", Eval_SetTrace);
108 GATE_PYTHON_LOAD_FUNC("PyEval_GetCallStats", Eval_GetCallStats);
109
110 GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Head", InterpreterState_Head);
111 GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Next", InterpreterState_Next);
112 GATE_PYTHON_LOAD_FUNC("PyInterpreterState_ThreadHead", InterpreterState_ThreadHead);
113 GATE_PYTHON_LOAD_FUNC("PyThreadState_Next", ThreadState_Next);
114
115 close_library = false;
116 ret = GATE_RESULT_OK;
117 } while (0);
118
119 if (GATE_FAILED(ret))
120 {
121 gate_atomic_flag_clear(&gate_python_init_done);
122 }
123
124 if (close_library)
125 {
126 gate_library_close(gate_python_library);
127 }
128 gate_python_library = NULL;
129
130 return ret;
131 }
132
133