@@ -47,14 +47,18 @@ namespace detail
4747}
4848
4949// Use expr to create the PyObject corresponding to x
50- # define BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE (T, expr ) \
50+ # define BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE (T, expr, pytype ) \
5151 template <> struct to_python_value <T&> \
5252 : detail::builtin_to_python \
5353 { \
5454 inline PyObject* operator ()(T const & x) const \
5555 { \
5656 return (expr); \
5757 } \
58+ inline PyTypeObject const * get_pytype () const \
59+ { \
60+ return (pytype); \
61+ } \
5862 }; \
5963 template <> struct to_python_value <T const &> \
6064 : detail::builtin_to_python \
@@ -63,6 +67,10 @@ namespace detail
6367 { \
6468 return (expr); \
6569 } \
70+ inline PyTypeObject const * get_pytype () const \
71+ { \
72+ return (pytype); \
73+ } \
6674 };
6775
6876# define BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE (T, expr ) \
@@ -77,25 +85,25 @@ namespace detail
7785 }
7886
7987// Specialize argument and return value converters for T using expr
80- # define BOOST_PYTHON_TO_PYTHON_BY_VALUE (T, expr ) \
81- BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE (T,expr) \
88+ # define BOOST_PYTHON_TO_PYTHON_BY_VALUE (T, expr, pytype ) \
89+ BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE (T,expr, pytype ) \
8290 BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE (T,expr)
8391
8492// Specialize converters for signed and unsigned T to Python Int
8593# define BOOST_PYTHON_TO_INT (T ) \
86- BOOST_PYTHON_TO_PYTHON_BY_VALUE (signed T, ::PyInt_FromLong(x)) \
94+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (signed T, ::PyInt_FromLong(x), &PyInt_Type ) \
8795 BOOST_PYTHON_TO_PYTHON_BY_VALUE ( \
8896 unsigned T \
8997 , static_cast <unsigned long >(x) > static_cast <unsigned long >( \
9098 (std::numeric_limits<long >::max)()) \
9199 ? ::PyLong_FromUnsignedLong(x) \
92- : ::PyInt_FromLong(x))
100+ : ::PyInt_FromLong(x), &PyInt_Type )
93101
94102// Bool is not signed.
95103#if PY_VERSION_HEX >= 0x02030000
96- BOOST_PYTHON_TO_PYTHON_BY_VALUE (bool , ::PyBool_FromLong(x))
104+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (bool , ::PyBool_FromLong(x), &PyBool_Type )
97105#else
98- BOOST_PYTHON_TO_PYTHON_BY_VALUE (bool , ::PyInt_FromLong(x))
106+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (bool , ::PyInt_FromLong(x), &PyInt_Type )
99107#endif
100108
101109// note: handles signed char and unsigned char, but not char (see below)
@@ -108,25 +116,25 @@ BOOST_PYTHON_TO_INT(long)
108116// using Python's macro instead of Boost's - we don't seem to get the
109117// config right all the time.
110118# ifdef HAVE_LONG_LONG
111- BOOST_PYTHON_TO_PYTHON_BY_VALUE (signed BOOST_PYTHON_LONG_LONG, ::PyLong_FromLongLong(x))
112- BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUnsignedLongLong(x))
119+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (signed BOOST_PYTHON_LONG_LONG, ::PyLong_FromLongLong(x), &PyInt_Type )
120+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUnsignedLongLong(x), &PyInt_Type )
113121# endif
114122
115123# undef BOOST_TO_PYTHON_INT
116124
117- BOOST_PYTHON_TO_PYTHON_BY_VALUE (char , converter::do_return_to_python(x))
118- BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const *, converter::do_return_to_python(x))
119- BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast<ssize_t>(x.size())))
125+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (char , converter::do_return_to_python(x), &PyString_Type )
126+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const *, converter::do_return_to_python(x), &PyString_Type )
127+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast<ssize_t>(x.size())), &PyString_Type )
120128#if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING)
121- BOOST_PYTHON_TO_PYTHON_BY_VALUE (std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast<ssize_t>(x.size())))
129+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast<ssize_t>(x.size())), &PyString_Type )
122130# endif
123- BOOST_PYTHON_TO_PYTHON_BY_VALUE (float , ::PyFloat_FromDouble(x))
124- BOOST_PYTHON_TO_PYTHON_BY_VALUE(double , ::PyFloat_FromDouble(x))
125- BOOST_PYTHON_TO_PYTHON_BY_VALUE(long double , ::PyFloat_FromDouble(x))
126- BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE(PyObject*, converter::do_return_to_python(x))
127- BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex <float >, ::PyComplex_FromDoubles(x.real(), x.imag()))
128- BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex <double >, ::PyComplex_FromDoubles(x.real(), x.imag()))
129- BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex <long double >, ::PyComplex_FromDoubles(x.real(), x.imag()))
131+ BOOST_PYTHON_TO_PYTHON_BY_VALUE (float , ::PyFloat_FromDouble(x), &PyFloat_Type )
132+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(double , ::PyFloat_FromDouble(x), &PyFloat_Type )
133+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(long double , ::PyFloat_FromDouble(x), &PyFloat_Type )
134+ BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE(PyObject*, converter::do_return_to_python(x), 0 )
135+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex <float >, ::PyComplex_FromDoubles(x.real(), x.imag()), &PyComplex_Type )
136+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex <double >, ::PyComplex_FromDoubles(x.real(), x.imag()), &PyComplex_Type )
137+ BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex <long double >, ::PyComplex_FromDoubles(x.real(), x.imag()), &PyComplex_Type )
130138
131139# undef BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE
132140# undef BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE
0 commit comments