diff options
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 19 | ||||
-rw-r--r-- | src/qml/qml/qqmlboundsignal.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertycache.cpp | 23 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertycache_p.h | 10 |
4 files changed, 34 insertions, 22 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index cf99b425a2..a2da7d6d89 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -797,8 +797,8 @@ struct QObjectSlotDispatcher : public QtPrivate::QSlotObjectBase if (!v4) break; - QVarLengthArray<int, 9> dummy; - int *argsTypes = QQmlMetaObject(r).methodParameterTypes(This->signalIndex, dummy, 0); + QQmlMetaObject::ArgTypeStorage storage; + int *argsTypes = QQmlMetaObject(r).methodParameterTypes(This->signalIndex, &storage, 0); int argCount = argsTypes ? argsTypes[0]:0; @@ -1372,12 +1372,13 @@ static QV4::ReturnedValue CallPrecise(const QQmlObjectOrGadget &object, const QQ if (data.hasArguments()) { int *args = 0; - QVarLengthArray<int, 9> dummy; + QQmlMetaObject::ArgTypeStorage storage; if (data.isConstructor()) - args = static_cast<const QQmlStaticMetaObject&>(object).constructorParameterTypes(data.coreIndex, dummy, &unknownTypeError); + args = static_cast<const QQmlStaticMetaObject&>(object).constructorParameterTypes( + data.coreIndex, &storage, &unknownTypeError); else - args = object.methodParameterTypes(data.coreIndex, dummy, &unknownTypeError); + args = object.methodParameterTypes(data.coreIndex, &storage, &unknownTypeError); if (!args) { QString typeName = QString::fromLatin1(unknownTypeError); @@ -1429,11 +1430,11 @@ static QV4::ReturnedValue CallOverloaded(const QQmlObjectOrGadget &object, const QV4::ScopedValue v(scope); do { - QVarLengthArray<int, 9> dummy; + QQmlMetaObject::ArgTypeStorage storage; int methodArgumentCount = 0; int *methodArgTypes = 0; if (attempt->hasArguments()) { - int *args = object.methodParameterTypes(attempt->coreIndex, dummy, 0); + int *args = object.methodParameterTypes(attempt->coreIndex, &storage, 0); if (!args) // Must be an unknown argument continue; @@ -2001,11 +2002,11 @@ ReturnedValue QMetaObjectWrapper::callOverloadedConstructor(QV4::ExecutionEngine for (int i = 0; i < numberOfConstructors; i++) { const QQmlPropertyData & attempt = d()->constructors.at(i); - QVarLengthArray<int, 9> dummy; int methodArgumentCount = 0; int *methodArgTypes = 0; if (attempt.hasArguments()) { - int *args = object.constructorParameterTypes(attempt.coreIndex, dummy, 0); + QQmlMetaObject::ArgTypeStorage storage; + int *args = object.constructorParameterTypes(attempt.coreIndex, &storage, 0); if (!args) // Must be an unknown argument continue; diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index 266a5e5366..ef837183db 100644 --- a/src/qml/qml/qqmlboundsignal.cpp +++ b/src/qml/qml/qqmlboundsignal.cpp @@ -206,10 +206,10 @@ void QQmlBoundSignalExpression::evaluate(void **a) ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. - QVarLengthArray<int, 9> dummy; + QQmlMetaObject::ArgTypeStorage storage; //TODO: lookup via signal index rather than method index as an optimization int methodIndex = QMetaObjectPrivate::signal(m_target->metaObject(), m_index).methodIndex(); - int *argsTypes = QQmlMetaObject(m_target).methodParameterTypes(methodIndex, dummy, 0); + int *argsTypes = QQmlMetaObject(m_target).methodParameterTypes(methodIndex, &storage, 0); int argCount = argsTypes ? *argsTypes : 0; QV4::ScopedCallData callData(scope, argCount); diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index 313eec8f69..84081e707d 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -1463,7 +1463,8 @@ int QQmlMetaObject::methodReturnType(const QQmlPropertyData &data, QByteArray *u return type; } -int *QQmlMetaObject::methodParameterTypes(int index, QVarLengthArray<int, 9> &dummy, QByteArray *unknownTypeError) const +int *QQmlMetaObject::methodParameterTypes(int index, ArgTypeStorage *argStorage, + QByteArray *unknownTypeError) const { Q_ASSERT(!_m.isNull() && index >= 0); @@ -1518,15 +1519,19 @@ int *QQmlMetaObject::methodParameterTypes(int index, QVarLengthArray<int, 9> &du } else { QMetaMethod m = _m.asT2()->method(index); - return methodParameterTypes(m, dummy, unknownTypeError); + return methodParameterTypes(m, argStorage, unknownTypeError); } } -int* QQmlMetaObject::methodParameterTypes(const QMetaMethod &m, QVarLengthArray<int, 9> &dummy, QByteArray *unknownTypeError) const { +int *QQmlMetaObject::methodParameterTypes(const QMetaMethod &m, ArgTypeStorage *argStorage, + QByteArray *unknownTypeError) const +{ + Q_ASSERT(argStorage); + int argc = m.parameterCount(); - dummy.resize(argc + 1); - dummy[0] = argc; + argStorage->resize(argc + 1); + argStorage->operator[](0) = argc; QList<QByteArray> argTypeNames; // Only loaded if needed for (int ii = 0; ii < argc; ++ii) { @@ -1546,10 +1551,10 @@ int* QQmlMetaObject::methodParameterTypes(const QMetaMethod &m, QVarLengthArray< if (unknownTypeError) *unknownTypeError = argTypeNames.at(ii); return 0; } - dummy[ii + 1] = type; + argStorage->operator[](ii + 1) = type; } - return dummy.data(); + return argStorage->data(); } void QQmlObjectOrGadget::metacall(QMetaObject::Call type, int index, void **argv) const @@ -1568,7 +1573,9 @@ void QQmlObjectOrGadget::metacall(QMetaObject::Call type, int index, void **argv } } -int* QQmlStaticMetaObject::constructorParameterTypes(int index, QVarLengthArray<int, 9> &dummy, QByteArray *unknownTypeError) const { +int *QQmlStaticMetaObject::constructorParameterTypes(int index, ArgTypeStorage *dummy, + QByteArray *unknownTypeError) const +{ QMetaMethod m = _m.asT2()->constructor(index); return methodParameterTypes(m, dummy, unknownTypeError); } diff --git a/src/qml/qml/qqmlpropertycache_p.h b/src/qml/qml/qqmlpropertycache_p.h index 6b2e0d6d9b..26fa533103 100644 --- a/src/qml/qml/qqmlpropertycache_p.h +++ b/src/qml/qml/qqmlpropertycache_p.h @@ -410,6 +410,8 @@ class QQmlEnginePrivate; class Q_QML_EXPORT QQmlMetaObject { public: + typedef QVarLengthArray<int, 9> ArgTypeStorage; + inline QQmlMetaObject(); inline QQmlMetaObject(QObject *); inline QQmlMetaObject(const QMetaObject *); @@ -429,7 +431,8 @@ public: QQmlPropertyCache *propertyCache(QQmlEnginePrivate *) const; int methodReturnType(const QQmlPropertyData &data, QByteArray *unknownTypeError) const; - int *methodParameterTypes(int index, QVarLengthArray<int, 9> &dummy, QByteArray *unknownTypeError) const; + int *methodParameterTypes(int index, ArgTypeStorage *argStorage, + QByteArray *unknownTypeError) const; static bool canConvert(const QQmlMetaObject &from, const QQmlMetaObject &to); @@ -439,7 +442,8 @@ public: protected: QBiPointer<QQmlPropertyCache, const QMetaObject> _m; - int *methodParameterTypes(const QMetaMethod &method, QVarLengthArray<int, 9> &dummy, QByteArray *unknownTypeError) const; + int *methodParameterTypes(const QMetaMethod &method, ArgTypeStorage *argStorage, + QByteArray *unknownTypeError) const; }; @@ -472,7 +476,7 @@ public: QQmlStaticMetaObject(const QMetaObject* metaObject) : QQmlObjectOrGadget(metaObject) {} - int *constructorParameterTypes(int index, QVarLengthArray<int, 9> &dummy, QByteArray *unknownTypeError) const; + int *constructorParameterTypes(int index, ArgTypeStorage *dummy, QByteArray *unknownTypeError) const; }; QQmlPropertyData::QQmlPropertyData() |