1 // Copyright David Abrahams 2002.
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 #ifndef SCOPE_DWA2002724_HPP
6 # define SCOPE_DWA2002724_HPP
8 # include <boost/python/detail/prefix.hpp>
9 # include <boost/python/object.hpp>
10 # include <boost/python/refcount.hpp>
11 # include <boost/utility.hpp>
13 namespace boost
{ namespace python
{
17 // Making this a namespace-scope variable to avoid Cygwin issues.
18 // Use a PyObject* to avoid problems with static destruction after Py_Finalize
19 extern BOOST_PYTHON_DECL PyObject
* current_scope
;
26 inline scope(scope
const&);
27 inline scope(object
const&);
31 private: // data members
32 PyObject
* m_previous_scope
;
34 private: // unimplemented functions
35 void operator=(scope
const&);
38 inline scope::scope(object
const& new_scope
)
40 , m_previous_scope(detail::current_scope
)
42 detail::current_scope
= python::incref(new_scope
.ptr());
46 : object(detail::borrowed_reference(
47 detail::current_scope
? detail::current_scope
: Py_None
49 , m_previous_scope(python::xincref(detail::current_scope
))
53 inline scope::~scope()
55 python::xdecref(detail::current_scope
);
56 detail::current_scope
= m_previous_scope
;
62 struct object_manager_traits
<scope
>
63 : object_manager_traits
<object
>
68 // Placing this after the specialization above suppresses a CWPro8.3 bug
69 inline scope::scope(scope
const& new_scope
)
71 , m_previous_scope(detail::current_scope
)
73 detail::current_scope
= python::incref(new_scope
.ptr());
76 }} // namespace boost::python
78 #endif // SCOPE_DWA2002724_HPP