aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pysidesignal.cpp
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2022-03-13 19:22:02 +0100
committerChristian Tismer <tismer@stackless.com>2022-03-17 19:27:13 +0100
commit3c7c58e341685cae77a3ab7d0bb0595423feac1b (patch)
treecb7494212edaa57a17bf6d461676372fe293d805 /sources/pyside6/libpyside/pysidesignal.cpp
parente188311347c071629d78627ad16f47a8096a1cce (diff)
PyPySide: fix callbacks with the new "builtin method" type
Using this new type, two more errors concerning callbacks could be resolved: signals::qobject_receivers_test QtWidgets::bug_860 [ChangeLog][PySide6] The new PyPy "builtin method" is now handled correctly in callback functions. Task-number: PYSIDE-1843 Task-number: PYSIDE-535 Change-Id: I0f24cf6d7c0352b853f663ffcaf899d3eb77c7e8 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pysidesignal.cpp')
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp
index 16a91813c..f88a8990d 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -1098,6 +1098,28 @@ QString getCallbackSignature(const char *signal, QObject *receiver, PyObject *ca
if (function != nullptr) {
numArgs = PepCode_GET_FLAGS(objCode) & CO_VARARGS ? -1 : PepCode_GET_ARGCOUNT(objCode);
+#ifdef PYPY_VERSION
+ } else if (Py_TYPE(callback) == PepBuiltinMethod_TypePtr) {
+ // PYSIDE-535: PyPy has a special builtin method that acts almost like PyCFunction.
+ Shiboken::AutoDecRef temp(PyObject_GetAttr(callback, Shiboken::PyMagicName::name()));
+ functionName = Shiboken::String::toCString(temp);
+ useSelf = true;
+
+ if (receiver) {
+ // Search for signature on metaobject
+ const QMetaObject *mo = receiver->metaObject();
+ QByteArray prefix(functionName);
+ prefix += '(';
+ for (int i = 0; i < mo->methodCount(); i++) {
+ QMetaMethod me = mo->method(i);
+ if ((strncmp(me.methodSignature(), prefix, prefix.size()) == 0) &&
+ QMetaObject::checkConnectArgs(signal, me.methodSignature())) {
+ numArgs = me.parameterTypes().size() + useSelf;
+ break;
+ }
+ }
+ }
+#endif
} else if (PyCFunction_Check(callback)) {
const PyCFunctionObject *funcObj = reinterpret_cast<const PyCFunctionObject *>(callback);
functionName = PepCFunction_GET_NAMESTR(funcObj);
@@ -1105,7 +1127,7 @@ QString getCallbackSignature(const char *signal, QObject *receiver, PyObject *ca
const int flags = PyCFunction_GET_FLAGS(funcObj);
if (receiver) {
- //Search for signature on metaobject
+ // Search for signature on metaobject
const QMetaObject *mo = receiver->metaObject();
QByteArray prefix(functionName);
prefix += '(';