aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/bindingmanager.cpp
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2009-11-25 18:46:33 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2009-11-25 19:08:26 -0300
commitffbb8bb1df621ab3f31f859e62d21e06f9ed8a80 (patch)
tree870de0043ce4c492987767c319caac3baca197a3 /libshiboken/bindingmanager.cpp
parent9f228238498dea95db7eb8c2f0b21186ea98d206 (diff)
Added the invalidateWrapper method to BindingManager.
It sets the wrapper as invalid and removes the relation of C++ objects to the Python wrapper from the mappings. Moved BindingManager::releaseWrapper(void*) to BindingManagerPrivate, since it should only be used by releaseWrapper(PyObject*). Modified includes on conversions.h to use quotes instead of < and >. Reviewed by Hugo Lima <hugo.lima@openbossa.org>
Diffstat (limited to 'libshiboken/bindingmanager.cpp')
-rw-r--r--libshiboken/bindingmanager.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp
index fc48348fc..dd9fdbc7e 100644
--- a/libshiboken/bindingmanager.cpp
+++ b/libshiboken/bindingmanager.cpp
@@ -43,8 +43,16 @@ typedef google::dense_hash_map<const void*, PyObject*> WrapperMap;
struct BindingManager::BindingManagerPrivate {
WrapperMap wrapperMapper;
+ void releaseWrapper(void* cptr);
};
+void BindingManager::BindingManagerPrivate::releaseWrapper(void* cptr)
+{
+ WrapperMap::iterator iter = wrapperMapper.find(cptr);
+ if (iter != wrapperMapper.end())
+ wrapperMapper.erase(iter);
+}
+
BindingManager::BindingManager()
{
m_d = new BindingManager::BindingManagerPrivate;
@@ -76,22 +84,15 @@ void BindingManager::assignWrapper(PyObject* wrapper, const void* cptr)
iter->second = wrapper;
}
-void BindingManager::releaseWrapper(void *cptr)
-{
- WrapperMap::iterator iter = m_d->wrapperMapper.find(cptr);
- if (iter != m_d->wrapperMapper.end())
- m_d->wrapperMapper.erase(iter);
-}
-
void BindingManager::releaseWrapper(PyObject* wrapper)
{
void* cptr = PyBaseWrapper_cptr(wrapper);
- releaseWrapper(cptr);
+ m_d->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)));
+ m_d->releaseWrapper((void*) ((size_t) cptr + (*offset)));
offset++;
}
}
@@ -130,4 +131,11 @@ PyObject* BindingManager::getOverride(const void* cptr, const char* methodName)
return 0;
}
+void BindingManager::invalidateWrapper(PyObject* wrapper)
+{
+ PyBaseWrapper_setValidCppObject(wrapper, false);
+ releaseWrapper(wrapper);
+}
+
} // namespace Shiboken
+