Skip to content

Commit ace4ee0

Browse files
committed
Bring back ModuleInitializer for wrap_pymodule!
1 parent 341ef57 commit ace4ee0

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

pyo3-macros-backend/src/module.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ pub fn pymodule_impl(
119119
concat!(stringify!(#name), "\0"),
120120
#doc,
121121
&#slots_name as *const #krate::impl_::pymodule::ModuleDefSlot as *mut #krate::ffi::PyModuleDef_Slot,
122+
#krate::impl_::pymodule::ModuleInitializer(#fnname),
122123
)
123124
};
124125
}

src/impl_/pymodule.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ unsafe impl Sync for ModuleDefSlot {}
1919
pub struct ModuleDef {
2020
// wrapped in UnsafeCell so that Rust compiler treats this as interior mutability
2121
ffi_def: UnsafeCell<ffi::PyModuleDef>,
22+
initializer: ModuleInitializer,
2223
}
2324

25+
/// Wrapper to enable initializer to be used in const fns.
26+
pub struct ModuleInitializer(pub for<'py> fn(Python<'py>, &PyModule) -> PyResult<()>);
27+
2428
unsafe impl Sync for ModuleDef {}
2529

2630
impl ModuleDefSlot {
@@ -39,6 +43,7 @@ impl ModuleDef {
3943
name: &'static str,
4044
doc: &'static str,
4145
slots: *mut ffi::PyModuleDef_Slot,
46+
initializer: ModuleInitializer,
4247
) -> Self {
4348
const INIT: ffi::PyModuleDef = ffi::PyModuleDef {
4449
m_base: ffi::PyModuleDef_HEAD_INIT,
@@ -59,7 +64,10 @@ impl ModuleDef {
5964
..INIT
6065
});
6166

62-
ModuleDef { ffi_def }
67+
ModuleDef {
68+
ffi_def,
69+
initializer,
70+
}
6371
}
6472
/// Return module def
6573
pub fn module_def(&'static self) -> *mut ffi::PyModuleDef {
@@ -68,9 +76,11 @@ impl ModuleDef {
6876
/// Builds a module using user given initializer. Used for [`#[pymodule]`][crate::pymodule].
6977
pub fn make_module(&'static self, py: Python<'_>) -> PyResult<PyObject> {
7078
let module = unsafe {
71-
Py::<PyModule>::from_owned_ptr_or_err(py, ffi::PyModule_Create(self.ffi_def.get()))?
79+
let mod_def = self.ffi_def.get();
80+
(*mod_def).m_slots = std::ptr::null_mut();
81+
Py::<PyModule>::from_owned_ptr_or_err(py, ffi::PyModule_Create(mod_def))?
7282
};
73-
// (self.initializer.0)(py, module.as_ref(py))?;
83+
(self.initializer.0)(py, module.as_ref(py))?;
7484
Ok(module.into())
7585
}
7686
/// Implementation of `PyInit_foo` functions generated in [`#[pymodule]`][crate::pymodule]..

0 commit comments

Comments
 (0)