summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@trolltech.com>2009-07-27 19:24:18 (GMT)
committerOlivier Goffart <ogoffart@trolltech.com>2009-07-28 09:23:16 (GMT)
commit9e9f896312edf68584bea5c9b70ec0f1205a11ab (patch)
treee456f43d6a0701460ca58f3322cc190269804306
parenta10d523c5010e46b86a74d111342b1b26891cbdf (diff)
downloadQt-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.cpp9
-rw-r--r--tests/auto/qscriptengine/tst_qscriptengine.cpp17
-rw-r--r--tests/auto/qscriptvalue/tst_qscriptvalue.cpp6
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);
}