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