summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/script/api/qscriptcontext.cpp24
-rw-r--r--tests/auto/qscriptengine/tst_qscriptengine.cpp3
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<JSC::FunctionBodyNode*>(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