aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--libshiboken/basewrapper.cpp19
-rw-r--r--tests/samplebinding/objecttype_test.py16
2 files changed, 29 insertions, 6 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index ad15e0d..63b46bc 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;
}
}
diff --git a/tests/samplebinding/objecttype_test.py b/tests/samplebinding/objecttype_test.py
index 6e24ba9..57947e8 100644
--- a/tests/samplebinding/objecttype_test.py
+++ b/tests/samplebinding/objecttype_test.py
@@ -86,6 +86,20 @@ class ObjectTypeTest(unittest.TestCase):
shiboken.invalidate(parent)
+ def testNextInFocusChainCycleList(self):
+ '''As above but in for a list of objects'''
+ parents = []
+ children = []
+ focus_chains = []
+ for i in range(10):
+ parent = ObjectType()
+ child = ObjectType(parent)
+ next_focus = child.nextInFocusChain()
+ parents.append(parent)
+ children.append(child)
+ focus_chains.append(next_focus)
+
+ shiboken.invalidate(parents)
+
if __name__ == '__main__':
unittest.main()
-