diff --git a/extclass.cpp b/extclass.cpp index 5c8b44b5..e246b973 100644 --- a/extclass.cpp +++ b/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 *>(an_instance_holder_base)' succeeds. + 'dynamic_cast *>(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); diff --git a/extclass.h b/extclass.h index f1712f36..05bb8017 100644 --- a/extclass.h +++ b/extclass.h @@ -60,11 +60,13 @@ typedef void * (*ConversionFunction)(void *); struct BaseClassInfo { - BaseClassInfo(Class * t, ConversionFunction f) + typedef Class ClassObject; + + BaseClassInfo(ClassObject * t, ConversionFunction f) :class_object(t), convert(f) {} - Class * class_object; + ClassObject * class_object; ConversionFunction convert; }; typedef BaseClassInfo DerivedClassInfo; @@ -85,6 +87,8 @@ class ExtensionClassBase : public Class 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(new py::ExtensionInstance(class_)); } - // Convert to const T* friend const T* from_python(PyObject* p, py::Type) { return from_python(p, py::Type()); } @@ -442,7 +445,7 @@ class ExtensionClass virtual std::vector 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 void add_constructor(Signature sig) @@ -521,7 +524,7 @@ class InstancePtrHolder : public InstanceHolder 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::derived_classes() const } template -void * ExtensionClass::convert_from_holder(InstanceHolderBase * v) const +void * ExtensionClass::extract_object_from_holder(InstanceHolderBase * v) const { py::InstanceHolder* held = dynamic_cast*>(v); if(held) return held->target(); diff --git a/extclass_demo.cpp b/extclass_demo.cpp index 18050f7d..0334e0cd 100644 --- a/extclass_demo.cpp +++ b/extclass_demo.cpp @@ -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 diff --git a/subclass.h b/subclass.h index 778f8519..732d15b2 100644 --- a/subclass.h +++ b/subclass.h @@ -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); diff --git a/test_extclass.py b/test_extclass.py index 648b3e81..8861aa06 100644 --- a/test_extclass.py +++ b/test_extclass.py @@ -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'.