From 174ee897edbea436046cfe0ea02f4185e1e0de34 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Wed, 18 Jan 2012 14:01:39 +0100 Subject: Add QJSValue::callWithInstance() function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the deprecated call() overload, it was confusing what the first argument was (the this-object or an actual argument passed to the function). Introduce a dedicated function for the "explicit this-object" case. This makes code more readable, and eliminates the need to pass a "dummy" this-object to call() in the quite common case where you don't care about the this-object. Task-number: QTBUG-23604 Change-Id: I18f8be6592a848436351516bea266fc7e9195777 Reviewed-by: Simon Hausmann Reviewed-by: Jędrzej Nowacki --- src/declarative/qml/v8/qjsvalue.cpp | 20 ++++++++++++--- src/declarative/qml/v8/qjsvalue.h | 1 + tests/auto/declarative/qjsengine/tst_qjsengine.cpp | 22 ++++++++-------- tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp | 30 +++++++++++----------- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/declarative/qml/v8/qjsvalue.cpp b/src/declarative/qml/v8/qjsvalue.cpp index 623e24b42c..cee5dfaa02 100644 --- a/src/declarative/qml/v8/qjsvalue.cpp +++ b/src/declarative/qml/v8/qjsvalue.cpp @@ -710,7 +710,7 @@ QVariant QJSValue::toVariant() const QJSEngine::hasUncaughtException() to determine if an exception occurred. - \sa isCallable() + \sa isCallable(), callWithInstance() */ QJSValue QJSValue::call(const QJSValueList &args) { @@ -720,7 +720,7 @@ QJSValue QJSValue::call(const QJSValueList &args) } /*! - Calls this QJSValue as a function, using \a thisObject as + Calls this QJSValue as a function, using \a instance as the `this' object in the function call, and passing \a args as arguments to the function. Returns the value returned from the function. @@ -728,7 +728,7 @@ QJSValue QJSValue::call(const QJSValueList &args) If this QJSValue is not a function, call() does nothing and returns an invalid QJSValue. - Note that if \a thisObject is not an object, the global object + Note that if \a instance is not an object, the global object (see \l{QJSEngine::globalObject()}) will be used as the `this' object. @@ -740,7 +740,19 @@ QJSValue QJSValue::call(const QJSValueList &args) \snippet doc/src/snippets/code/src_script_qjsvalue.cpp 1 - \sa construct() + \sa call() +*/ +QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList &args) +{ + Q_D(QJSValue); + QScriptIsolate api(d->engine()); + return d->call(QJSValuePrivate::get(instance), args); +} + +/*! + \obsolete + + Use callWithInstance() instead. */ QJSValue QJSValue::call(const QJSValue& thisObject, const QJSValueList& args) { diff --git a/src/declarative/qml/v8/qjsvalue.h b/src/declarative/qml/v8/qjsvalue.h index b9278c5d04..f3988d1819 100644 --- a/src/declarative/qml/v8/qjsvalue.h +++ b/src/declarative/qml/v8/qjsvalue.h @@ -142,6 +142,7 @@ public: bool isCallable() const; QJSValue call(const QJSValueList &args); + QJSValue callWithInstance(const QJSValue &instance, const QJSValueList &args = QJSValueList()); QJSValue call(const QJSValue &thisObject = QJSValue(), const QJSValueList &args = QJSValueList()); QJSValue construct(const QJSValueList &args = QJSValueList()); diff --git a/tests/auto/declarative/qjsengine/tst_qjsengine.cpp b/tests/auto/declarative/qjsengine/tst_qjsengine.cpp index 13c5884801..68c197486d 100644 --- a/tests/auto/declarative/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/declarative/qjsengine/tst_qjsengine.cpp @@ -663,7 +663,7 @@ void tst_QJSEngine::newVariant() QCOMPARE(opaque.prototype().isValid(), true); QEXPECT_FAIL("", "FIXME: newly created QObject's prototype is an JS Object", Continue); QCOMPARE(opaque.prototype().isVariant(), true); - QVERIFY(opaque.property("valueOf").call(opaque).isUndefined()); + QVERIFY(opaque.property("valueOf").callWithInstance(opaque).isUndefined()); } } @@ -734,7 +734,7 @@ void tst_QJSEngine::newVariant_valueOfToString() QJSEngine eng; { QJSValue object = eng.newVariant(QVariant(123)); - QJSValue value = object.property("valueOf").call(object); + QJSValue value = object.property("valueOf").callWithInstance(object); QVERIFY(value.isNumber()); QCOMPARE(value.toInt(), 123); QCOMPARE(object.toString(), QString::fromLatin1("123")); @@ -742,7 +742,7 @@ void tst_QJSEngine::newVariant_valueOfToString() } { QJSValue object = eng.newVariant(QVariant(QString::fromLatin1("hello"))); - QJSValue value = object.property("valueOf").call(object); + QJSValue value = object.property("valueOf").callWithInstance(object); QVERIFY(value.isString()); QCOMPARE(value.toString(), QString::fromLatin1("hello")); QCOMPARE(object.toString(), QString::fromLatin1("hello")); @@ -750,7 +750,7 @@ void tst_QJSEngine::newVariant_valueOfToString() } { QJSValue object = eng.newVariant(QVariant(false)); - QJSValue value = object.property("valueOf").call(object); + QJSValue value = object.property("valueOf").callWithInstance(object); QVERIFY(value.isBool()); QCOMPARE(value.toBool(), false); QCOMPARE(object.toString(), QString::fromLatin1("false")); @@ -758,7 +758,7 @@ void tst_QJSEngine::newVariant_valueOfToString() } { QJSValue object = eng.newVariant(QVariant(QPoint(10, 20))); - QJSValue value = object.property("valueOf").call(object); + QJSValue value = object.property("valueOf").callWithInstance(object); QVERIFY(value.isObject()); QVERIFY(value.strictlyEquals(object)); QCOMPARE(object.toString(), QString::fromLatin1("QVariant(QPoint)")); @@ -2215,7 +2215,7 @@ void tst_QJSEngine::nestedEvaluate() } // From QScriptValue::call() { - QScriptValue result = fun.call(eng.evaluate("p = { id:'foo' }") , QScriptValueList() ); + QScriptValue result = fun.callWithInstance(eng.evaluate("p = { id:'foo' }") , QScriptValueList() ); QCOMPARE(result.property("local_bar").toString(), QString("local")); QCOMPARE(result.property("thisObjectIdBefore").toString(), QString("foo")); QCOMPARE(result.property("thisObjectIdAfter").toString(), QString("foo")); @@ -2986,7 +2986,7 @@ void tst_QJSEngine::castWithPrototypeChain() } { - QScriptValue ret = toBaz.call(scriptZoo, QScriptValueList() << baz2Value); + QScriptValue ret = toBaz.callWithInstance(scriptZoo, QScriptValueList() << baz2Value); QVERIFY(ret.isError()); QCOMPARE(ret.toString(), QLatin1String("TypeError: incompatible type of argument(s) in call to toBaz(); candidates were\n toBaz(Bar*)")); } @@ -3008,7 +3008,7 @@ void tst_QJSEngine::castWithPrototypeChain() } { - QScriptValue ret = toBaz.call(scriptZoo, QScriptValueList() << baz2Value); + QScriptValue ret = toBaz.callWithInstance(scriptZoo, QScriptValueList() << baz2Value); QEXPECT_FAIL("", "Cannot convert Baz* to Bar*", Continue); QVERIFY(!ret.isError()); QEXPECT_FAIL("", "Cannot convert Baz* to Bar*", Continue); @@ -5418,7 +5418,7 @@ void tst_QJSEngine::translateScript_crossScript() static QScriptValue callQsTr(QScriptContext *ctx, QScriptEngine *eng) { - return eng->globalObject().property("qsTr").call(ctx->thisObject(), ctx->argumentsObject()); + return eng->globalObject().property("qsTr").callWithInstance(ctx->thisObject(), ctx->argumentsObject()); } void tst_QJSEngine::translateScript_callQsTrFromNative() @@ -6139,7 +6139,7 @@ void tst_QJSEngine::dateConversionJSQt() QJSValue jsDate = eng.evaluate(QString::fromLatin1("new Date(%0)").arg(secs * 1000.0)); QDateTime qtDate = jsDate.toDateTime(); QString qtUTCDateStr = qtDate.toUTC().toString(Qt::ISODate); - QString jsUTCDateStr = jsDate.property("toISOString").call(jsDate).toString(); + QString jsUTCDateStr = jsDate.property("toISOString").callWithInstance(jsDate).toString(); jsUTCDateStr.remove(jsUTCDateStr.length() - 5, 4); // get rid of milliseconds (".000") if (qtUTCDateStr != jsUTCDateStr) QFAIL(qPrintable(jsDate.toString())); @@ -6153,7 +6153,7 @@ void tst_QJSEngine::dateConversionQtJS() QJSEngine eng; for (int i = 0; i < 8000; ++i) { QJSValue jsDate = eng.newDate(qtDate); - QString jsUTCDateStr = jsDate.property("toISOString").call(jsDate).toString(); + QString jsUTCDateStr = jsDate.property("toISOString").callWithInstance(jsDate).toString(); jsUTCDateStr.remove(jsUTCDateStr.length() - 5, 4); // get rid of milliseconds (".000") QString qtUTCDateStr = qtDate.toUTC().toString(Qt::ISODate); if (jsUTCDateStr != qtUTCDateStr) diff --git a/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp b/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp index 48a65dc4fe..7fb096397f 100644 --- a/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp +++ b/tests/auto/declarative/qjsvalue/tst_qjsvalue.cpp @@ -2827,7 +2827,7 @@ void tst_QJSValue::call_object() QJSEngine eng; QJSValue Object = eng.evaluate("Object"); QCOMPARE(Object.isCallable(), true); - QJSValue result = Object.call(Object); + QJSValue result = Object.callWithInstance(Object); QCOMPARE(result.isObject(), true); } @@ -2840,7 +2840,7 @@ void tst_QJSValue::call_newObjects() QCOMPARE(Object.isCallable(), true); QJSValueList args; args << QJSValue(&eng, 123); - QJSValue result = Number.call(Object, args); + QJSValue result = Number.callWithInstance(Object, args); QCOMPARE(result.strictlyEquals(args.at(0)), true); } @@ -2852,7 +2852,7 @@ void tst_QJSValue::call_this() QCOMPARE(fun.isCallable(), true); QJSValue numberObject = QJSValue(&eng, 123.0).toObject(); - QJSValue result = fun.call(numberObject); + QJSValue result = fun.callWithInstance(numberObject); QCOMPARE(result.isObject(), true); QCOMPARE(result.toNumber(), 123.0); } @@ -2865,13 +2865,13 @@ void tst_QJSValue::call_arguments() QJSValue fun = eng.evaluate("(function() { return arguments[0]; })"); QCOMPARE(fun.isCallable(), true); { - QJSValue result = fun.call(eng.undefinedValue()); + QJSValue result = fun.callWithInstance(eng.undefinedValue()); QCOMPARE(result.isUndefined(), true); } { QJSValueList args; args << QJSValue(&eng, 123.0); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QCOMPARE(result.isNumber(), true); QCOMPARE(result.toNumber(), 123.0); } @@ -2879,7 +2879,7 @@ void tst_QJSValue::call_arguments() { QJSValueList args; args << QJSValue(123.0); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QCOMPARE(result.isNumber(), true); QCOMPARE(result.toNumber(), 123.0); } @@ -2887,7 +2887,7 @@ void tst_QJSValue::call_arguments() { QJSValue args = eng.newArray(); args.setProperty(0, 123); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QVERIFY(result.isNumber()); QCOMPARE(result.toNumber(), 123.0); } @@ -2904,7 +2904,7 @@ void tst_QJSValue::call() { QJSValueList args; args << QJSValue(&eng, 123.0) << QJSValue(&eng, 456.0); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QCOMPARE(result.isNumber(), true); QCOMPARE(result.toNumber(), 456.0); } @@ -2913,7 +2913,7 @@ void tst_QJSValue::call() QJSValue args = eng.newArray(); args.setProperty(0, 123); args.setProperty(1, 456); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QVERIFY(result.isNumber()); QCOMPARE(result.toNumber(), 456.0); } @@ -2938,7 +2938,7 @@ void tst_QJSValue::call() { QJSValueList args; args << QJSValue(&eng, 123.0); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QVERIFY(!eng.hasUncaughtException()); QCOMPARE(result.isNumber(), true); QCOMPARE(result.toNumber(), 123.0); @@ -2947,7 +2947,7 @@ void tst_QJSValue::call() { QJSValueList args; args << QJSValue(123.0); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QCOMPARE(result.isNumber(), true); QCOMPARE(result.toNumber(), 123.0); } @@ -2955,7 +2955,7 @@ void tst_QJSValue::call() { QJSValue args = eng.newArray(); args.setProperty(0, 123); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QVERIFY(result.isNumber()); QCOMPARE(result.toNumber(), 123.0); } @@ -2966,7 +2966,7 @@ void tst_QJSValue::call() { QJSValueList args; args << QJSValue(&eng, 123.0); - QJSValue result = fun.call(eng.undefinedValue(), args); + QJSValue result = fun.callWithInstance(eng.undefinedValue(), args); QVERIFY(!eng.hasUncaughtException()); QCOMPARE(result.isNumber(), true); QCOMPARE(result.toNumber(), 123.0); @@ -2985,7 +2985,7 @@ void tst_QJSValue::call_invalidArguments() { QJSValueList args; args << QJSValue(); - QJSValue ret = fun.call(args); + QJSValue ret = fun.callWithInstance(args); QVERIFY(!eng.hasUncaughtException()); QCOMPARE(ret.isValid(), true); QCOMPARE(ret.isUndefined(), true); @@ -3040,7 +3040,7 @@ void tst_QJSValue::call_twoEngines() QTest::ignoreMessage(QtWarningMsg, "QJSValue::call() failed: " "cannot call function with thisObject created in " "a different engine"); - QCOMPARE(fun.call(object).isValid(), false); + QCOMPARE(fun.callWithInstance(object).isValid(), false); QTest::ignoreMessage(QtWarningMsg, "QJSValue::call() failed: " "cannot call function with argument created in " "a different engine"); -- cgit v1.2.3