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
|
---|
7 |
|
---|
8 | # include <boost/python/detail/prefix.hpp>
|
---|
9 | # include <boost/python/object.hpp>
|
---|
10 | # include <boost/python/refcount.hpp>
|
---|
11 | # include <boost/utility.hpp>
|
---|
12 |
|
---|
13 | namespace boost { namespace python {
|
---|
14 |
|
---|
15 | namespace detail
|
---|
16 | {
|
---|
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;
|
---|
20 | }
|
---|
21 |
|
---|
22 | class scope
|
---|
23 | : public object
|
---|
24 | {
|
---|
25 | public:
|
---|
26 | inline scope(scope const&);
|
---|
27 | inline scope(object const&);
|
---|
28 | inline scope();
|
---|
29 | inline ~scope();
|
---|
30 |
|
---|
31 | private: // data members
|
---|
32 | PyObject* m_previous_scope;
|
---|
33 |
|
---|
34 | private: // unimplemented functions
|
---|
35 | void operator=(scope const&);
|
---|
36 | };
|
---|
37 |
|
---|
38 | inline scope::scope(object const& new_scope)
|
---|
39 | : object(new_scope)
|
---|
40 | , m_previous_scope(detail::current_scope)
|
---|
41 | {
|
---|
42 | detail::current_scope = python::incref(new_scope.ptr());
|
---|
43 | }
|
---|
44 |
|
---|
45 | inline scope::scope()
|
---|
46 | : object(detail::borrowed_reference(
|
---|
47 | detail::current_scope ? detail::current_scope : Py_None
|
---|
48 | ))
|
---|
49 | , m_previous_scope(python::xincref(detail::current_scope))
|
---|
50 | {
|
---|
51 | }
|
---|
52 |
|
---|
53 | inline scope::~scope()
|
---|
54 | {
|
---|
55 | python::xdecref(detail::current_scope);
|
---|
56 | detail::current_scope = m_previous_scope;
|
---|
57 | }
|
---|
58 |
|
---|
59 | namespace converter
|
---|
60 | {
|
---|
61 | template <>
|
---|
62 | struct object_manager_traits<scope>
|
---|
63 | : object_manager_traits<object>
|
---|
64 | {
|
---|
65 | };
|
---|
66 | }
|
---|
67 |
|
---|
68 | // Placing this after the specialization above suppresses a CWPro8.3 bug
|
---|
69 | inline scope::scope(scope const& new_scope)
|
---|
70 | : object(new_scope)
|
---|
71 | , m_previous_scope(detail::current_scope)
|
---|
72 | {
|
---|
73 | detail::current_scope = python::incref(new_scope.ptr());
|
---|
74 | }
|
---|
75 |
|
---|
76 | }} // namespace boost::python
|
---|
77 |
|
---|
78 | #endif // SCOPE_DWA2002724_HPP
|
---|