aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsapi/qjsengine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-08-25 11:42:23 +0200
committerUlf Hermann <ulf.hermann@qt.io>2022-09-02 15:33:31 +0200
commitb297e8fccf262bb0d870b39a960f0b80193dcaf5 (patch)
tree1f5bb9adf1e3fcbd4a8490c64995c064f3ce1f74 /src/qml/jsapi/qjsengine.cpp
parent7c56dc7e980fc2b0814fb4aec1d5484d4cd3f286 (diff)
QML: Make modules imported with registerModule() available in QML
So far, you could only use them from pure JavaScript programs. Also, fix re-exporting parts of native modules. Fixes: QTBUG-105901 Change-Id: I170017083284e6457b1aa0c6e606fd26227edae3 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsapi/qjsengine.cpp')
-rw-r--r--src/qml/jsapi/qjsengine.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp
index f82c2cba26..1c235755fb 100644
--- a/src/qml/jsapi/qjsengine.cpp
+++ b/src/qml/jsapi/qjsengine.cpp
@@ -566,20 +566,26 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in
QJSValue QJSEngine::importModule(const QString &fileName)
{
const QUrl url = urlForFileName(QFileInfo(fileName).canonicalFilePath());
- auto moduleUnit = m_v4Engine->loadModule(url);
+ const auto module = m_v4Engine->loadModule(url);
if (m_v4Engine->hasException)
return QJSValuePrivate::fromReturnedValue(m_v4Engine->catchException());
QV4::Scope scope(m_v4Engine);
- QV4::Scoped<QV4::Module> moduleNamespace(scope, moduleUnit->instantiate(m_v4Engine));
- if (m_v4Engine->hasException)
- return QJSValuePrivate::fromReturnedValue(m_v4Engine->catchException());
- moduleUnit->evaluate();
- if (!m_v4Engine->isInterrupted.loadRelaxed())
- return QJSValuePrivate::fromReturnedValue(moduleNamespace->asReturnedValue());
+ if (const auto compiled = module.compiled) {
+ QV4::Scoped<QV4::Module> moduleNamespace(scope, compiled->instantiate(m_v4Engine));
+ if (m_v4Engine->hasException)
+ return QJSValuePrivate::fromReturnedValue(m_v4Engine->catchException());
+ compiled->evaluate();
+ if (!m_v4Engine->isInterrupted.loadRelaxed())
+ return QJSValuePrivate::fromReturnedValue(moduleNamespace->asReturnedValue());
+ return QJSValuePrivate::fromReturnedValue(
+ m_v4Engine->newErrorObject(QStringLiteral("Interrupted"))->asReturnedValue());
+ }
- return QJSValuePrivate::fromReturnedValue(
- m_v4Engine->newErrorObject(QStringLiteral("Interrupted"))->asReturnedValue());
+ // If there is neither a native nor a compiled module, we should have seen an exception
+ Q_ASSERT(module.native);
+
+ return QJSValuePrivate::fromReturnedValue(module.native->asReturnedValue());
}
/*!
@@ -609,7 +615,9 @@ QJSValue QJSEngine::importModule(const QString &fileName)
*/
bool QJSEngine::registerModule(const QString &moduleName, const QJSValue &value)
{
- m_v4Engine->registerModule(moduleName, value);
+ QV4::Scope scope(m_v4Engine);
+ QV4::ScopedValue v4Value(scope, QJSValuePrivate::asReturnedValue(&value));
+ m_v4Engine->registerNativeModule(QUrl(moduleName), v4Value);
if (m_v4Engine->hasException)
return false;
return true;