diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp index 9cbb4fa8cc..f39cdd9e6c 100644 --- a/src/declarative/qml/qdeclarativepropertycache.cpp +++ b/src/declarative/qml/qdeclarativepropertycache.cpp @@ -93,6 +93,26 @@ void QDeclarativePropertyCache::Data::load(const QMetaProperty &p, QDeclarativeE revision = p.revision(); } +int QDeclarativePropertyCache::Data::enumType(const QMetaObject *meta, const QString &strname) +{ + QByteArray str = strname.toUtf8(); + QByteArray scope; + QByteArray name; + int scopeIdx = str.lastIndexOf("::"); + if (scopeIdx != -1) { + scope = str.left(scopeIdx); + name = str.mid(scopeIdx + 2); + } else { + name = str; + } + for (int i = meta->enumeratorCount() - 1; i >= 0; --i) { + QMetaEnum m = meta->enumerator(i); + if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope))) + return QVariant::Int; + } + return QVariant::Invalid; +} + void QDeclarativePropertyCache::Data::load(const QMetaMethod &m) { coreIndex = m.methodIndex(); @@ -107,8 +127,17 @@ void QDeclarativePropertyCache::Data::load(const QMetaMethod &m) propType = QMetaType::type(returnType); QList params = m.parameterTypes(); - if (!params.isEmpty()) + if (!params.isEmpty()) { flags |= Data::HasArguments; + paramTypes.resize(params.size()); + for (int i = 0; i < params.size(); ++i) { + paramTypes[i] = QMetaType::type(params.at(i)); + if (paramTypes[i] == QVariant::Invalid) + paramTypes[i] = enumType(m.enclosingMetaObject(), QString::fromLatin1(params.at(i))); + if (paramTypes[i] == QVariant::Invalid) + paramTypes[i] = -1; //Unknown method parameter type + } + } revision = m.revision(); } diff --git a/src/declarative/qml/qdeclarativepropertycache_p.h b/src/declarative/qml/qdeclarativepropertycache_p.h index 65a8725b8f..86ccfe0187 100644 --- a/src/declarative/qml/qdeclarativepropertycache_p.h +++ b/src/declarative/qml/qdeclarativepropertycache_p.h @@ -64,7 +64,6 @@ QT_BEGIN_NAMESPACE class QDeclarativeEngine; class QMetaProperty; - class Q_AUTOTEST_EXPORT QDeclarativePropertyCache : public QDeclarativeRefCount, public QDeclarativeCleanup { public: @@ -74,6 +73,7 @@ class Q_AUTOTEST_EXPORT QDeclarativePropertyCache : public QDeclarativeRefCount, struct Data { inline Data(); + inline bool operator==(const Data &); enum Flag { @@ -115,8 +115,9 @@ class Q_AUTOTEST_EXPORT QDeclarativePropertyCache : public QDeclarativeRefCount, int overrideIndex : 31; int revision; int metaObjectOffset; - + QVector paramTypes; static Flags flagsForProperty(const QMetaProperty &, QDeclarativeEngine *engine = 0); + int enumType(const QMetaObject *meta, const QString &strname); void load(const QMetaProperty &, QDeclarativeEngine *engine = 0); void load(const QMetaMethod &); QString name(QObject *);