aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/bindingmanager.cpp
diff options
context:
space:
mode:
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
+