aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/bindingmanager.cpp
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-03-29 17:47:02 -0300
committerHugo Lima <hugo.lima@openbossa.org>2010-03-30 17:46:07 -0300
commitc0c093d485798aec96ea7a7230c0639797cd9830 (patch)
tree6014447a087ccb846b598d0a456d89708ccf00fa /libshiboken/bindingmanager.cpp
parent6046687f8f78e1b674e7b4265ce5fb93dce078eb (diff)
Add support for multiple inheritance involving more than one C++ object.
Diffstat (limited to 'libshiboken/bindingmanager.cpp')
-rw-r--r--libshiboken/bindingmanager.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp
index 5d9cb484e..26e146031 100644
--- a/libshiboken/bindingmanager.cpp
+++ b/libshiboken/bindingmanager.cpp
@@ -33,8 +33,10 @@
*/
#include "basewrapper.h"
+#include "basewrapper_p.h"
#include "bindingmanager.h"
#include "google/dense_hash_map"
+#include <cstddef>
namespace Shiboken
{
@@ -85,10 +87,9 @@ bool BindingManager::hasWrapper(const void* cptr)
{
return m_d->wrapperMapper.count(cptr);
}
-void BindingManager::registerWrapper(SbkBaseWrapper* pyobj)
+void BindingManager::registerWrapper(SbkBaseWrapper* pyobj, void* cptr)
{
SbkBaseWrapperType* instanceType = reinterpret_cast<SbkBaseWrapperType*>(pyobj->ob_type);
- void* cptr = pyobj->cptr;
if (instanceType->mi_init && !instanceType->mi_offsets)
instanceType->mi_offsets = instanceType->mi_init(cptr);
@@ -105,14 +106,20 @@ void BindingManager::registerWrapper(SbkBaseWrapper* pyobj)
void BindingManager::releaseWrapper(PyObject* wrapper)
{
- void* cptr = SbkBaseWrapper_cptr(wrapper);
- m_d->releaseWrapper(cptr);
- if (((SbkBaseWrapperType*) wrapper->ob_type)->mi_offsets) {
- int* offset = ((SbkBaseWrapperType*) wrapper->ob_type)->mi_offsets;
- while (*offset != -1) {
- if (*offset > 0)
- m_d->releaseWrapper((void*) ((size_t) cptr + (*offset)));
- offset++;
+ SbkBaseWrapperType* sbkType = reinterpret_cast<SbkBaseWrapperType*>(wrapper->ob_type);
+ int numBases = sbkType->is_multicpp ? getNumberOfCppBaseClasses(wrapper->ob_type) : 1;
+
+ void** cptrs = reinterpret_cast<SbkBaseWrapper*>(wrapper)->cptr;
+ for (int i = 0; i < numBases; ++i) {
+ void* cptr = cptrs[i];
+ m_d->releaseWrapper(cptr);
+ if (sbkType->mi_offsets) {
+ int* offset = sbkType->mi_offsets;
+ while (*offset != -1) {
+ if (*offset > 0)
+ m_d->releaseWrapper((void*) ((std::size_t) cptr + (*offset)));
+ offset++;
+ }
}
}
}