diff options
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 24 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/qobjectconnect.cpp | 6 |
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); |
