File pyqt5-signals-hashable.patch of Package python-qt5

From: Phil Thompson <phil@riverbankcomputing.com>
References: https://www.riverbankcomputing.com/pipermail/pyqt/2020-September/043160.html
Subject: Make signals hashable

Index: PyQt5-5.15.1/qpy/QtCore/qpycore_pyqtboundsignal.cpp
===================================================================
--- PyQt5-5.15.1.orig/qpy/QtCore/qpycore_pyqtboundsignal.cpp
+++ PyQt5-5.15.1/qpy/QtCore/qpycore_pyqtboundsignal.cpp
@@ -42,6 +42,10 @@
 #define CHAR_CAST(s)    (const_cast<char *>(s))
 #endif
 
+#if PY_VERSION_HEX < 0x03020000
+typedef long Py_hash_t;
+#endif
+
 
 // The type object.
 PyTypeObject *qpycore_pyqtBoundSignal_TypeObject;
@@ -52,6 +56,7 @@ extern "C" {
 static PyObject *pyqtBoundSignal_call(PyObject *self, PyObject *args,
         PyObject *kw);
 static void pyqtBoundSignal_dealloc(PyObject *self);
+static Py_hash_t pyqtBoundSignal_hash(PyObject *self);
 static PyObject *pyqtBoundSignal_repr(PyObject *self);
 static PyObject *pyqtBoundSignal_richcompare(PyObject *self, PyObject *other,
         int op);
@@ -139,6 +144,7 @@ static PyType_Slot qpycore_pyqtBoundSign
     {Py_tp_dealloc,     (void *)pyqtBoundSignal_dealloc},
     {Py_tp_repr,        (void *)pyqtBoundSignal_repr},
     {Py_tp_richcompare, (void *)pyqtBoundSignal_richcompare},
+    {Py_tp_hash,        (void *)pyqtBoundSignal_hash},
     {Py_tp_call,        (void *)pyqtBoundSignal_call},
     {Py_mp_subscript,   (void *)pyqtBoundSignal_mp_subscript},
     {Py_tp_methods,     pyqtBoundSignal_methods},
@@ -179,7 +185,7 @@ static PyTypeObject qpycore_pyqtBoundSig
     0,                      /* tp_as_number */
     0,                      /* tp_as_sequence */
     &pyqtBoundSignal_as_mapping,    /* tp_as_mapping */
-    0,                      /* tp_hash */
+    pyqtBoundSignal_hash,   /* tp_hash */
     pyqtBoundSignal_call,   /* tp_call */
     0,                      /* tp_str */
     0,                      /* tp_getattro */
@@ -315,6 +321,27 @@ static PyObject *pyqtBoundSignal_richcom
 }
 
 
+// The type hash slot.
+static Py_hash_t pyqtBoundSignal_hash(PyObject *self)
+{
+    qpycore_pyqtBoundSignal *bs = (qpycore_pyqtBoundSignal *)self;
+
+    Py_hash_t signal_hash = PyObject_Hash((PyObject *)(bs->unbound_signal));
+    if (signal_hash == -1)
+        return -1;
+
+    Py_hash_t object_hash = PyObject_Hash((PyObject *)(bs->bound_pyobject));
+    if (object_hash == -1)
+        return -1;
+
+    Py_hash_t hash = signal_hash ^ object_hash;
+    if (hash == -1)
+        hash = -2;
+
+    return hash;
+}
+
+
 // The type call slot.
 static PyObject *pyqtBoundSignal_call(PyObject *self, PyObject *args,
         PyObject *kw)
openSUSE Build Service is sponsored by