diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2009-11-25 16:52:48 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2009-11-25 17:04:01 -0300 |
commit | ecc97184c0025d701ce7789e61ee55b84c29b942 (patch) | |
tree | 5ed9dea78fd8d024cb11798c83462c1edb5d5039 /libshiboken | |
parent | b973238682789a8f6dc68ec824df8c8e14be0ce9 (diff) | |
parent | 32ec53b32affed4707712f33cd6a370ecc62ad7f (diff) |
Merged with multipleinheritance branch
Diffstat (limited to 'libshiboken')
-rw-r--r-- | libshiboken/basewrapper.cpp | 22 | ||||
-rw-r--r-- | libshiboken/basewrapper.h | 18 | ||||
-rw-r--r-- | libshiboken/bindingmanager.cpp | 13 |
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; |