@@ -47,6 +47,12 @@ namespace detail {
4747
4848BOOST_PYTHON_DECL PyObject* init_module (PyModuleDef&, void (*)(), bool gil_not_used = false);
4949
50+ # if PY_VERSION_HEX >= 0x03050000
51+
52+ BOOST_PYTHON_DECL int exec_module (PyObject*, void (*)());
53+
54+ # endif
55+
5056#else
5157
5258BOOST_PYTHON_DECL PyObject* init_module (char const * name, void (*)());
@@ -115,6 +121,46 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
115121 void BOOST_PP_CAT (init_module_, name)()
116122# endif // HAS_CXX11
117123
124+ # if PY_VERSION_HEX >= 0x03050000
125+
126+ # define _BOOST_PYTHON_MODULE_MULTI_PHASE_INIT (name ) \
127+ int BOOST_PP_CAT (exec_module_,name)(PyObject* module ) \
128+ { \
129+ return boost::python::detail::exec_module ( \
130+ module , BOOST_PP_CAT (init_module_, name) ); \
131+ } \
132+ extern " C" BOOST_SYMBOL_EXPORT PyObject* BOOST_PP_CAT (PyInit_, name)() \
133+ { \
134+ static PyModuleDef_Base initial_m_base = { \
135+ PyObject_HEAD_INIT (NULL ) \
136+ 0 , /* m_init */ \
137+ 0 , /* m_index */ \
138+ 0 /* m_copy */ }; \
139+ static PyMethodDef initial_methods[] = { { 0 , 0 , 0 , 0 } }; \
140+ \
141+ static PyModuleDef_Slot slots[] = { \
142+ {Py_mod_exec, reinterpret_cast <void *>(reinterpret_cast <uintptr_t >(BOOST_PP_CAT (exec_module_, name)))}, \
143+ {0 , NULL } \
144+ }; \
145+ \
146+ static struct PyModuleDef moduledef = { \
147+ initial_m_base, \
148+ BOOST_PP_STRINGIZE (name), \
149+ 0 , /* m_doc */ \
150+ 0 , /* m_size */ \
151+ initial_methods, \
152+ slots, /* m_slots */ \
153+ 0 , /* m_traverse */ \
154+ 0 , /* m_clear */ \
155+ 0 , /* m_free */ \
156+ }; \
157+ \
158+ return PyModuleDef_Init (&moduledef); \
159+ } \
160+ void BOOST_PP_CAT (init_module_, name)()
161+
162+ # endif
163+
118164# else
119165
120166# define _BOOST_PYTHON_MODULE_INIT (name ) \
@@ -137,6 +183,14 @@ extern "C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_INIT(name, __VA_ARGS__)
137183extern " C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_INIT (name)
138184# endif // HAS_CXX11 && Python 3
139185
186+ # if PY_VERSION_HEX >= 0x03050000
187+
188+ # define BOOST_PYTHON_MODULE_MULTI_PHASE_INIT (name ) \
189+ void BOOST_PP_CAT (init_module_,name)(); \
190+ extern " C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_MULTI_PHASE_INIT (name)
191+
192+ # endif
193+
140194# endif
141195
142196#endif // MODULE_INIT_DWA20020722_HPP
0 commit comments