mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-24 02:42:55 +00:00
cleanup meta-object system
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
e84bc7126b
commit
580a7006a6
3 changed files with 32 additions and 73 deletions
|
@ -401,8 +401,7 @@ int QMetaObject::classInfoOffset() const
|
|||
*/
|
||||
int QMetaObject::constructorCount() const
|
||||
{
|
||||
if (priv(d.data)->revision < 2)
|
||||
return 0;
|
||||
Q_ASSERT(priv(d.data)->revision >= 6);
|
||||
return priv(d.data)->constructorCount;
|
||||
}
|
||||
|
||||
|
@ -488,34 +487,21 @@ int QMetaObject::classInfoCount() const
|
|||
* helper function for indexOf{Method,Slot,Signal}, returns the relative index of the method within
|
||||
* the baseObject
|
||||
* \a MethodType might be MethodSignal or MethodSlot, or 0 to match everything.
|
||||
* \a normalizeStringData set to true if we should do a second pass for old moc generated files normalizing all the symbols.
|
||||
*/
|
||||
template<int MethodType>
|
||||
static inline int indexOfMethodRelative(const QMetaObject **baseObject,
|
||||
const char *method,
|
||||
bool normalizeStringData)
|
||||
const char *method)
|
||||
{
|
||||
for (const QMetaObject *m = *baseObject; m; m = m->d.superdata) {
|
||||
int i = (MethodType == MethodSignal && priv(m->d.data)->revision >= 4)
|
||||
Q_ASSERT(priv(m->d.data)->revision >= 6);
|
||||
int i = (MethodType == MethodSignal)
|
||||
? (priv(m->d.data)->signalCount - 1) : (priv(m->d.data)->methodCount - 1);
|
||||
const int end = (MethodType == MethodSlot && priv(m->d.data)->revision >= 4)
|
||||
? (priv(m->d.data)->signalCount) : 0;
|
||||
if (!normalizeStringData) {
|
||||
for (; i >= end; --i) {
|
||||
const char *stringdata = m->d.stringdata + m->d.data[priv(m->d.data)->methodData + 5*i];
|
||||
if (method[0] == stringdata[0] && strcmp(method + 1, stringdata + 1) == 0) {
|
||||
*baseObject = m;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
} else if (priv(m->d.data)->revision < 5) {
|
||||
for (; i >= end; --i) {
|
||||
const char *stringdata = (m->d.stringdata + m->d.data[priv(m->d.data)->methodData + 5 * i]);
|
||||
const QByteArray normalizedSignature = QMetaObject::normalizedSignature(stringdata);
|
||||
if (normalizedSignature == method) {
|
||||
*baseObject = m;
|
||||
return i;
|
||||
}
|
||||
const int end = (MethodType == MethodSlot) ? (priv(m->d.data)->signalCount) : 0;
|
||||
for (; i >= end; --i) {
|
||||
const char *stringdata = m->d.stringdata + m->d.data[priv(m->d.data)->methodData + 5*i];
|
||||
if (method[0] == stringdata[0] && strcmp(method + 1, stringdata + 1) == 0) {
|
||||
*baseObject = m;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -535,8 +521,7 @@ static inline int indexOfMethodRelative(const QMetaObject **baseObject,
|
|||
*/
|
||||
int QMetaObject::indexOfConstructor(const char *constructor) const
|
||||
{
|
||||
if (priv(d.data)->revision < 2)
|
||||
return -1;
|
||||
Q_ASSERT(priv(d.data)->revision >= 6);
|
||||
for (int i = priv(d.data)->constructorCount-1; i >= 0; --i) {
|
||||
const char *data = d.stringdata + d.data[priv(d.data)->constructorData + 5*i];
|
||||
if (data[0] == constructor[0] && strcmp(constructor + 1, data + 1) == 0) {
|
||||
|
@ -557,11 +542,7 @@ int QMetaObject::indexOfConstructor(const char *constructor) const
|
|||
int QMetaObject::indexOfMethod(const char *method) const
|
||||
{
|
||||
const QMetaObject *m = this;
|
||||
int i = indexOfMethodRelative<0>(&m, method, false);
|
||||
if (i < 0) {
|
||||
m = this;
|
||||
i = indexOfMethodRelative<0>(&m, method, true);
|
||||
}
|
||||
int i = indexOfMethodRelative<0>(&m, method);
|
||||
if (i >= 0)
|
||||
i += m->methodOffset();
|
||||
return i;
|
||||
|
@ -581,11 +562,7 @@ int QMetaObject::indexOfMethod(const char *method) const
|
|||
int QMetaObject::indexOfSignal(const char *signal) const
|
||||
{
|
||||
const QMetaObject *m = this;
|
||||
int i = QMetaObjectPrivate::indexOfSignalRelative(&m, signal, false);
|
||||
if (i < 0) {
|
||||
m = this;
|
||||
i = QMetaObjectPrivate::indexOfSignalRelative(&m, signal, true);
|
||||
}
|
||||
int i = QMetaObjectPrivate::indexOfSignalRelative(&m, signal);
|
||||
if (i >= 0)
|
||||
i += m->methodOffset();
|
||||
return i;
|
||||
|
@ -597,10 +574,9 @@ int QMetaObject::indexOfSignal(const char *signal) const
|
|||
\a baseObject will be adjusted to the enclosing QMetaObject, or 0 if the signal is not found
|
||||
*/
|
||||
int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
|
||||
const char *signal,
|
||||
bool normalizeStringData)
|
||||
const char *signal)
|
||||
{
|
||||
int i = indexOfMethodRelative<MethodSignal>(baseObject, signal, normalizeStringData);
|
||||
int i = indexOfMethodRelative<MethodSignal>(baseObject, signal);
|
||||
#ifndef QT_NO_DEBUG
|
||||
const QMetaObject *m = *baseObject;
|
||||
if (i >= 0 && m && m->d.superdata) {
|
||||
|
@ -624,9 +600,7 @@ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
|
|||
int QMetaObject::indexOfSlot(const char *slot) const
|
||||
{
|
||||
const QMetaObject *m = this;
|
||||
int i = QMetaObjectPrivate::indexOfSlotRelative(&m, slot, false);
|
||||
if (i < 0)
|
||||
i = QMetaObjectPrivate::indexOfSlotRelative(&m, slot, true);
|
||||
int i = QMetaObjectPrivate::indexOfSlotRelative(&m, slot);
|
||||
if (i >= 0)
|
||||
i += m->methodOffset();
|
||||
return i;
|
||||
|
@ -634,10 +608,9 @@ int QMetaObject::indexOfSlot(const char *slot) const
|
|||
|
||||
// same as indexOfSignalRelative but for slots.
|
||||
int QMetaObjectPrivate::indexOfSlotRelative(const QMetaObject **m,
|
||||
const char *slot,
|
||||
bool normalizeStringData)
|
||||
const char *slot)
|
||||
{
|
||||
return indexOfMethodRelative<MethodSlot>(m, slot, normalizeStringData);
|
||||
return indexOfMethodRelative<MethodSlot>(m, slot);
|
||||
}
|
||||
|
||||
static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, const char *name)
|
||||
|
@ -714,7 +687,8 @@ int QMetaObject::indexOfProperty(const char *name) const
|
|||
m = m->d.superdata;
|
||||
}
|
||||
|
||||
if (priv(this->d.data)->revision >= 3 && (priv(this->d.data)->flags & DynamicMetaObject)) {
|
||||
Q_ASSERT(priv(this->d.data)->revision >= 6);
|
||||
if (priv(this->d.data)->flags & DynamicMetaObject) {
|
||||
QAbstractDynamicMetaObject *me =
|
||||
const_cast<QAbstractDynamicMetaObject *>(static_cast<const QAbstractDynamicMetaObject *>(this));
|
||||
|
||||
|
@ -755,9 +729,10 @@ int QMetaObject::indexOfClassInfo(const char *name) const
|
|||
*/
|
||||
QMetaMethod QMetaObject::constructor(int index) const
|
||||
{
|
||||
Q_ASSERT(priv(d.data)->revision >= 6);
|
||||
int i = index;
|
||||
QMetaMethod result;
|
||||
if (priv(d.data)->revision >= 2 && i >= 0 && i < priv(d.data)->constructorCount) {
|
||||
if (i >= 0 && i < priv(d.data)->constructorCount) {
|
||||
result.mobj = this;
|
||||
result.handle = priv(d.data)->constructorData + 5*i;
|
||||
}
|
||||
|
|
|
@ -124,11 +124,9 @@ struct QMetaObjectPrivate
|
|||
{ return reinterpret_cast<const QMetaObjectPrivate*>(metaobject->d.data); }
|
||||
|
||||
static int indexOfSignalRelative(const QMetaObject **baseObject,
|
||||
const char* name,
|
||||
bool normalizeStringData);
|
||||
const char* name);
|
||||
static int indexOfSlotRelative(const QMetaObject **m,
|
||||
const char *slot,
|
||||
bool normalizeStringData);
|
||||
const char *slot);
|
||||
static int originalClone(const QMetaObject *obj, int local_method_index);
|
||||
|
||||
#ifndef QT_NO_QOBJECT
|
||||
|
|
|
@ -2303,20 +2303,14 @@ bool QObject::connect(const QObject *sender, const char *signal,
|
|||
const QMetaObject *smeta = sender->metaObject();
|
||||
const char *signal_arg = signal;
|
||||
++signal; //skip code
|
||||
int signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal, false);
|
||||
int signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal);
|
||||
if (signal_index < 0) {
|
||||
// check for normalized signatures
|
||||
tmp_signal_name = QMetaObject::normalizedSignature(signal - 1);
|
||||
signal = tmp_signal_name.constData() + 1;
|
||||
|
||||
smeta = sender->metaObject();
|
||||
signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal, false);
|
||||
}
|
||||
if (signal_index < 0) {
|
||||
// re-use tmp_signal_name and signal from above
|
||||
|
||||
smeta = sender->metaObject();
|
||||
signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal, true);
|
||||
signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal);
|
||||
}
|
||||
if (signal_index < 0) {
|
||||
err_method_notfound(sender, signal_arg, "connect");
|
||||
|
@ -2341,10 +2335,10 @@ bool QObject::connect(const QObject *sender, const char *signal,
|
|||
int method_index_relative = -1;
|
||||
switch (membcode) {
|
||||
case QSLOT_CODE:
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method, false);
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method);
|
||||
break;
|
||||
case QSIGNAL_CODE:
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, false);
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2357,14 +2351,10 @@ bool QObject::connect(const QObject *sender, const char *signal,
|
|||
rmeta = receiver->metaObject();
|
||||
switch (membcode) {
|
||||
case QSLOT_CODE:
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method, false);
|
||||
if (method_index_relative < 0)
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method, true);
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(&rmeta, method);
|
||||
break;
|
||||
case QSIGNAL_CODE:
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, false);
|
||||
if (method_index_relative < 0)
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, true);
|
||||
method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2620,9 +2610,7 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
|
|||
do {
|
||||
int signal_index = -1;
|
||||
if (signal) {
|
||||
signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal, false);
|
||||
if (signal_index < 0)
|
||||
signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal, true);
|
||||
signal_index = QMetaObjectPrivate::indexOfSignalRelative(&smeta, signal);
|
||||
if (signal_index < 0)
|
||||
break;
|
||||
signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index);
|
||||
|
@ -3349,9 +3337,7 @@ int QObjectPrivate::signalIndex(const char *signalName) const
|
|||
{
|
||||
Q_Q(const QObject);
|
||||
const QMetaObject *base = q->metaObject();
|
||||
int relative_index = QMetaObjectPrivate::indexOfSignalRelative(&base, signalName, false);
|
||||
if (relative_index < 0)
|
||||
relative_index = QMetaObjectPrivate::indexOfSignalRelative(&base, signalName, true);
|
||||
int relative_index = QMetaObjectPrivate::indexOfSignalRelative(&base, signalName);
|
||||
if (relative_index < 0)
|
||||
return relative_index;
|
||||
relative_index = QMetaObjectPrivate::originalClone(base, relative_index);
|
||||
|
|
Loading…
Add table
Reference in a new issue