aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 7ae281fb1a..ee35ad2586 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -93,6 +93,7 @@
#include "qv4stackframe_p.h"
#include "qv4atomics_p.h"
#include "qv4urlobject_p.h"
+#include "qv4jscall_p.h"
#if QT_CONFIG(qml_sequence_object)
#include "qv4sequenceobject_p.h"
@@ -124,6 +125,8 @@
#include <qmetatype.h>
#include <qsequentialiterable.h>
+#include <private/qqmlengine_p.h>
+
#if USE(PTHREADS)
# include <pthread.h>
#if !defined(Q_OS_INTEGRITY)
@@ -2051,6 +2054,31 @@ bool ExecutionEngine::diskCacheEnabled() const
return (!disableDiskCache() && !debugger()) || forceDiskCache();
}
+ReturnedValue ExecutionEngine::callInContext(Function *function, QObject *self,
+ QQmlRefPointer<QQmlContextData> ctxtdata, void **args,
+ int *types)
+{
+ QV4::Scope scope(this);
+ ExecutionContext *ctx = currentStackFrame ? currentContext() : scriptContext();
+ QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(ctx, ctxtdata, self));
+ QV4::ScopedValue selfValue(scope, QV4::QObjectWrapper::wrap(this, self));
+
+ if (!args)
+ return function->call(selfValue, nullptr, 0, qmlContext);
+
+ if (!types) // both args and types must be present
+ return Encode::undefined();
+
+ // use JSCallData to pass arguments into the function call
+ QV4::JSCallData jsCall(scope, types[0]);
+ QQmlEnginePrivate *ep = QQmlEnginePrivate::get(m_qmlEngine);
+ QV4::populateJSCallArguments(ep, this, jsCall, args, types);
+
+ QV4::CallData *callData = jsCall->callData();
+ return function->call(selfValue, callData->argValues<QV4::Value>(), callData->argc(),
+ qmlContext);
+}
+
void ExecutionEngine::initQmlGlobalObject()
{
initializeGlobal();