aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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()
-