mirror of
https://github.com/boostorg/python.git
synced 2026-01-26 18:52:26 +00:00
fixed bug in the conversion tests
[SVN r7998]
This commit is contained in:
11
extclass.cpp
11
extclass.cpp
@@ -234,10 +234,10 @@ ExtensionClassBase::ExtensionClassBase(const char* name)
|
||||
try_derived_class_conversions(). If a particular conversion is impossible, all
|
||||
conversion functions will return a NULL pointer.
|
||||
|
||||
The function extract_from_holder() attempts to actually extract the pointer to
|
||||
the contained object from an InstanceHolderBase (a wrapper class). A conversion
|
||||
The function extract_object_from_holder() attempts to actually extract the pointer
|
||||
to the contained object from an InstanceHolderBase (a wrapper class). A conversion
|
||||
of the held object to 'T *' is allowed when the conversion
|
||||
'dynamic_cast<InstanceHolde<T> *>(an_instance_holder_base)' succeeds.
|
||||
'dynamic_cast<InstanceHolder<T> *>(an_instance_holder_base)' succeeds.
|
||||
*/
|
||||
void * ExtensionClassBase::try_class_conversions(InstanceHolderBase* object) const
|
||||
{
|
||||
@@ -254,8 +254,7 @@ void* ExtensionClassBase::try_base_class_conversions(InstanceHolderBase* object)
|
||||
{
|
||||
if(base_classes()[i].convert == 0)
|
||||
continue;
|
||||
|
||||
void* result1 = base_classes()[i].class_object->convert_from_holder(object);
|
||||
void* result1 = base_classes()[i].class_object->extract_object_from_holder(object);
|
||||
if (result1)
|
||||
return (*base_classes()[i].convert)(result1);
|
||||
|
||||
@@ -270,7 +269,7 @@ void* ExtensionClassBase::try_derived_class_conversions(InstanceHolderBase* obje
|
||||
{
|
||||
for (std::size_t i = 0; i < derived_classes().size(); ++i)
|
||||
{
|
||||
void* result1 = derived_classes()[i].class_object->convert_from_holder(object);
|
||||
void* result1 = derived_classes()[i].class_object->extract_object_from_holder(object);
|
||||
if (result1)
|
||||
return (*derived_classes()[i].convert)(result1);
|
||||
|
||||
|
||||
15
extclass.h
15
extclass.h
@@ -60,11 +60,13 @@ typedef void * (*ConversionFunction)(void *);
|
||||
|
||||
struct BaseClassInfo
|
||||
{
|
||||
BaseClassInfo(Class<ExtensionInstance> * t, ConversionFunction f)
|
||||
typedef Class<ExtensionInstance> ClassObject;
|
||||
|
||||
BaseClassInfo(ClassObject * t, ConversionFunction f)
|
||||
:class_object(t), convert(f)
|
||||
{}
|
||||
|
||||
Class<ExtensionInstance> * class_object;
|
||||
ClassObject * class_object;
|
||||
ConversionFunction convert;
|
||||
};
|
||||
typedef BaseClassInfo DerivedClassInfo;
|
||||
@@ -85,6 +87,8 @@ class ExtensionClassBase : public Class<ExtensionInstance>
|
||||
void add_setter_method(Function*, const char* name);
|
||||
void add_getter_method(Function*, const char* name);
|
||||
|
||||
// the purpose of try_class_conversions() and its related functions
|
||||
// is explained in extclass.cpp
|
||||
virtual void * try_class_conversions(InstanceHolderBase*) const;
|
||||
virtual void * try_base_class_conversions(InstanceHolderBase*) const;
|
||||
virtual void * try_derived_class_conversions(InstanceHolderBase*) const;
|
||||
@@ -206,7 +210,6 @@ class PyExtensionClassConverters
|
||||
return py::PyPtr<py::ExtensionInstance>(new py::ExtensionInstance(class_));
|
||||
}
|
||||
|
||||
|
||||
// Convert to const T*
|
||||
friend const T* from_python(PyObject* p, py::Type<const T*>)
|
||||
{ return from_python(p, py::Type<T*>()); }
|
||||
@@ -442,7 +445,7 @@ class ExtensionClass
|
||||
virtual std::vector<detail::DerivedClassInfo> const & derived_classes() const;
|
||||
|
||||
// the purpose of this function is explained in extclass.cpp
|
||||
virtual void * convert_from_holder(InstanceHolderBase * v) const;
|
||||
virtual void * extract_object_from_holder(InstanceHolderBase * v) const;
|
||||
|
||||
template <class Signature>
|
||||
void add_constructor(Signature sig)
|
||||
@@ -521,7 +524,7 @@ class InstancePtrHolder : public InstanceHolder<HeldType>
|
||||
public:
|
||||
HeldType* target() { return &*m_ptr; }
|
||||
PtrType& ptr() { return m_ptr; }
|
||||
|
||||
|
||||
InstancePtrHolder(PtrType ptr) : m_ptr(ptr) {}
|
||||
private:
|
||||
PtrType m_ptr;
|
||||
@@ -577,7 +580,7 @@ ExtensionClass<T, U>::derived_classes() const
|
||||
}
|
||||
|
||||
template <class T, class U>
|
||||
void * ExtensionClass<T, U>::convert_from_holder(InstanceHolderBase * v) const
|
||||
void * ExtensionClass<T, U>::extract_object_from_holder(InstanceHolderBase * v) const
|
||||
{
|
||||
py::InstanceHolder<T>* held = dynamic_cast<py::InstanceHolder<T>*>(v);
|
||||
if(held) return held->target();
|
||||
|
||||
@@ -373,12 +373,14 @@ static int getX(OverloadTest * u)
|
||||
|
||||
struct Dummy
|
||||
{
|
||||
virtual ~Dummy() {}
|
||||
int dummy_;
|
||||
};
|
||||
|
||||
struct Base
|
||||
{
|
||||
virtual int x() const { return 999; };
|
||||
virtual ~Base() {}
|
||||
};
|
||||
|
||||
// inherit Dummy so that the Base part of Concrete starts at an offset
|
||||
@@ -437,6 +439,7 @@ struct CallbackTestBase
|
||||
{
|
||||
virtual int testCallback(int i) { return callback(i); }
|
||||
virtual int callback(int i) = 0;
|
||||
virtual ~CallbackTestBase() {}
|
||||
};
|
||||
|
||||
struct CallbackTest : public CallbackTestBase
|
||||
|
||||
@@ -102,7 +102,7 @@ class Class
|
||||
virtual void * try_class_conversions(InstanceHolderBase*) const { return 0; }
|
||||
virtual void * try_base_class_conversions(InstanceHolderBase*) const { return 0; }
|
||||
virtual void * try_derived_class_conversions(InstanceHolderBase*) const { return 0; }
|
||||
virtual void * convert_from_holder(InstanceHolderBase*) const { return 0; }
|
||||
virtual void * extract_object_from_holder(InstanceHolderBase*) const { return 0; }
|
||||
|
||||
protected:
|
||||
void add_base(Ptr base);
|
||||
|
||||
@@ -525,7 +525,7 @@ Testing base class conversions
|
||||
>>> testUpcast(der2)
|
||||
444
|
||||
>>> der2 = derived2Factory(1111)
|
||||
>>> testDowncast2(der1)
|
||||
>>> testDowncast2(der2)
|
||||
Traceback (innermost last):
|
||||
TypeError: extension class 'Base' is not convertible into 'Derived2'.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user