diff options
author | Olivier Goffart <ogoffart@trolltech.com> | 2009-07-27 19:24:18 (GMT) |
---|---|---|
committer | Olivier Goffart <ogoffart@trolltech.com> | 2009-07-28 09:23:16 (GMT) |
commit | 9e9f896312edf68584bea5c9b70ec0f1205a11ab (patch) | |
tree | e456f43d6a0701460ca58f3322cc190269804306 | |
parent | a10d523c5010e46b86a74d111342b1b26891cbdf (diff) | |
download | Qt-9e9f896312edf68584bea5c9b70ec0f1205a11ab.zip Qt-9e9f896312edf68584bea5c9b70ec0f1205a11ab.tar.gz Qt-9e9f896312edf68584bea5c9b70ec0f1205a11ab.tar.bz2 |
Make the 'arguments' object working when calling eval from native functions
The 'arguments' is not handled by JavaScriptCore for native function. We
have to do that manually
Reviewed-by: Kent Hansen
-rw-r--r-- | src/script/api/qscriptengine.cpp | 9 | ||||
-rw-r--r-- | tests/auto/qscriptengine/tst_qscriptengine.cpp | 17 | ||||
-rw-r--r-- | tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 6 |
3 files changed, 24 insertions, 8 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index ba1a31f..a3686ed 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -643,6 +643,12 @@ bool GlobalObject::getOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot) { + QScriptEnginePrivate *engine = scriptEngineFromExec(exec); + if (propertyName == exec->propertyNames().arguments && engine->currentFrame->argumentCount() > 0) { + JSC::JSValue args = engine->scriptValueToJSCValue(engine->contextForFrame(engine->currentFrame)->argumentsObject()); + slot.setValue(args); + return true; + } if (customGlobalObject) return customGlobalObject->getOwnPropertySlot(exec, propertyName, slot); return JSC::JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot); @@ -2173,9 +2179,8 @@ QScriptValue QScriptEngine::evaluate(const QString &program, const QString &file JSC::ExecState* exec = d->currentFrame; exec->clearException(); - if (!exec->globalData().dynamicGlobalObject) - exec->globalData().dynamicGlobalObject = d->originalGlobalObject(); JSC::ScopeChain scopeChain = JSC::ScopeChain(exec->scopeChain()); + JSC::DynamicGlobalObjectScope dynamicGlobalObjectScope(exec, exec->scopeChain()->globalObject()); JSC::Completion comp = JSC::evaluate(exec, scopeChain, JSC::makeSource(jscProgram, jscFileName, lineNumber)); if ((comp.complType() == JSC::Normal) || (comp.complType() == JSC::ReturnValue)) { diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp index b52051f..768fe3c 100644 --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp @@ -2723,6 +2723,14 @@ void tst_QScriptEngine::errorConstructors() } } +static QScriptValue argumentsProperty_fun(QScriptContext *, QScriptEngine *eng) +{ + eng->evaluate("var a = arguments[0];"); + eng->evaluate("arguments[0] = 200;"); + return eng->evaluate("a + arguments[0]"); +} + + void tst_QScriptEngine::argumentsProperty() { { @@ -2751,6 +2759,15 @@ void tst_QScriptEngine::argumentsProperty() QEXPECT_FAIL("", "", Continue); QVERIFY(eng.evaluate("arguments").isUndefined()); } + + { + QScriptEngine eng; + QScriptValue fun = eng.newFunction(argumentsProperty_fun); + eng.globalObject().setProperty("fun", eng.newFunction(argumentsProperty_fun)); + QScriptValue result = eng.evaluate("fun(18)"); + QVERIFY(result.isNumber()); + QCOMPARE(result.toInt32(), 218); + } } void tst_QScriptEngine::numberClass() diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp index f272b7f..c0200a3 100644 --- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp @@ -2383,11 +2383,8 @@ void tst_QScriptValue::call() QScriptValueList args; args << QScriptValue(&eng, 123.0); QScriptValue result = fun.call(eng.undefinedValue(), args); - QEXPECT_FAIL("", "hasUncaughtException() should return false", Continue); QVERIFY(!eng.hasUncaughtException()); - QEXPECT_FAIL("", "Need to create arguments object for frame", Continue); QCOMPARE(result.isNumber(), true); - QEXPECT_FAIL("", "Need to create arguments object for frame", Continue); QCOMPARE(result.toNumber(), 123.0); } } @@ -2402,7 +2399,6 @@ void tst_QScriptValue::call() QScriptValueList args; args << QScriptValue(); QScriptValue ret = fun.call(QScriptValue(), args); - QEXPECT_FAIL("", "hasUncaughtException() should return false", Continue); QVERIFY(!eng.hasUncaughtException()); QCOMPARE(ret.isValid(), true); QCOMPARE(ret.isUndefined(), true); @@ -2415,7 +2411,6 @@ void tst_QScriptValue::call() args << QScriptValue(); QScriptValue ret = fun.call(QScriptValue(), args); QCOMPARE(ret.isValid(), true); - QEXPECT_FAIL("", "Need to create arguments object for frame", Continue); QCOMPARE(ret.isUndefined(), true); } } @@ -2426,7 +2421,6 @@ void tst_QScriptValue::call() args << QScriptValue() << QScriptValue(); QScriptValue ret = fun.call(QScriptValue(), args); QCOMPARE(ret.isValid(), true); - QEXPECT_FAIL("", "Need to create arguments object for frame", Continue); QCOMPARE(ret.isNumber(), true); QCOMPARE(qIsNaN(ret.toNumber()), true); } |