diff options
author | Jędrzej Nowacki <jedrzej.nowacki@digia.com> | 2014-01-08 14:30:14 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-14 13:34:37 +0100 |
commit | da2a5ae0e4793064bba6c45f42adbee3446c350a (patch) | |
tree | 515be259cc8c74401c20b81b648a606ad08bcd01 /src/corelib/kernel | |
parent | 18d781af741a44ef232fa3bf2fe2a95883f44b72 (diff) |
Do not assume that a class name is the first string in metaobject.
The patch removes unwritten requirements of having a class name as the
first string in qt_meta_stringdata_XXX::stringdata. It allows us to use
the name for suffix check in moc and potentially reduce the object size.
The patch actually fixes QMetaObject, so it properly interpret
classname field in qt_meta_data_XXX, which was previously ignored.
Change-Id: Id31aaf214b6d48c9dd1063ef9c00ec6b22738cbf
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 5be94429b4..d4bfa049ee 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -308,6 +308,11 @@ int QMetaObject::metacall(QObject *object, Call cl, int idx, void **argv) return object->qt_metacall(cl, idx, argv); } +static inline const char *objectClassName(const QMetaObject *m) +{ + return rawStringData(m, priv(m->d.data)->className); +} + /*! Returns the class name. @@ -315,7 +320,7 @@ int QMetaObject::metacall(QObject *object, Call cl, int idx, void **argv) */ const char *QMetaObject::className() const { - return rawStringData(this, 0); + return objectClassName(this); } /*! @@ -369,7 +374,7 @@ const QObject *QMetaObject::cast(const QObject *obj) const */ QString QMetaObject::tr(const char *s, const char *c, int n) const { - return QCoreApplication::translate(rawStringData(this, 0), s, c, n); + return QCoreApplication::translate(objectClassName(this), s, c, n); } #endif // QT_NO_TRANSLATION @@ -728,7 +733,7 @@ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject, QMetaMethod conflictMethod = m->d.superdata->method(conflict); qWarning("QMetaObject::indexOfSignal: signal %s from %s redefined in %s", conflictMethod.methodSignature().constData(), - rawStringData(m->d.superdata, 0), rawStringData(m, 0)); + objectClassName(m->d.superdata), objectClassName(m)); } } #endif @@ -938,7 +943,7 @@ bool QMetaObjectPrivate::checkConnectArgs(const QMetaMethodPrivate *signal, static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, const char *name) { while (self) { - if (strcmp(rawStringData(self, 0), name) == 0) + if (strcmp(objectClassName(self), name) == 0) return self; if (self->d.relatedMetaObjects) { Q_ASSERT(priv(self->d.data)->revision >= 2); @@ -1117,7 +1122,7 @@ QMetaProperty QMetaObject::property(int index) const result.menum = enumerator(indexOfEnumerator(type)); if (!result.menum.isValid()) { const char *enum_name = type; - const char *scope_name = rawStringData(this, 0); + const char *scope_name = objectClassName(this); char *scope_buffer = 0; const char *colon = strrchr(enum_name, ':'); @@ -2412,7 +2417,7 @@ bool QMetaEnum::isFlag() const */ const char *QMetaEnum::scope() const { - return mobj?rawStringData(mobj, 0) : 0; + return mobj ? objectClassName(mobj) : 0; } /*! @@ -2444,7 +2449,8 @@ int QMetaEnum::keyToValue(const char *key, bool *ok) const int count = mobj->d.data[handle + 2]; int data = mobj->d.data[handle + 3]; for (int i = 0; i < count; ++i) { - if ((!scope || (stringSize(mobj, 0) == int(scope) && strncmp(qualified_key, rawStringData(mobj, 0), scope) == 0)) + const QByteArray className = stringData(mobj, priv(mobj->d.data)->className); + if ((!scope || (className.size() == int(scope) && strncmp(qualified_key, className.constData(), scope) == 0)) && strcmp(key, rawStringData(mobj, mobj->d.data[data + 2*i])) == 0) { if (ok != 0) *ok = true; @@ -2512,12 +2518,14 @@ int QMetaEnum::keysToValue(const char *keys, bool *ok) const key += scope + 2; } int i; - for (i = count-1; i >= 0; --i) - if ((!scope || (stringSize(mobj, 0) == int(scope) && strncmp(qualified_key.constData(), rawStringData(mobj, 0), scope) == 0)) + for (i = count-1; i >= 0; --i) { + const QByteArray className = stringData(mobj, priv(mobj->d.data)->className); + if ((!scope || (className.size() == int(scope) && strncmp(qualified_key.constData(), className.constData(), scope) == 0)) && strcmp(key, rawStringData(mobj, mobj->d.data[data + 2*i])) == 0) { value |= mobj->d.data[data + 2*i + 1]; break; } + } if (i < 0) { if (ok != 0) *ok = false; |