aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/bindingmanager.cpp
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-01-11 17:48:17 -0200
committerHugo Lima <hugo.lima@openbossa.org>2010-01-13 13:55:02 -0200
commit1bfff6f2f2549dd3a4e068e5bd767f72d8c7bd8b (patch)
treef9fc2753fd512326e9cdd025bdb50327daf59248 /libshiboken/bindingmanager.cpp
parent9e7c52bbef25fb118452aacae4f8e05ca5c9cf9a (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.cpp33
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)