aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp24
-rw-r--r--sources/pyside6/libpyside/qobjectconnect.cpp6
2 files changed, 29 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 += '(';
diff --git a/sources/pyside6/libpyside/qobjectconnect.cpp b/sources/pyside6/libpyside/qobjectconnect.cpp
index e8a2b84dd..5dca74f47 100644
--- a/sources/pyside6/libpyside/qobjectconnect.cpp
+++ b/sources/pyside6/libpyside/qobjectconnect.cpp
@@ -113,6 +113,12 @@ static GetReceiverResult getReceiver(QObject *source, const char *signal,
result.self = PyMethod_GET_SELF(callback);
result.receiver = PySide::convertToQObject(result.self, false);
forceGlobalReceiver = isMethodDecorator(callback, true, result.self);
+#ifdef PYPY_VERSION
+ } else if (Py_TYPE(callback) == PepBuiltinMethod_TypePtr) {
+ result.self = PyObject_GetAttrString(callback, "__self__");
+ Py_DECREF(result.self);
+ result.receiver = PySide::convertToQObject(result.self, false);
+#endif
} else if (PyCFunction_Check(callback)) {
result.self = PyCFunction_GET_SELF(callback);
result.receiver = PySide::convertToQObject(result.self, false);