From ffbb8bb1df621ab3f31f859e62d21e06f9ed8a80 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 25 Nov 2009 18:46:33 -0300 Subject: 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 --- libshiboken/bindingmanager.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'libshiboken/bindingmanager.cpp') 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 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 + -- cgit v1.2.3