aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/basewrapper.cpp
diff options
context:
space:
mode:
authorJohn Cummings <jcummings2@users.sf.net>2013-06-21 13:57:14 -0500
committerJohn Cummings <jcummings2@users.sf.net>2013-06-24 17:32:17 +0200
commit7d56c8e1d3025edb967906d9481075c38290574c (patch)
tree36aeeedb24a06041bd23fd2ae48316a708db9799 /libshiboken/basewrapper.cpp
parentb137af6d67c65b7e0e362acbdfc0cce0a321e90c (diff)
Fix bug introduced when recursive_invalidate was added.
If a Python object is passed to recursive_invalidate and is a sequence, each item in the sequence is invalidated Add unit test for recursive invalidate of a sequence Change-Id: I70834f8e027bd17a04c0e443bc7d584d1fde26c1 Reviewed-by: John Ehresman <jpe@wingware.com> Reviewed-by: John Cummings <jcummings2@users.sf.net>
Diffstat (limited to 'libshiboken/basewrapper.cpp')
-rw-r--r--libshiboken/basewrapper.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index ad15e0d84..63b46bcd5 100644
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -880,13 +880,14 @@ void releaseOwnership(PyObject* self)
setSequenceOwnership(self, false);
}
+/* Needed forward declarations */
+static void recursive_invalidate(PyObject* pyobj, std::set<SbkObject*>& seen);
+static void recursive_invalidate(SbkObject* self, std::set<SbkObject*>& seen);
+
void invalidate(PyObject* pyobj)
{
- std::list<SbkObject*> objs = splitPyObject(pyobj);
- std::list<SbkObject*>::const_iterator it = objs.begin();
std::set<SbkObject*> seen;
- for(; it != objs.end(); it++)
- recursive_invalidate(*it, seen);
+ recursive_invalidate(pyobj, seen);
}
void invalidate(SbkObject* self)
@@ -895,6 +896,14 @@ void invalidate(SbkObject* self)
recursive_invalidate(self, seen);
}
+static void recursive_invalidate(PyObject* pyobj, std::set<SbkObject*>& seen)
+{
+ std::list<SbkObject*> objs = splitPyObject(pyobj);
+ std::list<SbkObject*>::const_iterator it = objs.begin();
+ for (; it != objs.end(); it++)
+ recursive_invalidate(*it, seen);
+}
+
static void recursive_invalidate(SbkObject* self, std::set<SbkObject*>& seen)
{
// Skip if this object not is a valid object or if it's already been seen
@@ -931,7 +940,7 @@ static void recursive_invalidate(SbkObject* self, std::set<SbkObject*>& seen)
const std::list<PyObject*> lst = iter->second;
std::list<PyObject*>::const_iterator it = lst.begin();
while(it != lst.end()) {
- recursive_invalidate((SbkObject*)*it, seen);
+ recursive_invalidate(*it, seen);
++it;
}
}