diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2025-06-13 15:26:25 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2025-06-18 08:05:17 +0200 |
| commit | 58d53c60a3cd89824d00684b0513489414523f70 (patch) | |
| tree | 81b4d412b6e10adbb876805d795923907f4a992d /src/qml/jsruntime/qv4executablecompilationunit.cpp | |
| parent | 1c6a6659177fb5fac4aa49e89912df4564f6ec80 (diff) | |
QtQml: Ensure that dependencies of modules are properly loaded
The type loader should make sure that they are available. Prove that by
wrapping all access to dependencies into an accessor that checks the
dependent scripts.
Change-Id: I6e0153fcb213e1a5b6ece79e3fbc0e27dc1b292c
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4executablecompilationunit.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index 260ffecfbe..2a146bebac 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -350,10 +350,8 @@ Heap::Module *ExecutableCompilationUnit::instantiate() if (isESModule()) setModule(module->d()); - const QStringList moduleRequests = m_compilationUnit->moduleRequests(); - for (const QString &request: moduleRequests) { - const QUrl url(request); - const auto dependentModuleUnit = engine->loadModule(url, this); + for (uint i = 0, end = data->moduleRequestTableSize; i < end; ++i) { + const auto dependentModuleUnit = dependentModule(urlAt(data->moduleRequestTable()[i])); if (engine->hasException) return nullptr; if (dependentModuleUnit) @@ -369,10 +367,9 @@ Heap::Module *ExecutableCompilationUnit::instantiate() } for (uint i = 0; i < importCount; ++i) { const CompiledData::ImportEntry &entry = data->importEntryTable()[i]; - QUrl url = urlAt(entry.moduleRequest); importName = runtimeStrings[entry.importName]; - if (const auto module = engine->loadModule(url, this)) { + if (const auto module = dependentModule(urlAt(entry.moduleRequest))) { const Value *valuePtr = module->resolveExport(importName); if (!valuePtr) { QString referenceErrorMessage = QStringLiteral("Unable to resolve import reference "); @@ -397,9 +394,9 @@ Heap::Module *ExecutableCompilationUnit::instantiate() for (uint i = 0; i < data->indirectExportEntryTableSize; ++i) { const CompiledData::ExportEntry &entry = data->indirectExportEntryTable()[i]; - if (auto dependentModule = engine->loadModule(urlAt(entry.moduleRequest), this)) { + if (auto module = dependentModule(urlAt(entry.moduleRequest))) { ScopedString importName(scope, runtimeStrings[entry.importName]); - if (!dependentModule->resolveExport(importName)) { + if (!module->resolveExport(importName)) { throwReferenceError(entry, importName->toQString()); return nullptr; } @@ -444,10 +441,9 @@ const Value *ExecutableCompilationUnit::resolveExportRecursively( if (auto indirectExport = lookupNameInExportTable( data->indirectExportEntryTable(), data->indirectExportEntryTableSize, exportName)) { - QUrl request = urlAt(indirectExport->moduleRequest); - if (auto dependentModule = engine->loadModule(request, this)) { + if (auto module = dependentModule(urlAt(indirectExport->moduleRequest))) { ScopedString importName(scope, runtimeStrings[indirectExport->importName]); - return dependentModule->resolveExportRecursively(importName, resolveSet); + return module->resolveExportRecursively(importName, resolveSet); } return nullptr; } @@ -459,10 +455,9 @@ const Value *ExecutableCompilationUnit::resolveExportRecursively( for (uint i = 0; i < data->starExportEntryTableSize; ++i) { const CompiledData::ExportEntry &entry = data->starExportEntryTable()[i]; - QUrl request = urlAt(entry.moduleRequest); const Value *resolution = nullptr; - if (auto dependentModule = engine->loadModule(request, this)) - resolution = dependentModule->resolveExportRecursively(exportName, resolveSet); + if (auto module = dependentModule(urlAt(entry.moduleRequest))) + resolution = module->resolveExportRecursively(exportName, resolveSet); // ### handle ambiguous if (resolution) { @@ -521,8 +516,8 @@ void ExecutableCompilationUnit::getExportedNamesRecursively( for (uint i = 0; i < data->starExportEntryTableSize; ++i) { const CompiledData::ExportEntry &entry = data->starExportEntryTable()[i]; - if (auto dependentModule = engine->loadModule(urlAt(entry.moduleRequest), this)) { - dependentModule->getExportedNamesRecursively( + if (auto module = dependentModule(urlAt(entry.moduleRequest))) { + module->getExportedNamesRecursively( names, exportNameSet, /*includeDefaultExport*/false); } } @@ -541,15 +536,15 @@ void ExecutableCompilationUnit::evaluateModuleRequests() { Q_ASSERT(engine); - const QStringList moduleRequests = m_compilationUnit->moduleRequests(); - for (const QString &request: moduleRequests) { - auto dependentModule = engine->loadModule(QUrl(request), this); + const CompiledData::Unit *data = unitData(); + for (uint i = 0, end = data->moduleRequestTableSize; i < end; ++i) { + auto module = dependentModule(urlAt(data->moduleRequestTable()[i])); if (engine->hasException) return; - Q_ASSERT(dependentModule); - dependentModule->evaluate(); + Q_ASSERT(module); + module->evaluate(); if (engine->hasException) return; } |
