aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp4
-rw-r--r--libshiboken/bindingmanager.cpp26
-rw-r--r--libshiboken/bindingmanager.h4
-rw-r--r--libshiboken/conversions.h6
4 files changed, 25 insertions, 15 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp
index 06051dbb4..6ffbfe999 100644
--- a/cppgenerator.cpp
+++ b/cppgenerator.cpp
@@ -396,8 +396,8 @@ void CppGenerator::writeVirtualMethodNative(QTextStream &s, const AbstractMetaFu
foreach (ArgumentModification arg_mod, func_mod.argument_mods) {
if (!arg_mod.resetAfterUse)
continue;
- s << INDENT << "PyBaseWrapper_setValidCppObject(PyTuple_GET_ITEM(pyargs, ";
- s << (arg_mod.index - 1) << "), false);" << endl;
+ s << INDENT << "BindingManager::instance().invalidateWrapper(PyTuple_GET_ITEM(pyargs, ";
+ s << (arg_mod.index - 1) << "));" << endl;
}
}
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
+
diff --git a/libshiboken/bindingmanager.h b/libshiboken/bindingmanager.h
index d082c7b5d..aba264fd5 100644
--- a/libshiboken/bindingmanager.h
+++ b/libshiboken/bindingmanager.h
@@ -48,11 +48,13 @@ public:
bool hasWrapper(const void *cptr);
void assignWrapper(PyObject* wrapper, const void* cptr);
- void releaseWrapper(void* cptr);
void releaseWrapper(PyObject* wrapper);
PyObject* retrieveWrapper(const void* cptr);
PyObject* getOverride(const void* cptr, const char* methodName);
+ /// Invalidate the Python wrapper and removes the relations from C++ objects the Python wrapper.
+ void invalidateWrapper(PyObject* wrapper);
+
private:
~BindingManager();
// disable copy
diff --git a/libshiboken/conversions.h b/libshiboken/conversions.h
index b69d0bbae..9cc166cf0 100644
--- a/libshiboken/conversions.h
+++ b/libshiboken/conversions.h
@@ -36,9 +36,9 @@
#define CONVERSIONS_H
#include <Python.h>
-#include <pyenum.h>
-#include <basewrapper.h>
-#include <bindingmanager.h>
+#include "pyenum.h"
+#include "basewrapper.h"
+#include "bindingmanager.h"
// When the user adds a function with an argument unknown for the typesystem, the generator writes type checks as
// TYPENAME_Check, so this macro allows users to add PyObject arguments to their added functions.