Skip to content

Commit 278c1ae

Browse files
committed
Fix #56: PyModuleDef changed "m_slots" to "m_reload" in Python 3.5.
1 parent 2c89f62 commit 278c1ae

File tree

3 files changed

+51
-12
lines changed

3 files changed

+51
-12
lines changed

python3-sys/src/moduleobject.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ extern "C" {
2727
pub fn PyModule_GetFilenameObject(arg1: *mut PyObject) -> *mut PyObject;
2828
pub fn PyModule_GetDef(arg1: *mut PyObject) -> *mut PyModuleDef;
2929
pub fn PyModule_GetState(arg1: *mut PyObject) -> *mut c_void;
30+
31+
#[cfg(Py_3_5)]
32+
pub fn PyModuleDef_Init(arg1: *mut PyModuleDef) -> *mut PyObject;
33+
#[cfg(Py_3_5)]
34+
pub static mut PyModuleDef_Type: PyTypeObject;
3035
}
3136

3237
#[repr(C)]
@@ -48,6 +53,23 @@ pub const PyModuleDef_HEAD_INIT: PyModuleDef_Base = PyModuleDef_Base {
4853
m_copy: 0 as *mut PyObject
4954
};
5055

56+
#[repr(C)]
57+
#[derive(Copy)]
58+
#[cfg(Py_3_5)]
59+
pub struct PyModuleDef_Slot {
60+
pub slot: c_int,
61+
pub value: *mut c_void,
62+
}
63+
#[cfg(Py_3_5)]
64+
impl Clone for PyModuleDef_Slot {
65+
fn clone(&self) -> PyModuleDef_Slot { *self }
66+
}
67+
68+
#[cfg(Py_3_5)]
69+
pub const Py_mod_create : c_int = 1;
70+
#[cfg(Py_3_5)]
71+
pub const Py_mod_exec : c_int = 2;
72+
5173
#[repr(C)]
5274
#[derive(Copy)]
5375
pub struct PyModuleDef {
@@ -56,7 +78,10 @@ pub struct PyModuleDef {
5678
pub m_doc: *const c_char,
5779
pub m_size: Py_ssize_t,
5880
pub m_methods: *mut PyMethodDef,
81+
#[cfg(not(Py_3_5))]
5982
pub m_reload: Option<inquiry>,
83+
#[cfg(Py_3_5)]
84+
pub m_slots: *mut PyModuleDef_Slot,
6085
pub m_traverse: Option<traverseproc>,
6186
pub m_clear: Option<inquiry>,
6287
pub m_free: Option<freefunc>,
@@ -65,4 +90,28 @@ impl Clone for PyModuleDef {
6590
fn clone(&self) -> PyModuleDef { *self }
6691
}
6792

93+
#[cfg(not(Py_3_5))]
94+
pub const PyModuleDef_INIT: PyModuleDef = PyModuleDef {
95+
m_base: PyModuleDef_HEAD_INIT,
96+
m_name: 0 as *const _,
97+
m_doc: 0 as *const _,
98+
m_size: 0,
99+
m_methods: 0 as *mut _,
100+
m_reload: None,
101+
m_traverse: None,
102+
m_clear: None,
103+
m_free: None
104+
};
68105

106+
#[cfg(Py_3_5)]
107+
pub const PyModuleDef_INIT: PyModuleDef = PyModuleDef {
108+
m_base: PyModuleDef_HEAD_INIT,
109+
m_name: 0 as *const _,
110+
m_doc: 0 as *const _,
111+
m_size: 0,
112+
m_methods: 0 as *mut _,
113+
m_slots: 0 as *mut _,
114+
m_traverse: None,
115+
m_clear: None,
116+
m_free: None
117+
};

python3-sys/src/pystate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use libc::{c_int, c_long};
22
use object::PyObject;
33
use moduleobject::PyModuleDef;
44

5+
#[cfg(Py_3_6)]
56
pub const MAX_CO_EXTRA_USERS: c_int = 255;
67

78
pub enum PyInterpreterState { }

src/lib.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -305,17 +305,7 @@ macro_rules! py_module_initializer {
305305
fn init($py_id: $crate::Python, $m_id: &$crate::PyModule) -> $crate::PyResult<()> {
306306
$body
307307
}
308-
static mut MODULE_DEF: $crate::_detail::ffi::PyModuleDef = $crate::_detail::ffi::PyModuleDef {
309-
m_base: $crate::_detail::ffi::PyModuleDef_HEAD_INIT,
310-
m_name: 0 as *const _,
311-
m_doc: 0 as *const _,
312-
m_size: 0, // we don't use per-module state
313-
m_methods: 0 as *mut _,
314-
m_reload: None,
315-
m_traverse: None,
316-
m_clear: None,
317-
m_free: None
318-
};
308+
static mut MODULE_DEF: $crate::_detail::ffi::PyModuleDef = $crate::_detail::ffi::PyModuleDef_INIT;
319309
// We can't convert &'static str to *const c_char within a static initializer,
320310
// so we'll do it here in the module initialization:
321311
MODULE_DEF.m_name = concat!(stringify!($name), "\0").as_ptr() as *const _;
@@ -324,7 +314,6 @@ macro_rules! py_module_initializer {
324314
}
325315
}
326316

327-
328317
#[doc(hidden)]
329318
#[cfg(feature="python3-sys")]
330319
pub unsafe fn py_module_initializer_impl(

0 commit comments

Comments
 (0)