From ba213663b613adacac47f369c24df5c03b798dda Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Tue, 28 Dec 2010 20:38:29 +0000 Subject: [PATCH] merging current boost/python and libs/python from trunk into release branch [SVN r67483] --- include/boost/python/module_init.hpp | 53 ++++++++++++++++++------ src/module.cpp | 62 +++++++++++++++------------- 2 files changed, 74 insertions(+), 41 deletions(-) diff --git a/include/boost/python/module_init.hpp b/include/boost/python/module_init.hpp index e06aa794..54d87e4b 100644 --- a/include/boost/python/module_init.hpp +++ b/include/boost/python/module_init.hpp @@ -13,27 +13,54 @@ namespace boost { namespace python { namespace detail { +# if PY_VERSION_HEX >= 0x03000000 + +BOOST_PYTHON_DECL PyObject* init_module(PyModuleDef&, void(*)()); + +#else + BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)()); +#endif + }}} # if PY_VERSION_HEX >= 0x03000000 -# define _BOOST_PYTHON_MODULE_INIT(name) \ - PyObject* BOOST_PP_CAT (PyInit_,name)() \ -{ \ - return boost::python::detail::init_module( \ - BOOST_PP_STRINGIZE(name),&BOOST_PP_CAT(init_module_,name)); \ -} \ - void BOOST_PP_CAT(init_module_,name)() +# define _BOOST_PYTHON_MODULE_INIT(name) \ + PyObject* BOOST_PP_CAT(PyInit_, name)() \ + { \ + static PyModuleDef_Base initial_m_base = { \ + PyObject_HEAD_INIT(NULL) \ + 0, /* m_init */ \ + 0, /* m_index */ \ + 0 /* m_copy */ }; \ + static PyMethodDef initial_methods[] = { { 0, 0, 0, 0 } }; \ + \ + static struct PyModuleDef moduledef = { \ + initial_m_base, \ + BOOST_PP_STRINGIZE(name), \ + 0, /* m_doc */ \ + -1, /* m_size */ \ + initial_methods, \ + 0, /* m_reload */ \ + 0, /* m_traverse */ \ + 0, /* m_clear */ \ + 0, /* m_free */ \ + }; \ + \ + return boost::python::detail::init_module( \ + moduledef, BOOST_PP_CAT(init_module_, name) ); \ + } \ + void BOOST_PP_CAT(init_module_, name)() # else # define _BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init,name)() \ + void BOOST_PP_CAT(init,name)() \ { \ boost::python::detail::init_module( \ - BOOST_PP_STRINGIZE(name),&BOOST_PP_CAT(init_module_,name)); \ + BOOST_PP_STRINGIZE(name),&BOOST_PP_CAT(init_module_,name)); \ } \ void BOOST_PP_CAT(init_module_,name)() @@ -42,23 +69,23 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)()); # if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(BOOST_PYTHON_STATIC_MODULE) # define BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init_module_,name)(); \ + void BOOST_PP_CAT(init_module_,name)(); \ extern "C" __declspec(dllexport) _BOOST_PYTHON_MODULE_INIT(name) # elif BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY # define BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init_module_,name)(); \ + void BOOST_PP_CAT(init_module_,name)(); \ extern "C" __attribute__ ((visibility("default"))) _BOOST_PYTHON_MODULE_INIT(name) # else # define BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init_module_,name)(); \ + void BOOST_PP_CAT(init_module_,name)(); \ extern "C" _BOOST_PYTHON_MODULE_INIT(name) # endif -# endif +# endif #endif // MODULE_INIT_DWA20020722_HPP diff --git a/src/module.cpp b/src/module.cpp index 5bfbfd1f..dfef8c67 100644 --- a/src/module.cpp +++ b/src/module.cpp @@ -11,6 +11,23 @@ namespace boost { namespace python { namespace detail { +namespace +{ + PyObject* init_module_in_scope(PyObject* m, void(*init_function)()) + { + if (m != 0) + { + // Create the current module scope + object m_obj(((borrowed_reference_t*)m)); + scope current_module(m_obj); + + handle_exception(init_function); + } + + return m; + } +} + BOOST_PYTHON_DECL void scope_setattr_doc(char const* name, object const& x, char const* doc) { // Use function::add_to_namespace to achieve overloading if @@ -19,42 +36,31 @@ BOOST_PYTHON_DECL void scope_setattr_doc(char const* name, object const& x, char objects::add_to_namespace(current, name, x, doc); } +#if PY_VERSION_HEX >= 0x03000000 + +PyObject* init_module(PyModuleDef& moduledef, void(*init_function)()) +{ + return init_module_in_scope( + PyModule_Create(&moduledef), + init_function); +} + +#else + namespace { - PyMethodDef initial_methods[] = { { 0, 0, 0, 0 } }; + PyMethodDef initial_methods[] = { { 0, 0, 0, 0 } }; } BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*init_function)()) { -#if PY_VERSION_HEX >= 0x03000000 - static struct PyModuleDef moduledef = { - PyModuleDef_HEAD_INIT, - name, - 0, /* m_doc */ - -1, /* m_size */ - initial_methods, - 0, /* m_reload */ - 0, /* m_traverse */ - 0, /* m_clear */ - 0, /* m_free */ - }; - PyObject* m = PyModule_Create(&moduledef); -#else - PyObject* m - = Py_InitModule(const_cast(name), initial_methods); -#endif - - if (m != 0) - { - // Create the current module scope - object m_obj(((borrowed_reference_t*)m)); - scope current_module(m_obj); - - handle_exception(init_function); - } - return m; + return init_module_in_scope( + Py_InitModule(const_cast(name), initial_methods), + init_function); } +#endif + }}} // namespace boost::python::detail namespace boost { namespace python {