Apply patch for [CVE-2012-2677][boost] ordered_malloc() overflow
[external/boost.git] / boost / python / scope.hpp
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