From f41b7967b279609d9d4e1a872c92e753f9aefad3 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Mon, 27 Jul 2009 15:25:50 +0200 Subject: Fix tst_QScriptContext::arguments --- src/script/api/qscriptcontext.cpp | 5 +-- tests/auto/qscriptcontext/tst_qscriptcontext.cpp | 45 ++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp index fc34122..e05e786 100644 --- a/src/script/api/qscriptcontext.cpp +++ b/src/script/api/qscriptcontext.cpp @@ -335,9 +335,10 @@ QScriptValue QScriptContext::argumentsObject() const { Q_D(const QScriptContext); if (d->frame == d->engine->globalObject->globalExec()) { - qWarning("QScriptContext::argumentsObject() not implemented for global context"); - return QScriptValue(); + //global context doesn't have any argument, return an empty object + return static_cast(d->engine->q_ptr)->newObject(); } + Q_ASSERT(d->frame->argumentCount() > 0); //we need at least 'this' otherwise we'll crash later if (!d->frame->optionalCalleeArguments()) { JSC::Arguments* arguments = new (&d->frame->globalData())JSC::Arguments(d->frame, JSC::Arguments::NoParameters); d->frame->setCalleeArguments(arguments); diff --git a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp index 0e6a9a8..f1f0e97 100644 --- a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp +++ b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp @@ -73,6 +73,7 @@ private slots: void pushAndPopScope(); void getSetActivationObject(); void toString(); + void argumentsObjectInNative(); }; tst_QScriptContext::tst_QScriptContext() @@ -144,13 +145,11 @@ void tst_QScriptContext::arguments() { QScriptEngine eng; -#if 0 // ### crashes { QScriptValue args = eng.currentContext()->argumentsObject(); QVERIFY(args.isObject()); QCOMPARE(args.property("length").toInt32(), 0); } -#endif { QScriptValue fun = eng.newFunction(get_arguments); eng.globalObject().setProperty("get_arguments", fun); @@ -741,5 +740,47 @@ void tst_QScriptContext::toString() QCOMPARE(ret.toString(), QString::fromLatin1("foo (first=1, second=2, third=3) at script.qs:2")); } +static QScriptValue argumentsObjectInNative_test1(QScriptContext *ctx, QScriptEngine *) +{ +#define VERIFY(statement) \ + do {\ + if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__))\ + return QString::fromLatin1("Failed " #statement);\ + } while (0) + + QScriptValue obj = ctx->argumentsObject(); + VERIFY(obj.isObject()); + VERIFY(obj.property(0).toUInt32() == 123); + VERIFY(obj.property(1).toString() == QString::fromLatin1("456")); + return QString::fromLatin1("success"); +#undef VERIFY +} + +void tst_QScriptContext::argumentsObjectInNative() +{ + { + QScriptEngine eng; + QScriptValue fun = eng.newFunction(argumentsObjectInNative_test1); + QScriptValueList args; + args << QScriptValue(&eng, 123.0); + args << QScriptValue(&eng, QString::fromLatin1("456")); + QScriptValue result = fun.call(eng.undefinedValue(), args); + QVERIFY(!eng.hasUncaughtException()); + QCOMPARE(result.toString(), QString::fromLatin1("success")); + } + + + + { + QScriptEngine eng; + QScriptValue fun = eng.newFunction(argumentsObjectInNative_test1); + eng.globalObject().setProperty("func", fun); + QScriptValue result = eng.evaluate("func(123.0 , 456);"); + QVERIFY(!eng.hasUncaughtException()); + QCOMPARE(result.toString(), QString::fromLatin1("success")); + } + +} + QTEST_MAIN(tst_QScriptContext) #include "tst_qscriptcontext.moc" -- cgit v0.12