QObject: (dis)connect(): normalize/decode the same signature

The SIGNAL/SLOT() macros add an integer to the beginning of a
signal/method's signature as a marker; when calling
QMOP::decodeMethodSiganture() we pass the function's signature without
the marker, so logically the same should be done when calling
QMO::normalizedSignature(). The behavior doesn't change, but we don't
inc/decrement the signal/slot pointers back and forth, which makes the
code more readable.

Pick-to: 6.10
Change-Id: I967a78a5a2076ab2dabcbed589b061746cdd39f7
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Ahmad Samir 2025-05-31 20:54:23 +03:00
parent a7c166ee22
commit 66a0fa62bf
1 changed files with 8 additions and 10 deletions

View File

@ -3055,8 +3055,8 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
&smeta, signalName, signalTypes.size(), signalTypes.constData());
if (signal_index < 0) {
// check for normalized signatures
pinnedSignal = QMetaObject::normalizedSignature(signal - 1);
signal = pinnedSignal.constData() + 1;
pinnedSignal = QMetaObject::normalizedSignature(signal);
signal = pinnedSignal.constData();
signalTypes.clear();
signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
@ -3321,19 +3321,22 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
return false;
}
const char *signal_arg = signal;
if (signal) {
if (!check_signal_macro(sender, signal, "disconnect", "unbind"))
return false;
++signal; // skip code
}
const char *method_arg = method;
int membcode = -1;
if (method) {
membcode = extract_code(method);
if (!check_method_code(membcode, receiver, method, "disconnect"))
return false;
++method; // skip code
}
const char *signal_arg = signal;
QByteArray pinnedSignal;
bool signal_found = false;
if (signal) {
@ -3342,15 +3345,12 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
signal = pinnedSignal.constData();
} QT_CATCH (const std::bad_alloc &) {
// if the signal is already normalized, we can continue.
if (sender->metaObject()->indexOfSignal(signal + 1) == -1)
if (sender->metaObject()->indexOfSignal(signal) == -1)
QT_RETHROW;
}
signal++; // skip code
}
QByteArray pinnedMethod;
const char *method_arg = method;
bool method_found = false;
if (method) {
QT_TRY {
@ -3358,11 +3358,9 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
method = pinnedMethod.constData();
} QT_CATCH(const std::bad_alloc &) {
// if the method is already normalized, we can continue.
if (receiver->metaObject()->indexOfMethod(method + 1) == -1)
if (receiver->metaObject()->indexOfMethod(method) == -1)
QT_RETHROW;
}
method++; // skip code
}
/* We now iterate through all the sender's and receiver's meta