diff options
author | John Cummings <jcummings2@users.sf.net> | 2013-06-21 13:57:14 -0500 |
---|---|---|
committer | John Cummings <jcummings2@users.sf.net> | 2013-06-24 17:32:17 +0200 |
commit | 7d56c8e1d3025edb967906d9481075c38290574c (patch) | |
tree | 36aeeedb24a06041bd23fd2ae48316a708db9799 | |
parent | b137af6d67c65b7e0e362acbdfc0cce0a321e90c (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.cpp | 19 | ||||
-rw-r--r-- | tests/samplebinding/objecttype_test.py | 16 |
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() - |