From 43a9571b2c9f7364e3bd644eb30b8d35f63cacbc Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Fri, 29 Nov 2002 22:43:27 +0000 Subject: [PATCH] Fixed some technical problems with smart pointer support uncovered by STLPort's debug mode. Unfortunately, had to expand Dereferenceable requirements. [SVN r16459] --- doc/v2/Dereferenceable.html | 17 +++++++++++++- .../boost/python/object/pointer_holder.hpp | 22 +++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/doc/v2/Dereferenceable.html b/doc/v2/Dereferenceable.html index 8f5b38b5..965e4043 100644 --- a/doc/v2/Dereferenceable.html +++ b/doc/v2/Dereferenceable.html @@ -49,10 +49,25 @@ type is a model of Dereferenceable. +If x is not a pointer type, it also must satsify the following expression: + + + + + + + + + + + +
ExpressionOperational Semantics
x.get()&*x, or a null pointer +
+

Revised - 13 November, 2002 + 29 November, 2002

© Copyright Dave diff --git a/include/boost/python/object/pointer_holder.hpp b/include/boost/python/object/pointer_holder.hpp index 3a65dcb3..5625f092 100644 --- a/include/boost/python/object/pointer_holder.hpp +++ b/include/boost/python/object/pointer_holder.hpp @@ -32,6 +32,18 @@ namespace boost { namespace python { namespace objects { +template +typename bool is_null(T const& p, ...) +{ + return p.get() == 0; +} + +template +bool is_null(T* p, int) +{ + return p == 0; +} + # define BOOST_PYTHON_UNFORWARD_LOCAL(z, n, _) BOOST_PP_COMMA_IF(n) (typename unforward::type)(a##n) template @@ -98,9 +110,12 @@ void* pointer_holder::holds(type_info dst_t) if (dst_t == python::type_id()) return &this->m_p; + if (objects::is_null(this->m_p, 0)) + return 0; + type_info src_t = python::type_id(); - return src_t == dst_t ? &*this->m_p - : find_dynamic_type(&*this->m_p, src_t, dst_t); + Value* p = &*this->m_p; + return src_t == dst_t ? p : find_dynamic_type(p, src_t, dst_t); } template @@ -109,6 +124,9 @@ void* pointer_holder_back_reference::holds(type_info dst_t) if (dst_t == python::type_id()) return &this->m_p; + if (objects::is_null(this->m_p, 0)) + return 0; + if (dst_t == python::type_id()) return &*this->m_p;