From a47597ea986e76cb6deeaaa64b3714add4688a01 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Tue, 28 Aug 2012 10:49:28 +1000 Subject: Refactor QQmlPropertyCacheMethodArguments creation. Change-Id: Ic7215741b26ddf0a36181cf7c7daaff095e797da Reviewed-by: Matthew Vogt --- src/qml/qml/qqmlpropertycache.cpp | 78 +++++++++++---------------------------- src/qml/qml/qqmlpropertycache_p.h | 3 ++ 2 files changed, 24 insertions(+), 57 deletions(-) (limited to 'src/qml') diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index 50674fa1e4..528e3afdcd 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -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(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(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(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(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(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(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(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(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 &names) +{ + typedef QQmlPropertyCacheMethodArguments A; + A *args = static_cast(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(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 parameterNameList = signalParameterNames(index); if (!signalData->arguments) { - int argc = parameterNameList.count(); - A *args = static_cast(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(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(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(rv->arguments); diff --git a/src/qml/qml/qqmlpropertycache_p.h b/src/qml/qml/qqmlpropertycache_p.h index ad94ed4688..99fab4323c 100644 --- a/src/qml/qml/qqmlpropertycache_p.h +++ b/src/qml/qml/qqmlpropertycache_p.h @@ -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 newQObject(QObject *, QV8Engine *); + QQmlPropertyCacheMethodArguments *createArgumentsObject(int count, + const QList &names = QList()); QQmlPropertyData *signal(int, QQmlPropertyCache **) const; typedef QVector IndexCache; -- cgit v1.2.3