aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2009-11-25 16:52:48 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2009-11-25 17:04:01 -0300
commitecc97184c0025d701ce7789e61ee55b84c29b942 (patch)
tree5ed9dea78fd8d024cb11798c83462c1edb5d5039 /libshiboken
parentb973238682789a8f6dc68ec824df8c8e14be0ce9 (diff)
parent32ec53b32affed4707712f33cd6a370ecc62ad7f (diff)
Merged with multipleinheritance branch
Diffstat (limited to 'libshiboken')
-rw-r--r--libshiboken/basewrapper.cpp22
-rw-r--r--libshiboken/basewrapper.h18
-rw-r--r--libshiboken/bindingmanager.cpp13
3 files changed, 41 insertions, 12 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index 1f58ae588..b0bb3d735 100644
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -38,17 +38,27 @@ namespace Shiboken
{
PyObject*
-PyBaseWrapper_New(PyTypeObject* instanceType, PyTypeObject* baseWrapperType, const void* cptr, unsigned int hasOwnership)
+PyBaseWrapper_New(PyTypeObject* instanceType, ShiboTypeObject* baseWrapperType, const void* cptr, unsigned int hasOwnership)
{
if (!cptr)
return 0;
- PyObject *self = instanceType->tp_alloc(instanceType, 0);
- ((Shiboken::PyBaseWrapper*)self)->baseWrapperType = baseWrapperType;
- ((Shiboken::PyBaseWrapper*)self)->cptr = const_cast<void*>(cptr);
- ((Shiboken::PyBaseWrapper*)self)->hasOwnership = hasOwnership;
- ((Shiboken::PyBaseWrapper*)self)->validCppObject = 1;
+ PyObject* self = ((ShiboTypeObject*) instanceType)->pytype.tp_alloc((PyTypeObject*) instanceType, 0);
+ ((PyBaseWrapper*)self)->baseWrapperType = baseWrapperType;
+ ((PyBaseWrapper*)self)->cptr = const_cast<void*>(cptr);
+ ((PyBaseWrapper*)self)->hasOwnership = hasOwnership;
+ ((PyBaseWrapper*)self)->validCppObject = 1;
+ if (((ShiboTypeObject*) instanceType)->mi_init && !((ShiboTypeObject*) instanceType)->mi_offsets)
+ ((ShiboTypeObject*) instanceType)->mi_offsets = ((ShiboTypeObject*) instanceType)->mi_init(cptr);
BindingManager::instance().assignWrapper(self, cptr);
+ if (((ShiboTypeObject*) instanceType)->mi_offsets) {
+ int* offset = ((ShiboTypeObject*) instanceType)->mi_offsets;
+ while (*offset != -1) {
+ if (*offset > 0)
+ BindingManager::instance().assignWrapper(self, (void*) ((size_t) cptr + (*offset)));
+ offset++;
+ }
+ }
return self;
}
diff --git a/libshiboken/basewrapper.h b/libshiboken/basewrapper.h
index 67f13c11d..a98b77e39 100644
--- a/libshiboken/basewrapper.h
+++ b/libshiboken/basewrapper.h
@@ -44,10 +44,20 @@ namespace Shiboken
extern "C"
{
+typedef int* (*MultipleInheritanceInitFunction)(const void*);
+
+// TODO: explain
+struct ShiboTypeObject
+{
+ PyTypeObject pytype;
+ int* mi_offsets;
+ MultipleInheritanceInitFunction mi_init;
+};
+
struct PyBaseWrapper
{
PyObject_HEAD
- PyTypeObject* baseWrapperType;
+ ShiboTypeObject* baseWrapperType;
void* cptr;
unsigned int hasOwnership : 1;
unsigned int validCppObject : 1;
@@ -55,8 +65,8 @@ struct PyBaseWrapper
} // extern "C"
-#define PyBaseWrapper_Check(op) PyObject_TypeCheck(op, &PyBaseWrapper_Type)
-#define PyBaseWrapper_CheckExact(op) ((op)->ob_type == &PyBaseWrapper_Type)
+#define PyBaseWrapper_Check(op) PyObject_TypeCheck(op, &Shiboken::PyBaseWrapper_Type)
+#define PyBaseWrapper_CheckExact(op) ((op)->ob_type == &Shiboken::PyBaseWrapper_Type)
#define PyBaseWrapper_cptr(pyobj) (((Shiboken::PyBaseWrapper*)pyobj)->cptr)
#define PyBaseWrapper_setCptr(pyobj,c) (((Shiboken::PyBaseWrapper*)pyobj)->cptr = c)
@@ -115,7 +125,7 @@ typedef struct {
LIBSHIBOKEN_API PyAPI_FUNC(PyObject*)
-PyBaseWrapper_New(PyTypeObject *instanceType, PyTypeObject *baseWrapperType,
+PyBaseWrapper_New(PyTypeObject* instanceType, ShiboTypeObject* baseWrapperType,
const void *cptr, unsigned int hasOwnership = 1);
inline bool
diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp
index a848e5e47..fc48348fc 100644
--- a/libshiboken/bindingmanager.cpp
+++ b/libshiboken/bindingmanager.cpp
@@ -85,7 +85,16 @@ void BindingManager::releaseWrapper(void *cptr)
void BindingManager::releaseWrapper(PyObject* wrapper)
{
- releaseWrapper(PyBaseWrapper_cptr(wrapper));
+ void* cptr = PyBaseWrapper_cptr(wrapper);
+ releaseWrapper(cptr);
+ if (((ShiboTypeObject*) wrapper->ob_type)->mi_offsets) {
+ int* offset = ((ShiboTypeObject*) wrapper->ob_type)->mi_offsets;
+ while (*offset != -1) {
+ if (*offset > 0)
+ BindingManager::instance().releaseWrapper((void*) ((size_t) cptr + (*offset)));
+ offset++;
+ }
+ }
}
PyObject* BindingManager::retrieveWrapper(const void* cptr)
@@ -101,7 +110,7 @@ PyObject* BindingManager::getOverride(const void* cptr, const char* methodName)
PyObject* wrapper = retrieveWrapper(cptr);
if (wrapper) {
- PyTypeObject* baseWrapperType = ((Shiboken::PyBaseWrapper*)wrapper)->baseWrapperType;
+ PyTypeObject* baseWrapperType = (PyTypeObject*) ((Shiboken::PyBaseWrapper*)wrapper)->baseWrapperType;
PyObject* method = PyObject_GetAttrString(wrapper, const_cast<char*>(methodName));
if (method) {
PyObject* defaultMethod = 0;