Skip to main content

pyforge_ffi/
moduleobject.rs

1use 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    // skipped non-limited _PyModule_Clear
30    // skipped non-limited _PyModule_ClearDict
31    // skipped non-limited _PyModuleSpec_IsInitializing
32    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    // Rust function pointers are non-null so an Option is needed here.
45    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// skipped private _Py_mod_LAST_SLOT
103
104#[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    // Rust function pointers are non-null so an Option is needed here.
149    pub m_traverse: Option<traverseproc>,
150    pub m_clear: Option<inquiry>,
151    pub m_free: Option<freefunc>,
152}