diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2009-11-25 18:46:33 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2009-11-25 19:08:26 -0300 |
commit | ffbb8bb1df621ab3f31f859e62d21e06f9ed8a80 (patch) | |
tree | 870de0043ce4c492987767c319caac3baca197a3 /libshiboken/bindingmanager.cpp | |
parent | 9f228238498dea95db7eb8c2f0b21186ea98d206 (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.cpp | 26 |
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 + |