diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-01-14 04:18:55 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-01-14 04:18:55 (GMT) |
commit | 87f9c823a96d693c95a7dd4d969b652891eb4fbe (patch) | |
tree | 679d9e42fac188975bfea7f551a726a4042bcb39 /src/script/bridge/qscriptdeclarativeobject.cpp | |
parent | 351060bd313220044b9323d59d56627e78deea9f (diff) | |
download | Qt-87f9c823a96d693c95a7dd4d969b652891eb4fbe.zip Qt-87f9c823a96d693c95a7dd4d969b652891eb4fbe.tar.gz Qt-87f9c823a96d693c95a7dd4d969b652891eb4fbe.tar.bz2 |
Support calling in QScriptDeclarativeClass
Diffstat (limited to 'src/script/bridge/qscriptdeclarativeobject.cpp')
-rw-r--r-- | src/script/bridge/qscriptdeclarativeobject.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/script/bridge/qscriptdeclarativeobject.cpp b/src/script/bridge/qscriptdeclarativeobject.cpp index 72e31a9..c2fa46c 100644 --- a/src/script/bridge/qscriptdeclarativeobject.cpp +++ b/src/script/bridge/qscriptdeclarativeobject.cpp @@ -155,7 +155,36 @@ void DeclarativeObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC:: JSC::CallType DeclarativeObjectDelegate::getCallData(QScriptObject *object, JSC::CallData &callData) { - return QScriptObjectDelegate::getCallData(object, callData); + if (!QScriptDeclarativeClassPrivate::get(m_class)->supportsCall) + return JSC::CallTypeNone; + callData.native.function = call; + return JSC::CallTypeHost; +} + +JSC::JSValue DeclarativeObjectDelegate::call(JSC::ExecState *exec, JSC::JSObject *callee, + JSC::JSValue thisValue, const JSC::ArgList &args) +{ + if (!callee->inherits(&QScriptObject::info)) + return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object"); + QScriptObject *obj = static_cast<QScriptObject*>(callee); + QScriptObjectDelegate *delegate = obj->delegate(); + if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject)) + return JSC::throwError(exec, JSC::TypeError, "callee is not a DeclarativeObject object"); + + QScriptDeclarativeClass *scriptClass = static_cast<DeclarativeObjectDelegate*>(delegate)->m_class; + QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec); + + JSC::ExecState *oldFrame = eng_p->currentFrame; + eng_p->pushContext(exec, thisValue, args, callee); + QScriptContext *ctxt = eng_p->contextForFrame(eng_p->currentFrame); + + QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj); + QScriptDeclarativeClass::Value result = + scriptClass->call(static_cast<DeclarativeObjectDelegate*>(delegate)->m_object, ctxt); + + eng_p->popContext(); + eng_p->currentFrame = oldFrame; + return (JSC::JSValue &)(result); } JSC::ConstructType DeclarativeObjectDelegate::getConstructData(QScriptObject* object, JSC::ConstructData &constructData) |