aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.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/jsruntime/qv4engine.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/jsruntime/qv4engine.cpp')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp55
1 files changed, 31 insertions, 24 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 4e8b29e33d..609495996c 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -2035,7 +2035,7 @@ QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::compileModule(
return ExecutableCompilationUnit::create(std::move(unit));
}
-void ExecutionEngine::injectModule(const QQmlRefPointer<ExecutableCompilationUnit> &moduleUnit)
+void ExecutionEngine::injectCompiledModule(const QQmlRefPointer<ExecutableCompilationUnit> &moduleUnit)
{
// Injection can happen from the QML type loader thread for example, but instantiation and
// evaluation must be limited to the ExecutionEngine's thread.
@@ -2043,52 +2043,59 @@ void ExecutionEngine::injectModule(const QQmlRefPointer<ExecutableCompilationUni
modules.insert(moduleUnit->finalUrl(), moduleUnit);
}
-QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::moduleForUrl(const QUrl &_url, const ExecutableCompilationUnit *referrer) const
+ExecutionEngine::Module ExecutionEngine::moduleForUrl(
+ const QUrl &url, const ExecutableCompilationUnit *referrer) const
{
- QUrl url = QQmlTypeLoader::normalize(_url);
- if (referrer)
- url = referrer->finalUrl().resolved(url);
-
QMutexLocker moduleGuard(&moduleMutex);
- auto existingModule = modules.find(url);
+ const auto nativeModule = nativeModules.find(url);
+ if (nativeModule != nativeModules.end())
+ return Module { nullptr, *nativeModule };
+
+ const QUrl resolved = referrer
+ ? referrer->finalUrl().resolved(QQmlTypeLoader::normalize(url))
+ : QQmlTypeLoader::normalize(url);
+ auto existingModule = modules.find(resolved);
if (existingModule == modules.end())
- return nullptr;
- return *existingModule;
+ return Module { nullptr, nullptr };
+ return Module { *existingModule, nullptr };
}
-QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::loadModule(const QUrl &_url, const ExecutableCompilationUnit *referrer)
+ExecutionEngine::Module ExecutionEngine::loadModule(const QUrl &url, const ExecutableCompilationUnit *referrer)
{
- QUrl url = QQmlTypeLoader::normalize(_url);
- if (referrer)
- url = referrer->finalUrl().resolved(url);
-
QMutexLocker moduleGuard(&moduleMutex);
- auto existingModule = modules.find(url);
+ const auto nativeModule = nativeModules.find(url);
+ if (nativeModule != nativeModules.end())
+ return Module { nullptr, *nativeModule };
+
+ const QUrl resolved = referrer
+ ? referrer->finalUrl().resolved(QQmlTypeLoader::normalize(url))
+ : QQmlTypeLoader::normalize(url);
+ auto existingModule = modules.find(resolved);
if (existingModule != modules.end())
- return *existingModule;
+ return Module { *existingModule, nullptr };
moduleGuard.unlock();
- auto newModule = compileModule(url);
+ auto newModule = compileModule(resolved);
if (newModule) {
moduleGuard.relock();
- modules.insert(url, newModule);
+ modules.insert(resolved, newModule);
}
- return newModule;
+ return Module { newModule, nullptr };
}
-void ExecutionEngine::registerModule(const QString &_name, const QJSValue &module)
+QV4::Value *ExecutionEngine::registerNativeModule(const QUrl &url, const QV4::Value &module)
{
- const QUrl url(_name);
QMutexLocker moduleGuard(&moduleMutex);
const auto existingModule = nativeModules.find(url);
if (existingModule != nativeModules.end())
- return;
+ return nullptr;
- QV4::Value* val = this->memoryManager->m_persistentValues->allocate();
- *val = QJSValuePrivate::asReturnedValue(&module);
+ QV4::Value *val = this->memoryManager->m_persistentValues->allocate();
+ *val = module.asReturnedValue();
nativeModules.insert(url, val);
+ return val;
}
bool ExecutionEngine::diskCacheEnabled() const