diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-07-09 10:26:50 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-07-09 11:05:10 -0300 |
commit | c740aa812e6556747c51f2ac117c7107739aacab (patch) | |
tree | ce6822f790a9c17a04f40d11703e6f7865ab6c11 /libshiboken/basewrapper.cpp | |
parent | 0984ab74d8861038882b2c2aabbe0c7a2f5da797 (diff) |
Create referenceMap on demand.
Implemented 'variable-name' support on 'reference-count' tag.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libshiboken/basewrapper.cpp')
-rw-r--r-- | libshiboken/basewrapper.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index eaa6a2aae..21e429535 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -376,25 +376,35 @@ void deallocWrapperWithPrivateDtor(PyObject* self) void keepReference(SbkBaseWrapper* self, const char* key, PyObject* referredObject) { + bool isNone = (!referredObject || (referredObject == Py_None)); if (!self->referredObjects) - return; + self->referredObjects = new Shiboken::RefCountMap; + RefCountMap& refCountMap = *(self->referredObjects); - Py_INCREF(referredObject); + if (!isNone) + Py_INCREF(referredObject); + RefCountMap::iterator iter = refCountMap.find(key); - if (iter != refCountMap.end()) + if (iter != refCountMap.end()){ Py_DECREF(iter->second); - refCountMap[key] = referredObject; + refCountMap.erase(iter); + } + + if (!isNone) + refCountMap[key] = referredObject; } void clearReferences(SbkBaseWrapper* self) { if (!self->referredObjects) return; + RefCountMap& refCountMap = *(self->referredObjects); RefCountMap::iterator iter; for (iter = refCountMap.begin(); iter != refCountMap.end(); ++iter) Py_DECREF(iter->second); delete self->referredObjects; + self->referredObjects = 0; } bool importModule(const char* moduleName, PyTypeObject*** cppApiPtr) |