• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  (C) Copyright David Abrahams 2000.
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 //
6 //  The author gratefully acknowleges the support of Dragon Systems, Inc., in
7 //  producing this work.
8 
9 #include <boost/python/scope.hpp>
10 #include <boost/python/object/add_to_namespace.hpp>
11 
12 namespace boost { namespace python { namespace detail {
13 
14 namespace
15 {
init_module_in_scope(PyObject * m,void (* init_function)())16     PyObject* init_module_in_scope(PyObject* m, void(*init_function)())
17     {
18         if (m != 0)
19         {
20             // Create the current module scope
21             object m_obj(((borrowed_reference_t*)m));
22             scope current_module(m_obj);
23 
24             handle_exception(init_function);
25         }
26 
27         return m;
28     }
29 }
30 
scope_setattr_doc(char const * name,object const & x,char const * doc)31 BOOST_PYTHON_DECL void scope_setattr_doc(char const* name, object const& x, char const* doc)
32 {
33     // Use function::add_to_namespace to achieve overloading if
34     // appropriate.
35     scope current;
36     objects::add_to_namespace(current, name, x, doc);
37 }
38 
39 #if PY_VERSION_HEX >= 0x03000000
40 
init_module(PyModuleDef & moduledef,void (* init_function)())41 BOOST_PYTHON_DECL PyObject* init_module(PyModuleDef& moduledef, void(*init_function)())
42 {
43     return init_module_in_scope(
44         PyModule_Create(&moduledef),
45         init_function);
46 }
47 
48 #else
49 
50 namespace
51 {
52     PyMethodDef initial_methods[] = { { 0, 0, 0, 0 } };
53 }
54 
init_module(char const * name,void (* init_function)())55 BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*init_function)())
56 {
57     return init_module_in_scope(
58         Py_InitModule(const_cast<char*>(name), initial_methods),
59         init_function);
60 }
61 
62 #endif
63 
64 }}} // namespace boost::python::detail
65 
66 namespace boost { namespace python {
67 
68 namespace detail
69 {
70   BOOST_PYTHON_DECL PyObject* current_scope = 0;
71 }
72 
73 }}
74