@@ -17,6 +17,12 @@ namespace boost { namespace python { namespace detail {
1717
1818BOOST_PYTHON_DECL PyObject* init_module (PyModuleDef&, void (*)());
1919
20+ # if PY_VERSION_HEX >= 0x03050000
21+
22+ BOOST_PYTHON_DECL int exec_module (PyObject*, void (*)());
23+
24+ # endif
25+
2026#else
2127
2228BOOST_PYTHON_DECL PyObject* init_module (char const * name, void (*)());
@@ -54,6 +60,46 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
5460 } \
5561 void BOOST_PP_CAT (init_module_, name)()
5662
63+ # if PY_VERSION_HEX >= 0x03050000
64+
65+ # define _BOOST_PYTHON_MODULE_MULTI_PHASE_INIT (name ) \
66+ int BOOST_PP_CAT (exec_module_,name)(PyObject* module ) \
67+ { \
68+ return boost::python::detail::exec_module ( \
69+ module , BOOST_PP_CAT (init_module_, name) ); \
70+ } \
71+ extern " C" BOOST_SYMBOL_EXPORT PyObject* BOOST_PP_CAT (PyInit_, name)() \
72+ { \
73+ static PyModuleDef_Base initial_m_base = { \
74+ PyObject_HEAD_INIT (NULL ) \
75+ 0 , /* m_init */ \
76+ 0 , /* m_index */ \
77+ 0 /* m_copy */ }; \
78+ static PyMethodDef initial_methods[] = { { 0 , 0 , 0 , 0 } }; \
79+ \
80+ static PyModuleDef_Slot slots[] = { \
81+ {Py_mod_exec, reinterpret_cast <void *>(reinterpret_cast <uintptr_t >(BOOST_PP_CAT (exec_module_, name)))}, \
82+ {0 , NULL } \
83+ }; \
84+ \
85+ static struct PyModuleDef moduledef = { \
86+ initial_m_base, \
87+ BOOST_PP_STRINGIZE (name), \
88+ 0 , /* m_doc */ \
89+ 0 , /* m_size */ \
90+ initial_methods, \
91+ slots, /* m_slots */ \
92+ 0 , /* m_traverse */ \
93+ 0 , /* m_clear */ \
94+ 0 , /* m_free */ \
95+ }; \
96+ \
97+ return PyModuleDef_Init (&moduledef); \
98+ } \
99+ void BOOST_PP_CAT (init_module_, name)()
100+
101+ # endif
102+
57103# else
58104
59105# define _BOOST_PYTHON_MODULE_INIT (name ) \
@@ -70,6 +116,14 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
70116 void BOOST_PP_CAT (init_module_,name)(); \
71117extern " C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_INIT (name)
72118
119+ # if PY_VERSION_HEX >= 0x03050000
120+
121+ # define BOOST_PYTHON_MODULE_MULTI_PHASE_INIT (name ) \
122+ void BOOST_PP_CAT (init_module_,name)(); \
123+ extern " C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_MULTI_PHASE_INIT (name)
124+
125+ # endif
126+
73127# endif
74128
75129#endif // MODULE_INIT_DWA20020722_HPP
0 commit comments