pyforge_ffi/
moduleobject.rs1use crate::methodobject::PyMethodDef;
2use crate::object::*;
3use crate::pyport::Py_ssize_t;
4use std::ffi::{c_char, c_int, c_void};
5
6extern_libpython! {
7 pub static mut PyModule_Type: PyTypeObject;
8}
9
10#[inline]
11pub unsafe fn PyModule_Check(op: *mut PyObject) -> c_int {
12 PyObject_TypeCheck(op, &raw mut PyModule_Type)
13}
14
15#[inline]
16pub unsafe fn PyModule_CheckExact(op: *mut PyObject) -> c_int {
17 (Py_TYPE(op) == &raw mut PyModule_Type) as c_int
18}
19
20extern_libpython! {
21 pub fn PyModule_NewObject(name: *mut PyObject) -> *mut PyObject;
22 pub fn PyModule_New(name: *const c_char) -> *mut PyObject;
23 pub fn PyModule_GetDict(arg1: *mut PyObject) -> *mut PyObject;
24 pub fn PyModule_GetNameObject(arg1: *mut PyObject) -> *mut PyObject;
25 pub fn PyModule_GetName(arg1: *mut PyObject) -> *const c_char;
26 #[deprecated(note = "Python 3.2")]
27 pub fn PyModule_GetFilename(arg1: *mut PyObject) -> *const c_char;
28 pub fn PyModule_GetFilenameObject(arg1: *mut PyObject) -> *mut PyObject;
29 pub fn PyModule_GetDef(arg1: *mut PyObject) -> *mut PyModuleDef;
33 pub fn PyModule_GetState(arg1: *mut PyObject) -> *mut c_void;
34 pub fn PyModuleDef_Init(arg1: *mut PyModuleDef) -> *mut PyObject;
35}
36
37extern_libpython! {
38 pub static mut PyModuleDef_Type: PyTypeObject;
39}
40
41#[repr(C)]
42pub struct PyModuleDef_Base {
43 pub ob_base: PyObject,
44 pub m_init: Option<extern "C" fn() -> *mut PyObject>,
46 pub m_index: Py_ssize_t,
47 pub m_copy: *mut PyObject,
48}
49
50#[allow(
51 clippy::declare_interior_mutable_const,
52 reason = "contains atomic refcount on free-threaded builds"
53)]
54pub const PyModuleDef_HEAD_INIT: PyModuleDef_Base = PyModuleDef_Base {
55 ob_base: PyObject_HEAD_INIT,
56 m_init: None,
57 m_index: 0,
58 m_copy: std::ptr::null_mut(),
59};
60
61#[repr(C)]
62#[derive(Copy, Clone, Eq, PartialEq)]
63pub struct PyModuleDef_Slot {
64 pub slot: c_int,
65 pub value: *mut c_void,
66}
67
68impl Default for PyModuleDef_Slot {
69 fn default() -> PyModuleDef_Slot {
70 PyModuleDef_Slot {
71 slot: 0,
72 value: std::ptr::null_mut(),
73 }
74 }
75}
76
77pub const Py_mod_create: c_int = 1;
78pub const Py_mod_exec: c_int = 2;
79#[cfg(Py_3_12)]
80pub const Py_mod_multiple_interpreters: c_int = 3;
81#[cfg(Py_3_13)]
82pub const Py_mod_gil: c_int = 4;
83#[cfg(Py_3_15)]
84pub const Py_mod_abi: c_int = 5;
85#[cfg(Py_3_15)]
86pub const Py_mod_name: c_int = 6;
87#[cfg(Py_3_15)]
88pub const Py_mod_doc: c_int = 7;
89#[cfg(Py_3_15)]
90pub const Py_mod_state_size: c_int = 8;
91#[cfg(Py_3_15)]
92pub const Py_mod_methods: c_int = 9;
93#[cfg(Py_3_15)]
94pub const Py_mod_state_traverse: c_int = 10;
95#[cfg(Py_3_15)]
96pub const Py_mod_state_clear: c_int = 11;
97#[cfg(Py_3_15)]
98pub const Py_mod_state_free: c_int = 12;
99#[cfg(Py_3_15)]
100pub const Py_mod_token: c_int = 13;
101
102#[cfg(Py_3_12)]
105#[allow(
106 clippy::zero_ptr,
107 reason = "matches the way that the rest of these constants are defined"
108)]
109pub const Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED: *mut c_void = 0 as *mut c_void;
110#[cfg(Py_3_12)]
111pub const Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED: *mut c_void = 1 as *mut c_void;
112#[cfg(Py_3_12)]
113pub const Py_MOD_PER_INTERPRETER_GIL_SUPPORTED: *mut c_void = 2 as *mut c_void;
114
115#[cfg(Py_3_13)]
116#[allow(
117 clippy::zero_ptr,
118 reason = "matches the way that the rest of these constants are defined"
119)]
120pub const Py_MOD_GIL_USED: *mut c_void = 0 as *mut c_void;
121#[cfg(Py_3_13)]
122pub const Py_MOD_GIL_NOT_USED: *mut c_void = 1 as *mut c_void;
123
124#[cfg(all(not(Py_LIMITED_API), Py_GIL_DISABLED))]
125extern_libpython! {
126 pub fn PyUnstable_Module_SetGIL(module: *mut PyObject, gil: *mut c_void) -> c_int;
127}
128
129#[cfg(Py_3_15)]
130extern_libpython! {
131 pub fn PyModule_FromSlotsAndSpec(
132 slots: *const PyModuleDef_Slot,
133 spec: *mut PyObject,
134 ) -> *mut PyObject;
135 pub fn PyModule_Exec(_mod: *mut PyObject) -> c_int;
136 pub fn PyModule_GetStateSize(_mod: *mut PyObject, result: *mut Py_ssize_t) -> c_int;
137 pub fn PyModule_GetToken(module: *mut PyObject, result: *mut *mut c_void) -> c_int;
138}
139
140#[repr(C)]
141pub struct PyModuleDef {
142 pub m_base: PyModuleDef_Base,
143 pub m_name: *const c_char,
144 pub m_doc: *const c_char,
145 pub m_size: Py_ssize_t,
146 pub m_methods: *mut PyMethodDef,
147 pub m_slots: *mut PyModuleDef_Slot,
148 pub m_traverse: Option<traverseproc>,
150 pub m_clear: Option<inquiry>,
151 pub m_free: Option<freefunc>,
152}