2
0
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:
Ullrich Köthe
2000-10-18 13:22:56 +00:00
parent c410b83b36
commit b43865d494
5 changed files with 19 additions and 14 deletions

View File

@@ -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);

View File

@@ -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();

View File

@@ -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

View File

@@ -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);

View File

@@ -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'.