From f3281ca869420df83d618c255aa7d62e63a102d5 Mon Sep 17 00:00:00 2001 From: Andrei Golubev Date: Mon, 8 Feb 2021 15:42:59 +0100 Subject: Support runtime functions evaluation by index through QQmlEngine Add execution function that can evaluate runtime functions available in the compilation unit. Private API for now as it's unclear what would be a comprehensive solution to support all existing use cases Task-number: QTBUG-84368 Task-number: QTBUG-91039 Change-Id: Icf755b53484587d7983eaae4821c1aa0111d5c05 Reviewed-by: Ulf Hermann --- src/qml/jsruntime/qv4engine.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/qml/jsruntime/qv4engine.cpp') 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 #include +#include + #if USE(PTHREADS) # include #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 ctxtdata, void **args, + int *types) +{ + QV4::Scope scope(this); + ExecutionContext *ctx = currentStackFrame ? currentContext() : scriptContext(); + QV4::Scoped 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(), callData->argc(), + qmlContext); +} + void ExecutionEngine::initQmlGlobalObject() { initializeGlobal(); -- cgit v1.2.3