Refactor QQmlPropertyCacheMethodArguments creation.
authorMichael Brasser <michael.brasser@nokia.com>
Tue, 28 Aug 2012 00:49:28 +0000 (10:49 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 28 Aug 2012 02:32:48 +0000 (04:32 +0200)
Change-Id: Ic7215741b26ddf0a36181cf7c7daaff095e797da
Reviewed-by: Matthew Vogt <matthew.vogt@nokia.com>
src/qml/qml/qqmlpropertycache.cpp
src/qml/qml/qqmlpropertycache_p.h

index 50674fa..528e3af 100644 (file)
@@ -398,16 +398,9 @@ void QQmlPropertyCache::appendSignal(const QString &name, quint32 flags, int cor
 
     if (types) {
         int argumentCount = *types;
-        typedef QQmlPropertyCacheMethodArguments A;
-        A *args = static_cast<A *>(malloc(sizeof(A) + (argumentCount + 1) * sizeof(int)));
+        QQmlPropertyCacheMethodArguments *args = createArgumentsObject(argumentCount, names);
         ::memcpy(args->arguments, types, (argumentCount + 1) * sizeof(int));
         args->argumentsValid = true;
-        args->signalParameterStringForJS = 0;
-        args->signalParameterCountForJS = 0;
-        args->parameterError = false;
-        args->names = new QList<QByteArray>(names);
-        args->next = argumentsCache;
-        argumentsCache = args;
         data.arguments = args;
     }
 
@@ -442,16 +435,9 @@ void QQmlPropertyCache::appendSignal(const QHashedCStringRef &name, quint32 flag
 
     if (types) {
         int argumentCount = *types;
-        typedef QQmlPropertyCacheMethodArguments A;
-        A *args = static_cast<A *>(malloc(sizeof(A) + (argumentCount + 1) * sizeof(int)));
+        QQmlPropertyCacheMethodArguments *args = createArgumentsObject(argumentCount, names);
         ::memcpy(args->arguments, types, (argumentCount + 1) * sizeof(int));
         args->argumentsValid = true;
-        args->signalParameterStringForJS = 0;
-        args->signalParameterCountForJS = 0;
-        args->parameterError = false;
-        args->names = new QList<QByteArray>(names);
-        args->next = argumentsCache;
-        argumentsCache = args;
         data.arguments = args;
     }
 
@@ -481,20 +467,10 @@ void QQmlPropertyCache::appendMethod(const QString &name, quint32 flags, int cor
     data.propType = QMetaType::QVariant;
     data.coreIndex = coreIndex;
 
-    typedef QQmlPropertyCacheMethodArguments A;
-    A *args = static_cast<A *>(malloc(sizeof(A) + (argumentCount + 1) * sizeof(int)));
-    args->arguments[0] = argumentCount;
+    QQmlPropertyCacheMethodArguments *args = createArgumentsObject(argumentCount, names);
     for (int ii = 0; ii < argumentCount; ++ii)
         args->arguments[ii + 1] = QMetaType::QVariant;
     args->argumentsValid = true;
-    args->signalParameterStringForJS = 0;
-    args->signalParameterCountForJS = 0;
-    args->parameterError = false;
-    args->names = 0;
-    if (argumentCount)
-        args->names = new QList<QByteArray>(names);
-    args->next = argumentsCache;
-    argumentsCache = args;
     data.arguments = args;
 
     data.flags = flags;
@@ -518,20 +494,10 @@ void QQmlPropertyCache::appendMethod(const QHashedCStringRef &name, quint32 flag
     data.propType = QMetaType::QVariant;
     data.coreIndex = coreIndex;
 
-    typedef QQmlPropertyCacheMethodArguments A;
-    A *args = static_cast<A *>(malloc(sizeof(A) + (argumentCount + 1) * sizeof(int)));
-    args->arguments[0] = argumentCount;
+    QQmlPropertyCacheMethodArguments *args = createArgumentsObject(argumentCount, names);
     for (int ii = 0; ii < argumentCount; ++ii)
         args->arguments[ii + 1] = QMetaType::QVariant;
     args->argumentsValid = true;
-    args->signalParameterStringForJS = 0;
-    args->signalParameterCountForJS = 0;
-    args->parameterError = false;
-    args->names = 0;
-    if (argumentCount)
-        args->names = new QList<QByteArray>(names);
-    args->next = argumentsCache;
-    argumentsCache = args;
     data.arguments = args;
 
     data.flags = flags;
@@ -1061,6 +1027,21 @@ static int EnumType(const QMetaObject *metaobj, const QByteArray &str, int type)
     return type;
 }
 
+QQmlPropertyCacheMethodArguments *QQmlPropertyCache::createArgumentsObject(int argc, const QList<QByteArray> &names)
+{
+    typedef QQmlPropertyCacheMethodArguments A;
+    A *args = static_cast<A *>(malloc(sizeof(A) + (argc + 1) * sizeof(int)));
+    args->arguments[0] = argc;
+    args->argumentsValid = false;
+    args->signalParameterStringForJS = 0;
+    args->signalParameterCountForJS = 0;
+    args->parameterError = false;
+    args->names = argc ? new QList<QByteArray>(names) : 0;
+    args->next = argumentsCache;
+    argumentsCache = args;
+    return args;
+}
+
 /*! \internal
     \a index MUST be in the signal index range (see QObjectPrivate::signalIndex()).
     This is different from QMetaMethod::methodIndex().
@@ -1091,17 +1072,8 @@ QString QQmlPropertyCache::signalParameterStringForJS(int index, int *count, QSt
     QList<QByteArray> parameterNameList = signalParameterNames(index);
 
     if (!signalData->arguments) {
-        int argc = parameterNameList.count();
-        A *args = static_cast<A *>(malloc(sizeof(A) + (argc + 1) * sizeof(int)));
-        args->arguments[0] = argc;
-        args->argumentsValid = false;
-        args->signalParameterStringForJS = 0;
-        args->signalParameterCountForJS = 0;
-        args->parameterError = false;
-        args->names = new QList<QByteArray>(parameterNameList);
+        A *args = c->createArgumentsObject(parameterNameList.count(), parameterNameList);
         signalData->arguments = args;
-        args->next = c->argumentsCache;
-        c->argumentsCache = args;
     }
 
     QQmlRewrite::RewriteSignalHandler rewriter;
@@ -1154,16 +1126,8 @@ int *QQmlPropertyCache::methodParameterTypes(QObject *object, int index,
 
         int argc = m.parameterCount();
         if (!rv->arguments) {
-            A *args = static_cast<A *>(malloc(sizeof(A) + (argc + 1) * sizeof(int)));
-            args->arguments[0] = argc;
-            args->argumentsValid = false;
-            args->signalParameterStringForJS = 0;
-            args->signalParameterCountForJS = 0;
-            args->parameterError = false;
-            args->names = 0;
+            A *args = c->createArgumentsObject(argc);
             rv->arguments = args;
-            args->next = c->argumentsCache;
-            c->argumentsCache = args;
         }
         A *args = static_cast<A *>(rv->arguments);
 
index ad94ed4..99fab43 100644 (file)
@@ -238,6 +238,7 @@ private:
     bool notFullyResolved() const { return flags & NotFullyResolved; }
 };
 
+class QQmlPropertyCacheMethodArguments;
 class Q_QML_PRIVATE_EXPORT QQmlPropertyCache : public QQmlRefCount, public QQmlCleanup
 {
 public:
@@ -345,6 +346,8 @@ private:
     // Implemented in v8/qv8qobjectwrapper.cpp
     v8::Local<v8::Object> newQObject(QObject *, QV8Engine *);
 
+    QQmlPropertyCacheMethodArguments *createArgumentsObject(int count,
+                                                            const QList<QByteArray> &names = QList<QByteArray>());
     QQmlPropertyData *signal(int, QQmlPropertyCache **) const;
 
     typedef QVector<QQmlPropertyData> IndexCache;