From 68d18d77ebac49c2b863c425969c70c5426864cd Mon Sep 17 00:00:00 2001 From: Charles Yin Date: Tue, 15 Mar 2011 12:11:00 +1000 Subject: [PATCH] uses the cached argument info Change-Id: I884516c9c20425bfd17a2db7d5541fbc5cff41c6 (cherry picked from commit b4613a346effee81f10bee99a6a8d3064cbdd13e) --- .../qml/qdeclarativeobjectscriptclass.cpp | 25 ++++---------------- .../qml/qdeclarativeobjectscriptclass_p.h | 2 +- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp index edc1755..f4ca9fe 100644 --- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp +++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp @@ -672,7 +672,7 @@ struct MetaCallArgument { inline void *dataPtr(); inline void initAsType(int type, QDeclarativeEngine *); - void fromScriptValue(int type, QDeclarativeEngine *, const QScriptValue &); + inline void fromScriptValue(int type, QDeclarativeEngine *, const QScriptValue &); inline QScriptDeclarativeClass::Value toValue(QDeclarativeEngine *); private: @@ -908,24 +908,9 @@ QDeclarativeObjectMethodScriptClass::callPrecise(QObject *object, const QDeclara QScriptContext *ctxt) { if (data.flags & QDeclarativePropertyCache::Data::HasArguments) { - - QMetaMethod m = object->metaObject()->method(data.coreIndex); - QList argTypeNames = m.parameterTypes(); - QVarLengthArray argTypes(argTypeNames.count()); - - // ### Cache - for (int ii = 0; ii < argTypeNames.count(); ++ii) { - argTypes[ii] = QMetaType::type(argTypeNames.at(ii)); - if (argTypes[ii] == QVariant::Invalid) - argTypes[ii] = enumType(object->metaObject(), QString::fromLatin1(argTypeNames.at(ii))); - if (argTypes[ii] == QVariant::Invalid) - return Value(ctxt, ctxt->throwError(QString::fromLatin1("Unknown method parameter type: %1").arg(QLatin1String(argTypeNames.at(ii))))); - } - - if (argTypes.count() > ctxt->argumentCount()) - return Value(ctxt, ctxt->throwError(QLatin1String("Insufficient arguments"))); - - return callMethod(object, data.coreIndex, data.propType, argTypes.count(), argTypes.data(), ctxt); + if (data.paramTypes.size() > ctxt->argumentCount()) + return Value(ctxt, ctxt->throwError(QLatin1String("Insufficient arguments"))); + return callMethod(object, data.coreIndex, data.propType, data.paramTypes.size(), data.paramTypes.data(), ctxt); } else { @@ -936,7 +921,7 @@ QDeclarativeObjectMethodScriptClass::callPrecise(QObject *object, const QDeclara QDeclarativeObjectMethodScriptClass::Value QDeclarativeObjectMethodScriptClass::callMethod(QObject *object, int index, - int returnType, int argCount, int *argTypes, + int returnType, int argCount, const int *argTypes, QScriptContext *ctxt) { if (argCount > 0) { diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass_p.h b/src/declarative/qml/qdeclarativeobjectscriptclass_p.h index 850a94f..24fcbda 100644 --- a/src/declarative/qml/qdeclarativeobjectscriptclass_p.h +++ b/src/declarative/qml/qdeclarativeobjectscriptclass_p.h @@ -85,7 +85,7 @@ private: Value callPrecise(QObject *, const QDeclarativePropertyCache::Data &, QScriptContext *); Value callOverloaded(MethodData *, QScriptContext *); - Value callMethod(QObject *, int index, int returnType, int argCount, int *argTypes, QScriptContext *ctxt); + Value callMethod(QObject *, int index, int returnType, int argCount, const int *argTypes, QScriptContext *ctxt); int matchScore(const QScriptValue &, int, const QByteArray &); QDeclarativePropertyCache::Data *relatedMethod(QObject *, QDeclarativePropertyCache::Data *current, -- 1.7.2.5