python3_sys/
modsupport.rs

1use libc::{c_char, c_int, c_long};
2
3#[cfg(Py_3_5)]
4use crate::methodobject::PyMethodDef;
5use crate::moduleobject::PyModuleDef;
6use crate::object::PyObject;
7#[cfg(Py_3_9)]
8use crate::object::PyTypeObject;
9use crate::pyport::Py_ssize_t;
10
11#[cfg_attr(windows, link(name = "pythonXY"))]
12extern "C" {
13    pub fn PyArg_Parse(arg1: *mut PyObject, arg2: *const c_char, ...) -> c_int;
14    pub fn PyArg_ParseTuple(arg1: *mut PyObject, arg2: *const c_char, ...) -> c_int;
15    pub fn PyArg_ParseTupleAndKeywords(
16        arg1: *mut PyObject,
17        arg2: *mut PyObject,
18        arg3: *const c_char,
19        arg4: *mut *mut c_char,
20        ...
21    ) -> c_int;
22    pub fn PyArg_ValidateKeywordArguments(arg1: *mut PyObject) -> c_int;
23    pub fn PyArg_UnpackTuple(
24        arg1: *mut PyObject,
25        arg2: *const c_char,
26        arg3: Py_ssize_t,
27        arg4: Py_ssize_t,
28        ...
29    ) -> c_int;
30    pub fn Py_BuildValue(arg1: *const c_char, ...) -> *mut PyObject;
31    ignore! {
32        pub fn _Py_BuildValue_SizeT(arg1: *const c_char, ...) -> *mut PyObject;
33        pub fn Py_VaBuildValue(arg1: *const c_char, arg2: va_list) -> *mut PyObject;
34    }
35    #[cfg(Py_3_10)]
36    pub fn PyModule_AddObjectRef(
37        module: *mut PyObject,
38        name: *const c_char,
39        value: *mut PyObject,
40    ) -> c_int;
41    pub fn PyModule_AddObject(
42        module: *mut PyObject,
43        name: *const c_char,
44        value: *mut PyObject,
45    ) -> c_int;
46    pub fn PyModule_AddIntConstant(arg1: *mut PyObject, arg2: *const c_char, arg3: c_long)
47        -> c_int;
48    pub fn PyModule_AddStringConstant(
49        arg1: *mut PyObject,
50        arg2: *const c_char,
51        arg3: *const c_char,
52    ) -> c_int;
53    #[cfg(Py_3_9)]
54    pub fn PyModule_AddType(module: *mut PyObject, ty: *mut PyTypeObject) -> c_int;
55    #[cfg(Py_3_5)]
56    pub fn PyModule_SetDocString(module: *mut PyObject, value: *const c_char) -> c_int;
57    #[cfg(Py_3_5)]
58    pub fn PyModule_AddFunctions(module: *mut PyObject, methods: *mut PyMethodDef) -> c_int;
59    #[cfg(Py_3_5)]
60    pub fn PyModule_ExecDef(module: *mut PyObject, def: *mut PyModuleDef) -> c_int;
61}
62
63pub const Py_CLEANUP_SUPPORTED: i32 = 0x20000;
64
65pub const PYTHON_API_VERSION: i32 = 1013;
66pub const PYTHON_ABI_VERSION: i32 = 3;
67
68#[cfg_attr(windows, link(name = "pythonXY"))]
69extern "C" {
70    #[cfg(not(py_sys_config = "Py_TRACE_REFS"))]
71    pub fn PyModule_Create2(module: *mut PyModuleDef, apiver: c_int) -> *mut PyObject;
72
73    #[cfg(py_sys_config = "Py_TRACE_REFS")]
74    fn PyModule_Create2TraceRefs(module: *mut PyModuleDef, apiver: c_int) -> *mut PyObject;
75
76    #[cfg(not(py_sys_config = "Py_TRACE_REFS"))]
77    #[cfg(Py_3_5)]
78    pub fn PyModule_FromDefAndSpec2(
79        def: *mut PyModuleDef,
80        spec: *mut PyObject,
81        module_api_version: c_int,
82    ) -> *mut PyObject;
83
84    #[cfg(py_sys_config = "Py_TRACE_REFS")]
85    #[cfg(Py_3_5)]
86    fn PyModule_FromDefAndSpec2TraceRefs(
87        def: *mut PyModuleDef,
88        spec: *mut PyObject,
89        module_api_version: c_int,
90    ) -> *mut PyObject;
91}
92
93#[cfg(py_sys_config = "Py_TRACE_REFS")]
94#[inline]
95pub unsafe fn PyModule_Create2(module: *mut PyModuleDef, apiver: c_int) -> *mut PyObject {
96    PyModule_Create2TraceRefs(module, apiver)
97}
98
99#[cfg(py_sys_config = "Py_TRACE_REFS")]
100#[cfg(Py_3_5)]
101#[inline]
102pub unsafe fn PyModule_FromDefAndSpec2(
103    def: *mut PyModuleDef,
104    spec: *mut PyObject,
105    module_api_version: c_int,
106) -> *mut PyObject {
107    PyModule_FromDefAndSpec2TraceRefs(def, spec, module_api_version)
108}
109
110#[inline]
111pub unsafe fn PyModule_Create(module: *mut PyModuleDef) -> *mut PyObject {
112    PyModule_Create2(
113        module,
114        if cfg!(Py_LIMITED_API) {
115            PYTHON_ABI_VERSION
116        } else {
117            PYTHON_API_VERSION
118        },
119    )
120}
121
122#[inline]
123#[cfg(Py_3_5)]
124pub unsafe fn PyModule_FromDefAndSpec(def: *mut PyModuleDef, spec: *mut PyObject) -> *mut PyObject {
125    PyModule_FromDefAndSpec2(
126        def,
127        spec,
128        if cfg!(Py_LIMITED_API) {
129            PYTHON_ABI_VERSION
130        } else {
131            PYTHON_API_VERSION
132        },
133    )
134}
135
136#[cfg(all(not(Py_LIMITED_API), not(Py_3_12)))]
137#[cfg_attr(windows, link(name = "pythonXY"))]
138extern "C" {
139    pub static mut _Py_PackageContext: *const c_char;
140}