diff options
-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() - |