Fix bug 651 - "Calling disconnect() with no arguments causes segfault"
This commit is contained in:
parent
a44fcc6dba
commit
3270dde028
3 changed files with 41 additions and 5 deletions
|
|
@ -379,14 +379,14 @@ PyObject* signalInstanceGetItem(PyObject* self, PyObject* key)
|
||||||
|
|
||||||
PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args)
|
PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args)
|
||||||
{
|
{
|
||||||
PySideSignalInstance *source = reinterpret_cast<PySideSignalInstance*>(self);
|
PySideSignalInstance* source = reinterpret_cast<PySideSignalInstance*>(self);
|
||||||
Shiboken::AutoDecRef pyArgs(PyList_New(0));
|
Shiboken::AutoDecRef pyArgs(PyList_New(0));
|
||||||
|
|
||||||
PyObject *slot;
|
PyObject* slot;
|
||||||
if PyTuple_Check(args)
|
if (PyTuple_Check(args) && PyTuple_GET_SIZE(args))
|
||||||
slot = PyTuple_GET_ITEM(args, 0);
|
slot = PyTuple_GET_ITEM(args, 0);
|
||||||
else
|
else
|
||||||
slot = args;
|
slot = Py_None;
|
||||||
|
|
||||||
bool match = false;
|
bool match = false;
|
||||||
if (slot->ob_type == &PySideSignalInstanceType) {
|
if (slot->ob_type == &PySideSignalInstanceType) {
|
||||||
|
|
@ -407,6 +407,9 @@ PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args)
|
||||||
Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature));
|
Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature));
|
||||||
PyList_Append(pyArgs, 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);
|
PyList_Append(pyArgs, slot);
|
||||||
match = true;
|
match = true;
|
||||||
}
|
}
|
||||||
|
|
@ -414,7 +417,7 @@ PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args)
|
||||||
if (match) {
|
if (match) {
|
||||||
Shiboken::AutoDecRef tupleArgs(PyList_AsTuple(pyArgs));
|
Shiboken::AutoDecRef tupleArgs(PyList_AsTuple(pyArgs));
|
||||||
Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "disconnect"));
|
Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "disconnect"));
|
||||||
return PyObject_CallObject(pyMethod, tupleArgs);
|
return PyObject_CallObject(pyMethod, tupleArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ PYSIDE_TEST(bug_311.py)
|
||||||
PYSIDE_TEST(bug_312.py)
|
PYSIDE_TEST(bug_312.py)
|
||||||
PYSIDE_TEST(bug_319.py)
|
PYSIDE_TEST(bug_319.py)
|
||||||
PYSIDE_TEST(decorators_test.py)
|
PYSIDE_TEST(decorators_test.py)
|
||||||
|
PYSIDE_TEST(disconnect_test.py)
|
||||||
PYSIDE_TEST(invalid_callback_test.py)
|
PYSIDE_TEST(invalid_callback_test.py)
|
||||||
PYSIDE_TEST(lambda_gui_test.py)
|
PYSIDE_TEST(lambda_gui_test.py)
|
||||||
PYSIDE_TEST(lambda_test.py)
|
PYSIDE_TEST(lambda_test.py)
|
||||||
|
|
|
||||||
32
tests/signals/disconnect_test.py
Normal file
32
tests/signals/disconnect_test.py
Normal file
|
|
@ -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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue