From 1bfff6f2f2549dd3a4e068e5bd767f72d8c7bd8b Mon Sep 17 00:00:00 2001 From: Hugo Lima Date: Mon, 11 Jan 2010 17:48:17 -0200 Subject: Fix object initialization. The C++ object instanciation was made in tp_init function instead of tp_new function. Now tp_new just create a useless python object which will be filled in the tp_init function. Reviewed by Marcelo Lira --- libshiboken/bindingmanager.cpp | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'libshiboken/bindingmanager.cpp') diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp index d9207d5e0..786dade29 100644 --- a/libshiboken/bindingmanager.cpp +++ b/libshiboken/bindingmanager.cpp @@ -44,6 +44,7 @@ typedef google::dense_hash_map WrapperMap; struct BindingManager::BindingManagerPrivate { WrapperMap wrapperMapper; void releaseWrapper(void* cptr); + void assignWrapper(PyObject* wrapper, const void* cptr); }; void BindingManager::BindingManagerPrivate::releaseWrapper(void* cptr) @@ -53,6 +54,16 @@ void BindingManager::BindingManagerPrivate::releaseWrapper(void* cptr) wrapperMapper.erase(iter); } +void BindingManager::BindingManagerPrivate::assignWrapper(PyObject* wrapper, const void* cptr) +{ + assert(cptr); + WrapperMap::iterator iter = wrapperMapper.find(cptr); + if (iter == wrapperMapper.end()) + wrapperMapper.insert(std::make_pair(cptr, wrapper)); + else + iter->second = wrapper; +} + BindingManager::BindingManager() { m_d = new BindingManager::BindingManagerPrivate; @@ -74,14 +85,22 @@ bool BindingManager::hasWrapper(const void* cptr) { return m_d->wrapperMapper.count(cptr); } - -void BindingManager::assignWrapper(PyObject* wrapper, const void* cptr) +void BindingManager::registerWrapper(SbkBaseWrapper* pyobj) { - WrapperMap::iterator iter = m_d->wrapperMapper.find(cptr); - if (iter == m_d->wrapperMapper.end()) - m_d->wrapperMapper.insert(std::make_pair(cptr, wrapper)); - else - iter->second = wrapper; + SbkBaseWrapperType* instanceType = reinterpret_cast(pyobj->ob_type); + void* cptr = pyobj->cptr; + + if (instanceType->mi_init && !instanceType->mi_offsets) + instanceType->mi_offsets = instanceType->mi_init(cptr); + m_d->assignWrapper(reinterpret_cast(pyobj), cptr); + if (instanceType->mi_offsets) { + int* offset = instanceType->mi_offsets; + while (*offset != -1) { + if (*offset > 0) + m_d->assignWrapper(reinterpret_cast(pyobj), reinterpret_cast((std::size_t) cptr + (*offset))); + offset++; + } + } } void BindingManager::releaseWrapper(PyObject* wrapper) -- cgit v1.2.3