diff options
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 90c75b204d..14bc5f084e 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -1682,6 +1682,7 @@ QQmlRefPointer<CompiledData::CompilationUnit> ExecutionEngine::compileModule(boo using namespace QV4::Compiler; Compiler::Module compilerModule(debugMode); + compilerModule.unitFlags |= CompiledData::Unit::IsESModule; JSUnitGenerator jsGenerator(&compilerModule); Codegen cg(&jsGenerator, /*strictMode*/true); cg.generateFromModule(url.fileName(), url.toString(), sourceCode, moduleNode, &compilerModule); @@ -1697,22 +1698,43 @@ QQmlRefPointer<CompiledData::CompilationUnit> ExecutionEngine::compileModule(boo void ExecutionEngine::injectModule(const QQmlRefPointer<CompiledData::CompilationUnit> &moduleUnit) { + // Injection can happen from the QML type loader thread for example, but instantiation and + // evaluation must be limited to the ExecutionEngine's thread. + QMutexLocker moduleGuard(&moduleMutex); modules.insert(moduleUnit->finalUrl(), moduleUnit); } +QQmlRefPointer<CompiledData::CompilationUnit> ExecutionEngine::moduleForUrl(const QUrl &_url, const CompiledData::CompilationUnit *referrer) const +{ + QUrl url = QQmlTypeLoader::normalize(_url); + if (referrer) + url = referrer->finalUrl().resolved(url); + + QMutexLocker moduleGuard(&moduleMutex); + auto existingModule = modules.find(url); + if (existingModule == modules.end()) + return nullptr; + return *existingModule; +} + QQmlRefPointer<CompiledData::CompilationUnit> ExecutionEngine::loadModule(const QUrl &_url, const CompiledData::CompilationUnit *referrer) { QUrl url = QQmlTypeLoader::normalize(_url); if (referrer) url = referrer->finalUrl().resolved(url); + QMutexLocker moduleGuard(&moduleMutex); auto existingModule = modules.find(url); if (existingModule != modules.end()) return *existingModule; + moduleGuard.unlock(); + auto newModule = compileModule(url); - if (newModule) + if (newModule) { + moduleGuard.relock(); modules.insert(url, newModule); + } return newModule; } |