From 82e9d146016da82c8fab15aacb05e627b5cc5281 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Tue, 1 Feb 2011 19:15:23 -0200 Subject: Fix bug 651 - "Calling disconnect() with no arguments causes segfault" --- libpyside/pysidesignal.cpp | 13 ++++++++----- tests/signals/CMakeLists.txt | 1 + tests/signals/disconnect_test.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 tests/signals/disconnect_test.py diff --git a/libpyside/pysidesignal.cpp b/libpyside/pysidesignal.cpp index 71a8c00bc..7a2c8ae29 100644 --- a/libpyside/pysidesignal.cpp +++ b/libpyside/pysidesignal.cpp @@ -379,14 +379,14 @@ PyObject* signalInstanceGetItem(PyObject* self, PyObject* key) PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args) { - PySideSignalInstance *source = reinterpret_cast(self); + PySideSignalInstance* source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); - PyObject *slot; - if PyTuple_Check(args) + PyObject* slot; + if (PyTuple_Check(args) && PyTuple_GET_SIZE(args)) slot = PyTuple_GET_ITEM(args, 0); else - slot = args; + slot = Py_None; bool match = false; if (slot->ob_type == &PySideSignalInstanceType) { @@ -407,6 +407,9 @@ PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args) Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature)); PyList_Append(pyArgs, signature); + // disconnect all, so we need to use the c++ signature disconnect(qobj, signal, 0, 0) + if (slot == Py_None) + PyList_Append(pyArgs, slot); PyList_Append(pyArgs, slot); match = true; } @@ -414,7 +417,7 @@ PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args) if (match) { Shiboken::AutoDecRef tupleArgs(PyList_AsTuple(pyArgs)); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "disconnect")); - return PyObject_CallObject(pyMethod, tupleArgs); + return PyObject_CallObject(pyMethod, tupleArgs); } return 0; diff --git a/tests/signals/CMakeLists.txt b/tests/signals/CMakeLists.txt index c9ef33e83..8e4d36118 100644 --- a/tests/signals/CMakeLists.txt +++ b/tests/signals/CMakeLists.txt @@ -3,6 +3,7 @@ PYSIDE_TEST(bug_311.py) PYSIDE_TEST(bug_312.py) PYSIDE_TEST(bug_319.py) PYSIDE_TEST(decorators_test.py) +PYSIDE_TEST(disconnect_test.py) PYSIDE_TEST(invalid_callback_test.py) PYSIDE_TEST(lambda_gui_test.py) PYSIDE_TEST(lambda_test.py) diff --git a/tests/signals/disconnect_test.py b/tests/signals/disconnect_test.py new file mode 100644 index 000000000..cceaf873e --- /dev/null +++ b/tests/signals/disconnect_test.py @@ -0,0 +1,32 @@ +import unittest +from PySide.QtCore import * + +class Foo(QObject): + bar = Signal() + +class TestDisconnect(unittest.TestCase): + def theSlot1(self): + self.called1 = True + + def theSlot2(self): + self.called2 = True + + def testIt(self): + self.called1 = False + self.called2 = False + f = Foo() + f.bar.connect(self.theSlot1) + f.bar.connect(self.theSlot2) + f.bar.emit() + self.assertTrue(self.called1) + self.assertTrue(self.called2) + + self.called1 = False + self.called2 = False + f.bar.disconnect() + f.bar.emit() + self.assertFalse(self.called1) + self.assertFalse(self.called2) + +if __name__ == '__main__': + unittest.main() -- cgit v1.2.3