aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-07-09 10:26:50 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-07-09 11:05:10 -0300
commitc740aa812e6556747c51f2ac117c7107739aacab (patch)
treece6822f790a9c17a04f40d11703e6f7865ab6c11 /libshiboken
parent0984ab74d8861038882b2c2aabbe0c7a2f5da797 (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')
-rw-r--r--libshiboken/basewrapper.cpp18
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)