diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2022-08-25 11:42:23 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2022-09-02 15:33:31 +0200 |
| commit | b297e8fccf262bb0d870b39a960f0b80193dcaf5 (patch) | |
| tree | 1f5bb9adf1e3fcbd4a8490c64995c064f3ce1f74 /src/qml/jsruntime/qv4engine.cpp | |
| parent | 7c56dc7e980fc2b0814fb4aec1d5484d4cd3f286 (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.cpp | 55 |
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 |
