python27_sys/
modsupport.rs

1use core::ptr;
2use libc::{c_char, c_int, c_long};
3
4use crate::methodobject::PyMethodDef;
5use crate::object::PyObject;
6use crate::pyport::Py_ssize_t;
7
8#[cfg_attr(windows, link(name = "pythonXY"))]
9extern "C" {
10    pub fn PyArg_Parse(args: *mut PyObject, format: *const c_char, ...) -> c_int;
11    pub fn PyArg_ParseTuple(args: *mut PyObject, format: *const c_char, ...) -> c_int;
12    pub fn PyArg_ParseTupleAndKeywords(
13        args: *mut PyObject,
14        kw: *mut PyObject,
15        format: *const c_char,
16        keywords: *mut *mut c_char,
17        ...
18    ) -> c_int;
19    pub fn PyArg_UnpackTuple(
20        args: *mut PyObject,
21        name: *const c_char,
22        min: Py_ssize_t,
23        max: Py_ssize_t,
24        ...
25    ) -> c_int;
26    pub fn Py_BuildValue(format: *const c_char, ...) -> *mut PyObject;
27
28    ignore! {
29        fn _Py_BuildValue_SizeT(arg1: *const c_char, ...) -> *mut PyObject;
30        fn _PyArg_NoKeywords(funcname: *const c_char, kw: *mut PyObject) -> c_int;
31    }
32
33    pub fn PyModule_AddObject(
34        module: *mut PyObject,
35        name: *const c_char,
36        value: *mut PyObject,
37    ) -> c_int;
38    pub fn PyModule_AddIntConstant(
39        module: *mut PyObject,
40        name: *const c_char,
41        value: c_long,
42    ) -> c_int;
43    pub fn PyModule_AddStringConstant(
44        module: *mut PyObject,
45        name: *const c_char,
46        value: *const c_char,
47    ) -> c_int;
48
49    #[cfg(all(target_pointer_width = "64", not(py_sys_config = "Py_TRACE_REFS")))]
50    fn Py_InitModule4_64(
51        name: *const c_char,
52        methods: *mut PyMethodDef,
53        doc: *const c_char,
54        _self: *mut PyObject,
55        apiver: c_int,
56    ) -> *mut PyObject;
57
58    #[cfg(all(target_pointer_width = "64", py_sys_config = "Py_TRACE_REFS"))]
59    fn Py_InitModule4TraceRefs_64(
60        name: *const c_char,
61        methods: *mut PyMethodDef,
62        doc: *const c_char,
63        _self: *mut PyObject,
64        apiver: c_int,
65    ) -> *mut PyObject;
66
67    #[cfg(all(not(target_pointer_width = "64"), not(py_sys_config = "Py_TRACE_REFS")))]
68    pub fn Py_InitModule4(
69        name: *const c_char,
70        methods: *mut PyMethodDef,
71        doc: *const c_char,
72        _self: *mut PyObject,
73        apiver: c_int,
74    ) -> *mut PyObject;
75
76    #[cfg(all(not(target_pointer_width = "64"), py_sys_config = "Py_TRACE_REFS"))]
77    fn Py_InitModule4TraceRefs(
78        name: *const c_char,
79        methods: *mut PyMethodDef,
80        doc: *const c_char,
81        _self: *mut PyObject,
82        apiver: c_int,
83    ) -> *mut PyObject;
84}
85
86pub const PYTHON_API_VERSION: c_int = 1013;
87
88#[cfg(all(target_pointer_width = "64", not(py_sys_config = "Py_TRACE_REFS")))]
89#[inline(always)]
90pub unsafe fn Py_InitModule4(
91    name: *const c_char,
92    methods: *mut PyMethodDef,
93    doc: *const c_char,
94    _self: *mut PyObject,
95    apiver: c_int,
96) -> *mut PyObject {
97    Py_InitModule4_64(name, methods, doc, _self, apiver)
98}
99
100#[cfg(all(target_pointer_width = "64", py_sys_config = "Py_TRACE_REFS"))]
101#[inline(always)]
102pub unsafe fn Py_InitModule4(
103    name: *const c_char,
104    methods: *mut PyMethodDef,
105    doc: *const c_char,
106    _self: *mut PyObject,
107    apiver: c_int,
108) -> *mut PyObject {
109    Py_InitModule4TraceRefs_64(name, methods, doc, _self, apiver)
110}
111
112#[cfg(all(not(target_pointer_width = "64"), py_sys_config = "Py_TRACE_REFS"))]
113#[inline(always)]
114pub unsafe fn Py_InitModule4(
115    name: *const c_char,
116    methods: *mut PyMethodDef,
117    doc: *const c_char,
118    _self: *mut PyObject,
119    apiver: c_int,
120) -> *mut PyObject {
121    Py_InitModule4TraceRefs(name, methods, doc, _self, apiver)
122}
123
124#[inline(always)]
125pub unsafe fn Py_InitModule(name: *const c_char, methods: *mut PyMethodDef) -> *mut PyObject {
126    Py_InitModule4(
127        name,
128        methods,
129        ptr::null(),
130        ptr::null_mut(),
131        PYTHON_API_VERSION,
132    )
133}
134
135#[inline(always)]
136pub unsafe fn Py_InitModule3(
137    name: *const c_char,
138    methods: *mut PyMethodDef,
139    doc: *const c_char,
140) -> *mut PyObject {
141    Py_InitModule4(name, methods, doc, ptr::null_mut(), PYTHON_API_VERSION)
142}