cache the arguments in property cache data
authorCharles Yin <charles.yin@nokia.com>
Tue, 15 Mar 2011 02:10:01 +0000 (12:10 +1000)
committerCharles Yin <charles.yin@nokia.com>
Fri, 13 May 2011 03:53:37 +0000 (13:53 +1000)
Change-Id: Ie02b94c2ddb1d5d7b7bb6556a01a5ae86a438c57
(cherry picked from commit 39fed3e2601935c1d6834bb5e75266e5b280e5cd)

src/declarative/qml/qdeclarativepropertycache.cpp
src/declarative/qml/qdeclarativepropertycache_p.h

index 9cbb4fa..f39cdd9 100644 (file)
@@ -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<QByteArray> 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();
 }
 
index 65a8725..86ccfe0 100644 (file)
@@ -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 @@ public:
 
     struct Data {
         inline Data(); 
+
         inline bool operator==(const Data &);
 
         enum Flag { 
@@ -115,8 +115,9 @@ public:
         int overrideIndex : 31;
         int revision; 
         int metaObjectOffset;
-
+        QVector<int> 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 *);