From 0579f4be2e79bb95c963a7e2368b6ee797c25e90 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 10 Jul 2009 08:36:55 +0200 Subject: some small fixes/experiments --- src/script/api/qscriptcontext.cpp | 24 ++++++++++++++++++++---- tests/auto/qscriptengine/tst_qscriptengine.cpp | 3 ++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp index ed631bf..f7ed83e 100644 --- a/src/script/api/qscriptcontext.cpp +++ b/src/script/api/qscriptcontext.cpp @@ -334,6 +334,10 @@ QScriptValue QScriptContext::callee() const 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(); + } if (!d->frame->optionalCalleeArguments()) { JSC::Arguments* arguments = new (&d->frame->globalData())JSC::Arguments(d->frame, JSC::Arguments::NoParameters); d->frame->setCalleeArguments(arguments); @@ -400,8 +404,13 @@ QScriptValue QScriptContext::returnValue() const */ void QScriptContext::setReturnValue(const QScriptValue &result) { - Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); - Q_UNUSED(result); + Q_D(QScriptContext); + JSC::ExecState *callerFrame = d->frame->callerFrame(); + if (!callerFrame->codeBlock()) + return; + Q_ASSERT_X(false, Q_FUNC_INFO, "check me"); + int dst = d->frame->registers()[JSC::RegisterFile::ReturnValueRegister].i(); // returnValueRegister() is private + callerFrame[dst] = d->engine->scriptValueToJSCValue(result); } /*! @@ -413,8 +422,15 @@ void QScriptContext::setReturnValue(const QScriptValue &result) */ QScriptValue QScriptContext::activationObject() const { - qWarning("QScriptContext::activationObject() not implemented"); - return QScriptValue(); + Q_D(const QScriptContext); + JSC::CodeBlock *codeBlock = d->frame->codeBlock(); + if (!codeBlock) { + qWarning("QScriptContext::activationObject() not implemented for native functions"); + return QScriptValue(); + } + // ### this is still a bit shaky + JSC::FunctionBodyNode *body = static_cast(codeBlock->ownerNode()); + return d->engine->scriptValueFromJSCValue(new (&d->frame->globalData())JSC::JSActivation(d->frame, body)); } /*! diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp index 8e85f90..e29e834 100644 --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp @@ -158,7 +158,7 @@ void tst_QScriptEngine::currentContext() QVERIFY(globalCtx->thisObject().strictlyEquals(eng.globalObject())); QEXPECT_FAIL("", "", Continue); QVERIFY(globalCtx->activationObject().strictlyEquals(eng.globalObject())); - QSKIP("Crashes", SkipAll); + QEXPECT_FAIL("", "", Continue); QVERIFY(globalCtx->argumentsObject().isObject()); } @@ -3016,6 +3016,7 @@ void tst_QScriptEngine::getterSetterThisObject() { QScriptEngine eng; QScriptContext *ctx = eng.pushContext(); + QVERIFY(ctx != 0); QScriptValue act = ctx->activationObject(); act.setProperty("act", act); // read -- cgit v0.12