obs-scripting-python-import.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. /******************************************************************************
  2. Copyright (C) 2023 by Lain Bailey <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. ******************************************************************************/
  14. #pragma once
  15. #include <util/c99defs.h>
  16. #if defined(_WIN32) || defined(__APPLE__)
  17. #define RUNTIME_LINK 1
  18. #define Py_NO_ENABLE_SHARED
  19. #else
  20. #define RUNTIME_LINK 0
  21. #endif
  22. #ifdef _MSC_VER
  23. #pragma warning(push)
  24. #pragma warning(disable : 4115)
  25. #endif
  26. #if defined(_WIN32) && defined(_DEBUG)
  27. #undef _DEBUG
  28. #include <Python.h>
  29. #define _DEBUG
  30. #else
  31. #include <Python.h>
  32. #endif
  33. #ifdef _MSC_VER
  34. #pragma warning(pop)
  35. #endif
  36. #if RUNTIME_LINK
  37. #ifdef NO_REDEFS
  38. #define PY_EXTERN
  39. #else
  40. #define PY_EXTERN extern
  41. #endif
  42. typedef struct python_version {
  43. int major;
  44. int minor;
  45. } python_version_t;
  46. PY_EXTERN int (*Import_PyType_Ready)(PyTypeObject *);
  47. PY_EXTERN PyObject *(*Import_PyObject_GenericGetAttr)(PyObject *, PyObject *);
  48. PY_EXTERN void (*Import_PyType_Modified)(PyTypeObject *);
  49. PY_EXTERN int (*Import_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
  50. PY_EXTERN int (*Import_PyObject_IsTrue)(PyObject *);
  51. PY_EXTERN void (*Import_Py_DecRef)(PyObject *);
  52. PY_EXTERN void *(*Import_PyObject_Malloc)(size_t size);
  53. PY_EXTERN void (*Import_PyObject_Free)(void *ptr);
  54. PY_EXTERN PyObject *(*Import_PyObject_Init)(PyObject *, PyTypeObject *);
  55. PY_EXTERN PyObject *(*Import_PyUnicode_FromFormat)(const char *format, ...);
  56. PY_EXTERN PyObject *(*Import_PyUnicode_Concat)(PyObject *left, PyObject *right);
  57. PY_EXTERN PyObject *(*Import_PyLong_FromVoidPtr)(void *);
  58. PY_EXTERN PyObject *(*Import_PyLong_FromLong)(long);
  59. PY_EXTERN PyObject *(*Import_PyBool_FromLong)(long);
  60. PY_EXTERN PyGILState_STATE (*Import_PyGILState_Ensure)(void);
  61. PY_EXTERN PyThreadState *(*Import_PyGILState_GetThisThreadState)(void);
  62. PY_EXTERN void (*Import_PyErr_SetString)(PyObject *exception,
  63. const char *string);
  64. PY_EXTERN PyObject *(*Import_PyErr_Occurred)(void);
  65. PY_EXTERN void (*Import_PyErr_Fetch)(PyObject **, PyObject **, PyObject **);
  66. PY_EXTERN void (*Import_PyErr_Restore)(PyObject *, PyObject *, PyObject *);
  67. PY_EXTERN void (*Import_PyErr_WriteUnraisable)(PyObject *);
  68. PY_EXTERN int (*Import_PyArg_UnpackTuple)(PyObject *, const char *, Py_ssize_t,
  69. Py_ssize_t, ...);
  70. PY_EXTERN PyObject *(*Import_Py_BuildValue)(const char *, ...);
  71. PY_EXTERN int (*Import_PyRun_SimpleStringFlags)(const char *,
  72. PyCompilerFlags *);
  73. PY_EXTERN void (*Import_PyErr_Print)(void);
  74. PY_EXTERN void (*Import_Py_SetPythonHome)(wchar_t *);
  75. PY_EXTERN void (*Import_Py_Initialize)(void);
  76. PY_EXTERN void (*Import_Py_Finalize)(void);
  77. PY_EXTERN int (*Import_Py_IsInitialized)(void);
  78. PY_EXTERN void (*Import_PyEval_InitThreads)(void);
  79. PY_EXTERN int (*Import_PyEval_ThreadsInitialized)(void);
  80. PY_EXTERN void (*Import_PyEval_ReleaseThread)(PyThreadState *tstate);
  81. PY_EXTERN void (*Import_PySys_SetArgv)(int, wchar_t **);
  82. PY_EXTERN PyObject *(*Import_PyImport_ImportModule)(const char *name);
  83. PY_EXTERN PyObject *(*Import_PyObject_CallFunctionObjArgs)(PyObject *callable,
  84. ...);
  85. PY_EXTERN PyObject(*Import__Py_NotImplementedStruct);
  86. PY_EXTERN PyObject *(*Import_PyExc_TypeError);
  87. PY_EXTERN PyObject *(*Import_PyExc_RuntimeError);
  88. PY_EXTERN PyObject *(*Import_PyObject_GetAttr)(PyObject *, PyObject *);
  89. PY_EXTERN PyObject *(*Import_PyUnicode_FromString)(const char *u);
  90. PY_EXTERN PyObject *(*Import_PyDict_New)(void);
  91. PY_EXTERN PyObject *(*Import_PyDict_GetItemString)(PyObject *dp,
  92. const char *key);
  93. PY_EXTERN int (*Import_PyDict_SetItemString)(PyObject *dp, const char *key,
  94. PyObject *item);
  95. PY_EXTERN PyObject *(*Import_PyCFunction_NewEx)(PyMethodDef *, PyObject *,
  96. PyObject *);
  97. PY_EXTERN PyObject *(*Import_PyCMethod_New)(PyMethodDef *, PyObject *,
  98. PyObject *, PyTypeObject *);
  99. PY_EXTERN PyObject *(*Import_PyModule_GetDict)(PyObject *);
  100. PY_EXTERN PyObject *(*Import_PyModule_GetNameObject)(PyObject *);
  101. PY_EXTERN int (*Import_PyModule_AddObject)(PyObject *, const char *,
  102. PyObject *);
  103. PY_EXTERN int (*Import_PyModule_AddStringConstant)(PyObject *, const char *,
  104. const char *);
  105. PY_EXTERN PyObject *(*Import_PyImport_Import)(PyObject *name);
  106. PY_EXTERN PyObject *(*Import_PyObject_CallObject)(PyObject *callable_object,
  107. PyObject *args);
  108. PY_EXTERN struct _longobject(*Import__Py_FalseStruct);
  109. PY_EXTERN struct _longobject(*Import__Py_TrueStruct);
  110. PY_EXTERN void (*Import_PyGILState_Release)(PyGILState_STATE);
  111. PY_EXTERN int (*Import_PyList_Append)(PyObject *, PyObject *);
  112. PY_EXTERN PyObject *(*Import_PySys_GetObject)(const char *);
  113. PY_EXTERN PyObject *(*Import_PyImport_ReloadModule)(PyObject *m);
  114. PY_EXTERN PyObject *(*Import_PyObject_GetAttrString)(PyObject *, const char *);
  115. PY_EXTERN PyObject *(*Import_PyCapsule_New)(void *pointer, const char *name,
  116. PyCapsule_Destructor destructor);
  117. PY_EXTERN void *(*Import_PyCapsule_GetPointer)(PyObject *capsule,
  118. const char *name);
  119. PY_EXTERN int (*Import_PyArg_ParseTuple)(PyObject *, const char *, ...);
  120. PY_EXTERN PyTypeObject(*Import_PyFunction_Type);
  121. PY_EXTERN int (*Import_PyObject_SetAttr)(PyObject *, PyObject *, PyObject *);
  122. PY_EXTERN PyObject *(*Import__PyObject_New)(PyTypeObject *);
  123. PY_EXTERN void *(*Import_PyCapsule_Import)(const char *name, int no_block);
  124. PY_EXTERN void (*Import_PyErr_Clear)(void);
  125. PY_EXTERN PyObject *(*Import_PyObject_Call)(PyObject *callable_object,
  126. PyObject *args, PyObject *kwargs);
  127. PY_EXTERN PyObject *(*Import_PyList_New)(Py_ssize_t size);
  128. PY_EXTERN Py_ssize_t (*Import_PyList_Size)(PyObject *);
  129. PY_EXTERN PyObject *(*Import_PyList_GetItem)(PyObject *, Py_ssize_t);
  130. PY_EXTERN PyObject *(*Import_PyUnicode_AsUTF8String)(PyObject *unicode);
  131. PY_EXTERN PyObject *(*Import_PyLong_FromUnsignedLongLong)(unsigned long long);
  132. PY_EXTERN int (*Import_PyArg_VaParse)(PyObject *, const char *, va_list);
  133. PY_EXTERN PyObject(*Import__Py_NoneStruct);
  134. PY_EXTERN PyObject *(*Import_PyTuple_New)(Py_ssize_t size);
  135. PY_EXTERN int (*Import_PyType_GetFlags)(PyTypeObject *o);
  136. #if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
  137. PY_EXTERN void (*Import__Py_Dealloc)(PyObject *obj);
  138. #endif
  139. PY_EXTERN PyTypeObject PyCFunction_Type;
  140. extern bool import_python(const char *python_path,
  141. python_version_t *python_version);
  142. #ifndef NO_REDEFS
  143. #define PyType_Ready Import_PyType_Ready
  144. #define PyType_GetFlags Import_PyType_GetFlags
  145. #define PyType_Modified Import_PyType_Modified
  146. #define PyType_IsSubtype Import_PyType_IsSubtype
  147. #define PyObject_GenericGetAttr Import_PyObject_GenericGetAttr
  148. #define PyObject_IsTrue Import_PyObject_IsTrue
  149. #define Py_DecRef Import_Py_DecRef
  150. #define PyObject_Malloc Import_PyObject_Malloc
  151. #define PyObject_Free Import_PyObject_Free
  152. #define PyObject_Init Import_PyObject_Init
  153. #define PyUnicode_FromFormat Import_PyUnicode_FromFormat
  154. #define PyUnicode_Concat Import_PyUnicode_Concat
  155. #define PyLong_FromVoidPtr Import_PyLong_FromVoidPtr
  156. #define PyLong_FromLong Import_PyLong_FromLong
  157. #define PyBool_FromLong Import_PyBool_FromLong
  158. #define PyGILState_Ensure Import_PyGILState_Ensure
  159. #define PyGILState_GetThisThreadState Import_PyGILState_GetThisThreadState
  160. #define PyErr_SetString Import_PyErr_SetString
  161. #define PyErr_Occurred Import_PyErr_Occurred
  162. #define PyErr_Fetch Import_PyErr_Fetch
  163. #define PyErr_Restore Import_PyErr_Restore
  164. #define PyErr_WriteUnraisable Import_PyErr_WriteUnraisable
  165. #define PyArg_UnpackTuple Import_PyArg_UnpackTuple
  166. #define Py_BuildValue Import_Py_BuildValue
  167. #define PyRun_SimpleStringFlags Import_PyRun_SimpleStringFlags
  168. #define PyErr_Print Import_PyErr_Print
  169. #define Py_SetPythonHome Import_Py_SetPythonHome
  170. #define Py_Initialize Import_Py_Initialize
  171. #define Py_Finalize Import_Py_Finalize
  172. #define Py_IsInitialized Import_Py_IsInitialized
  173. #define PyEval_InitThreads Import_PyEval_InitThreads
  174. #define PyEval_ThreadsInitialized Import_PyEval_ThreadsInitialized
  175. #define PyEval_ReleaseThread Import_PyEval_ReleaseThread
  176. #define PySys_SetArgv Import_PySys_SetArgv
  177. #define PyImport_ImportModule Import_PyImport_ImportModule
  178. #define PyObject_CallFunctionObjArgs Import_PyObject_CallFunctionObjArgs
  179. #define _Py_NotImplementedStruct (*Import__Py_NotImplementedStruct)
  180. #define PyExc_TypeError (*Import_PyExc_TypeError)
  181. #define PyExc_RuntimeError (*Import_PyExc_RuntimeError)
  182. #define PyObject_GetAttr Import_PyObject_GetAttr
  183. #define PyUnicode_FromString Import_PyUnicode_FromString
  184. #define PyDict_New Import_PyDict_New
  185. #define PyDict_GetItemString Import_PyDict_GetItemString
  186. #define PyDict_SetItemString Import_PyDict_SetItemString
  187. #if PY_VERSION_HEX < 0x030900b0
  188. #define PyCFunction_NewEx Import_PyCFunction_NewEx
  189. #else
  190. #define PyCMethod_New Import_PyCMethod_New
  191. #endif
  192. #define PyModule_GetDict Import_PyModule_GetDict
  193. #define PyModule_GetNameObject Import_PyModule_GetNameObject
  194. #define PyModule_AddObject Import_PyModule_AddObject
  195. #define PyModule_AddStringConstant Import_PyModule_AddStringConstant
  196. #define PyImport_Import Import_PyImport_Import
  197. #define PyObject_CallObject Import_PyObject_CallObject
  198. #define _Py_FalseStruct (*Import__Py_FalseStruct)
  199. #define _Py_TrueStruct (*Import__Py_TrueStruct)
  200. #define PyGILState_Release Import_PyGILState_Release
  201. #define PyList_Append Import_PyList_Append
  202. #define PySys_GetObject Import_PySys_GetObject
  203. #define PyImport_ReloadModule Import_PyImport_ReloadModule
  204. #define PyObject_GetAttrString Import_PyObject_GetAttrString
  205. #define PyCapsule_New Import_PyCapsule_New
  206. #define PyCapsule_GetPointer Import_PyCapsule_GetPointer
  207. #define PyArg_ParseTuple Import_PyArg_ParseTuple
  208. #define PyFunction_Type (*Import_PyFunction_Type)
  209. #define PyObject_SetAttr Import_PyObject_SetAttr
  210. #define _PyObject_New Import__PyObject_New
  211. #define PyCapsule_Import Import_PyCapsule_Import
  212. #define PyErr_Clear Import_PyErr_Clear
  213. #define PyObject_Call Import_PyObject_Call
  214. #define PyList_New Import_PyList_New
  215. #define PyList_Size Import_PyList_Size
  216. #define PyList_GetItem Import_PyList_GetItem
  217. #define PyUnicode_AsUTF8String Import_PyUnicode_AsUTF8String
  218. #define PyLong_FromUnsignedLongLong Import_PyLong_FromUnsignedLongLong
  219. #define PyArg_VaParse Import_PyArg_VaParse
  220. #define _Py_NoneStruct (*Import__Py_NoneStruct)
  221. #define PyTuple_New Import_PyTuple_New
  222. #if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
  223. #define _Py_Dealloc Import__Py_Dealloc
  224. #endif
  225. #if PY_VERSION_HEX >= 0x030800f0
  226. static inline void Import__Py_DECREF(const char *filename, int lineno,
  227. PyObject *op)
  228. {
  229. UNUSED_PARAMETER(filename);
  230. UNUSED_PARAMETER(lineno);
  231. if (--op->ob_refcnt != 0) {
  232. #ifdef Py_REF_DEBUG
  233. if (op->ob_refcnt < 0) {
  234. _Py_NegativeRefcount(filename, lineno, op);
  235. }
  236. #endif
  237. } else {
  238. _Py_Dealloc(op);
  239. }
  240. }
  241. #undef Py_DECREF
  242. #define Py_DECREF(op) Import__Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
  243. static inline void Import__Py_XDECREF(PyObject *op)
  244. {
  245. if (op != NULL) {
  246. Py_DECREF(op);
  247. }
  248. }
  249. #undef Py_XDECREF
  250. #define Py_XDECREF(op) Import__Py_XDECREF(_PyObject_CAST(op))
  251. #endif // PY_VERSION_HEX >= 0x030800f0
  252. #if PY_VERSION_HEX >= 0x030900b0
  253. static inline int Import_PyType_HasFeature(PyTypeObject *type,
  254. unsigned long feature)
  255. {
  256. return ((PyType_GetFlags(type) & feature) != 0);
  257. }
  258. #define PyType_HasFeature(t, f) Import_PyType_HasFeature(t, f)
  259. #endif // PY_VERSION_HEX >= 0x030900b0
  260. #if PY_VERSION_HEX >= 0x030a00b2
  261. static inline int Import__PyObject_TypeCheck(PyObject *ob, PyTypeObject *type)
  262. {
  263. return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type);
  264. }
  265. #if PY_VERSION_HEX >= 0x030b00b3
  266. #undef PyObject_TypeCheck
  267. #define PyObject_TypeCheck(o, t) Import__PyObject_TypeCheck(o, t)
  268. #else
  269. #define _PyObject_TypeCheck(o, t) Import__PyObject_TypeCheck(o, t)
  270. #endif // PY_VERSION_HEX >= 0x030b00b3
  271. #endif // PY_VERSION_HEX >= 0x030a00b2
  272. #endif // NO_REDEFS
  273. #endif // RUNTIME_LINK