diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-01-11 17:48:17 -0200 |
---|---|---|
committer | Hugo Lima <hugo.lima@openbossa.org> | 2010-01-13 13:55:02 -0200 |
commit | 1bfff6f2f2549dd3a4e068e5bd767f72d8c7bd8b (patch) | |
tree | f9fc2753fd512326e9cdd025bdb50327daf59248 /libshiboken/bindingmanager.cpp | |
parent | 9e7c52bbef25fb118452aacae4f8e05ca5c9cf9a (diff) |
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 <marcelo.lira@openbossa.org>
Diffstat (limited to 'libshiboken/bindingmanager.cpp')
-rw-r--r-- | libshiboken/bindingmanager.cpp | 33 |
1 files changed, 26 insertions, 7 deletions
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<const void*, PyObject*> 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<SbkBaseWrapperType*>(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<PyObject*>(pyobj), cptr); + if (instanceType->mi_offsets) { + int* offset = instanceType->mi_offsets; + while (*offset != -1) { + if (*offset > 0) + m_d->assignWrapper(reinterpret_cast<PyObject*>(pyobj), reinterpret_cast<void*>((std::size_t) cptr + (*offset))); + offset++; + } + } } void BindingManager::releaseWrapper(PyObject* wrapper) |