From d07454659aeda4872ed3c6137610a2c3b357018f Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Wed, 19 Jun 2002 19:18:21 +0000 Subject: [PATCH] Work around some gcc-2.95.x bugs Optimize code slightly by eliminating temporaries [SVN r14185] --- include/boost/python/object_attributes.hpp | 6 +- include/boost/python/object_core.hpp | 16 ++--- include/boost/python/object_items.hpp | 6 +- .../boost/python/preprocessed/object_call.hpp | 61 +++++++++---------- include/boost/python/proxy.hpp | 3 +- 5 files changed, 48 insertions(+), 44 deletions(-) diff --git a/include/boost/python/object_attributes.hpp b/include/boost/python/object_attributes.hpp index 1a97ae56..4c8458a4 100755 --- a/include/boost/python/object_attributes.hpp +++ b/include/boost/python/object_attributes.hpp @@ -28,13 +28,15 @@ struct attribute_policies : const_attribute_policies template inline object_attribute object_operators::attr(char const* name) { - return object_attribute(*static_cast(this), object(name)); + object const& x = *static_cast(this); + return object_attribute(x, object(name)); } template inline const_object_attribute object_operators::attr(char const* name) const { - return const_object_attribute(*static_cast(this), object(name)); + object const& x = *static_cast(this); + return const_object_attribute(x, object(name)); } diff --git a/include/boost/python/object_core.hpp b/include/boost/python/object_core.hpp index b0463a00..762bdf90 100755 --- a/include/boost/python/object_core.hpp +++ b/include/boost/python/object_core.hpp @@ -66,14 +66,14 @@ namespace api # include # endif -# define BOOST_PYTHON_OBJECT_CALL(nargs,ignored) \ - template \ - typename dependent::type \ - operator()(BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,const& a))) const \ - { \ - typedef typename dependent::type obj; \ - obj const& f = *static_cast(this); \ - return call(f.ptr().get(), BOOST_PP_ENUM_PARAMS(nargs, a)); \ +# define BOOST_PYTHON_OBJECT_CALL(nargs,ignored) \ + template \ + typename dependent::type \ + operator()(BOOST_PYTHON_ENUM_PARAMS2(nargs, (A,const& a))) const \ + { \ + typedef typename dependent::type obj; \ + U const& self = *static_cast(this); \ + return call(converter::get_managed_object(self), BOOST_PP_ENUM_PARAMS(nargs, a)); \ } BOOST_PP_REPEAT_FROM_TO_2ND( diff --git a/include/boost/python/object_items.hpp b/include/boost/python/object_items.hpp index 6424e2a9..a91ebcd8 100755 --- a/include/boost/python/object_items.hpp +++ b/include/boost/python/object_items.hpp @@ -29,14 +29,16 @@ template inline object_item object_operators::operator[](self_cref key) { - return object_item(*static_cast(this), key); + object const& x = *static_cast(this); + return object_item(x, key); } template inline const_object_item object_operators::operator[](self_cref key) const { - return const_object_item(*static_cast(this), key); + object const& x = *static_cast(this); + return const_object_item(x, key); } # if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 diff --git a/include/boost/python/preprocessed/object_call.hpp b/include/boost/python/preprocessed/object_call.hpp index 3c9831d4..ec3ba43e 100755 --- a/include/boost/python/preprocessed/object_call.hpp +++ b/include/boost/python/preprocessed/object_call.hpp @@ -11,121 +11,120 @@ typename dependent::type operator()(A0 const&a0)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0); } template typename dependent::type operator()(A0 const&a0,A1 const&a1)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,A9 const&a9)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,A9 const&a9,A10 const&a10)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,A9 const&a9,A10 const&a10,A11 const&a11)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,A9 const&a9,A10 const&a10,A11 const&a11,A12 const&a12)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,A9 const&a9,A10 const&a10,A11 const&a11,A12 const&a12,A13 const&a13)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13); } template typename dependent::type operator()(A0 const&a0,A1 const&a1,A2 const&a2,A3 const&a3,A4 const&a4,A5 const&a5,A6 const&a6,A7 const&a7,A8 const&a8,A9 const&a9,A10 const&a10,A11 const&a11,A12 const&a12,A13 const&a13,A14 const&a14)const { typedef typename dependent::type obj; - obj const&f=*static_cast(this); - return call(f.ptr().get(),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); + U const&self=*static_cast(this); + return call(converter::get_managed_object(self),a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); } - #endif // OBJECT_CALL_DWA2002612_HPP diff --git a/include/boost/python/proxy.hpp b/include/boost/python/proxy.hpp index ff726cc0..d17f5871 100755 --- a/include/boost/python/proxy.hpp +++ b/include/boost/python/proxy.hpp @@ -28,7 +28,8 @@ class proxy : public object_operators > template inline proxy const& operator=(T const& rhs) const { - Policies::set(m_target, m_key, python::object(rhs)); + python::object const& x(rhs); + Policies::set(m_target, m_key, x); return *this; }