diff options
Diffstat (limited to 'src/qml/qml/qqmlscriptblob.cpp')
-rw-r--r-- | src/qml/qml/qqmlscriptblob.cpp | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/src/qml/qml/qqmlscriptblob.cpp b/src/qml/qml/qqmlscriptblob.cpp index 72bc3a7c12..fa9a41e801 100644 --- a/src/qml/qml/qqmlscriptblob.cpp +++ b/src/qml/qml/qqmlscriptblob.cpp @@ -32,14 +32,18 @@ QQmlRefPointer<QQmlScriptData> QQmlScriptBlob::scriptData() const return m_scriptData; } +bool QQmlScriptBlob::isNative() const +{ + return m_scriptData && !m_scriptData->m_value.isEmpty(); +} + void QQmlScriptBlob::dataReceived(const SourceCodeData &data) { if (readCacheFile()) { - QQmlRefPointer<QV4::ExecutableCompilationUnit> unit - = QV4::ExecutableCompilationUnit::create(); + auto unit = QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>(); QString error; if (unit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) { - initializeFromCompilationUnit(unit); + initializeFromCompilationUnit(std::move(unit)); return; } else { qCDebug(DBG_DISK_CACHE()) << "Error loading" << urlString() << "from disk cache:" << error; @@ -61,7 +65,7 @@ void QQmlScriptBlob::dataReceived(const SourceCodeData &data) return; } - QV4::CompiledData::CompilationUnit unit; + QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit; if (m_isModule) { QList<QQmlJS::DiagnosticMessage> diagnostics; @@ -96,28 +100,26 @@ void QQmlScriptBlob::dataReceived(const SourceCodeData &data) unit = std::move(irUnit.javaScriptCompilationUnit); } - auto executableUnit = QV4::ExecutableCompilationUnit::create(std::move(unit)); - if (writeCacheFile()) { QString errorString; - if (executableUnit->saveToDisk(url(), &errorString)) { + if (unit->saveToDisk(url(), &errorString)) { QString error; - if (!executableUnit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) { + if (!unit->loadFromDisk(url(), data.sourceTimeStamp(), &error)) { // ignore error, keep using the in-memory compilation unit. } } else { qCDebug(DBG_DISK_CACHE()) << "Error saving cached version of" - << executableUnit->fileName() << "to disk:" << errorString; + << unit->fileName() << "to disk:" << errorString; } } - initializeFromCompilationUnit(executableUnit); + initializeFromCompilationUnit(std::move(unit)); } -void QQmlScriptBlob::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit) +void QQmlScriptBlob::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *cachedUnit) { - initializeFromCompilationUnit(QV4::ExecutableCompilationUnit::create( - QV4::CompiledData::CompilationUnit(unit->qmlData, unit->aotCompiledFunctions, urlString(), finalUrlString()))); + initializeFromCompilationUnit(QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>( + cachedUnit->qmlData, cachedUnit->aotCompiledFunctions, urlString(), finalUrlString())); } void QQmlScriptBlob::done() @@ -182,9 +184,12 @@ void QQmlScriptBlob::scriptImported(const QQmlRefPointer<QQmlScriptBlob> &blob, m_scripts << ref; } -void QQmlScriptBlob::initializeFromCompilationUnit(const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit) +void QQmlScriptBlob::initializeFromCompilationUnit( + QQmlRefPointer<QV4::CompiledData::CompilationUnit> &&unit) { Q_ASSERT(!m_scriptData); + Q_ASSERT(unit); + m_scriptData.adopt(new QQmlScriptData()); m_scriptData->url = finalUrl(); m_scriptData->urlString = finalUrlString(); @@ -192,12 +197,10 @@ void QQmlScriptBlob::initializeFromCompilationUnit(const QQmlRefPointer<QV4::Exe m_importCache->setBaseUrl(finalUrl(), finalUrlString()); - QQmlRefPointer<QV4::ExecutableCompilationUnit> script = m_scriptData->m_precompiledScript; - if (!m_isModule) { QList<QQmlError> errors; - for (quint32 i = 0, count = script->importCount(); i < count; ++i) { - const QV4::CompiledData::Import *import = script->importAt(i); + for (quint32 i = 0, count = unit->importCount(); i < count; ++i) { + const QV4::CompiledData::Import *import = unit->importAt(i); if (!addImport(import, {}, &errors)) { Q_ASSERT(errors.size()); QQmlError error(errors.takeFirst()); @@ -211,22 +214,25 @@ void QQmlScriptBlob::initializeFromCompilationUnit(const QQmlRefPointer<QV4::Exe } } - auto *v4 = QQmlEnginePrivate::getV4Engine(typeLoader()->engine()); - - v4->injectCompiledModule(unit); + const QStringList moduleRequests = unit->moduleRequests(); + for (const QString &request: moduleRequests) { + const QUrl relativeRequest = QUrl(request); + if (m_typeLoader->injectedScript(relativeRequest)) + continue; - for (const QString &request: unit->moduleRequests()) { - const auto module = v4->moduleForUrl(QUrl(request), unit.data()); - if (module.compiled || module.native) + const QUrl absoluteRequest = unit->finalUrl().resolved(relativeRequest); + QQmlRefPointer<QQmlScriptBlob> absoluteBlob = typeLoader()->getScript(absoluteRequest); + if (absoluteBlob->m_scriptData && absoluteBlob->m_scriptData->m_precompiledScript) continue; - const QUrl absoluteRequest = unit->finalUrl().resolved(QUrl(request)); - QQmlRefPointer<QQmlScriptBlob> blob = typeLoader()->getScript(absoluteRequest); - addDependency(blob.data()); - scriptImported(blob, /* ### */QV4::CompiledData::Location(), /*qualifier*/QString(), /*namespace*/QString()); + addDependency(absoluteBlob.data()); + scriptImported( + absoluteBlob, /* ### */QV4::CompiledData::Location(), /*qualifier*/QString(), + /*namespace*/QString()); } } + /*! \internal |