29void QQmlScriptBlob::dataReceived(
const SourceCodeData &data)
31 assertTypeLoaderThread();
33 if (data.isCacheable()) {
34 if (m_typeLoader->readCacheFile()) {
35 auto unit = QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>();
37 const auto sourceChecksum = [&data]() {
return data.checksum(); };
38 if (unit->loadFromDisk(url(), data.sourceTimeStamp(), sourceChecksum, &error)) {
39 initializeFromCompilationUnit(std::move(unit));
42 qCDebug(DBG_DISK_CACHE()) <<
"Error loading" << urlString()
43 <<
"from disk cache:" << error;
49 if (m_cachedUnitStatus == QQmlMetaType::CachedUnitLookupError::VersionMismatch)
50 setError(QQmlTypeLoader::tr(
"File was compiled ahead of time with an incompatible version of Qt and the original file cannot be found. Please recompile"));
52 setError(QQmlTypeLoader::tr(
"No such file or directory"));
57 QString source = data.readAll(&error);
58 if (!error.isEmpty()) {
63 QQmlRefPointer<QV4::CompiledData::CompilationUnit> unit;
66 QList<QQmlJS::DiagnosticMessage> diagnostics;
67 unit = QV4::Compiler::Codegen::compileModule(
68 m_typeLoader->isDebugging(), urlString(), source, data.sourceTimeStamp(),
70 QList<QQmlError> errors = QQmlEnginePrivate::qmlErrorFromDiagnostics(urlString(), diagnostics);
71 if (!errors.isEmpty()) {
76 QmlIR::Document irUnit(urlString(), finalUrlString(), m_typeLoader->isDebugging());
78 irUnit.jsModule.sourceTimeStamp = data.sourceTimeStamp();
80 QmlIR::ScriptDirectivesCollector collector(&irUnit);
81 irUnit.jsParserEngine.setDirectives(&collector);
83 QList<QQmlError> errors;
84 const QString fragment = finalUrl().fragment();
85 irUnit.javaScriptCompilationUnit = QV4::Script::precompile(
86 &irUnit.jsModule, &irUnit.jsParserEngine, &irUnit.jsGenerator, urlString(),
87 source, &errors, fragment == QLatin1String(
"global")
88 ? QV4::Compiler::ContextType::Global
89 : QV4::Compiler::ContextType::ScriptImportedByQML,
90 fragment == QLatin1String(
"include")
91 ? QV4::Script::InheritContext::Yes
92 : QV4::Script::InheritContext::No);
95 if (!errors.isEmpty()) {
100 QmlIR::QmlUnitGenerator qmlGenerator;
101 qmlGenerator.generate(irUnit);
102 unit = std::move(irUnit.javaScriptCompilationUnit);
105 if (m_typeLoader->writeCacheFile()) {
107 const auto sourceChecksum = [&data]() {
return data.checksum(); };
108 if (unit->saveToDisk(url(), sourceChecksum, &errorString)) {
110 if (!unit->loadFromDisk(url(), data.sourceTimeStamp(), sourceChecksum, &error)) {
112 qCDebug(DBG_DISK_CACHE()) <<
"Error re-loading cached version of"
113 << unit->fileName() <<
"from disk:" << errorString;
116 qCDebug(DBG_DISK_CACHE()) <<
"Error saving cached version of"
117 << unit->fileName() <<
"to disk:" << errorString;
121 initializeFromCompilationUnit(std::move(unit));
124void QQmlScriptBlob::initializeFromCachedUnit(
const QQmlPrivate::CachedQmlUnit *cachedUnit)
126 assertTypeLoaderThread();
127 initializeFromCompilationUnit(QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>(
128 cachedUnit->qmlData, cachedUnit->aotCompiledFunctions,
129 cachedUnit->validateLookupSignatures, urlString(), finalUrlString()));
132void QQmlScriptBlob::done()
134 assertTypeLoaderThread();
140 for (
int ii = 0; ii < m_scripts.size(); ++ii) {
141 const ScriptReference &script = m_scripts.at(ii);
146 if (script.script->isError()) {
147 QList<QQmlError> errors = script.script->errors();
150 error.setLine(qmlConvertSourceCoordinate<quint32,
int>(script.location.line()));
151 error.setColumn(qmlConvertSourceCoordinate<quint32,
int>(script.location.column()));
152 error.setDescription(QQmlTypeLoader::tr(
"Script %1 unavailable").arg(script.script->urlString()));
153 errors.prepend(error);
160 m_scriptData->typeNameCache.adopt(
new QQmlTypeNameCache(m_importCache));
164 for (
int scriptIndex = 0; scriptIndex < m_scripts.size(); ++scriptIndex) {
165 const ScriptReference &script = m_scripts.at(scriptIndex);
167 m_scriptData->scripts.append(script.script->scriptData());
169 if (!script.nameSpace.isNull()) {
170 if (!ns.contains(script.nameSpace)) {
171 ns.insert(script.nameSpace);
172 m_scriptData->typeNameCache->add(script.nameSpace);
175 m_scriptData->typeNameCache->add(script.qualifier, scriptIndex, script.nameSpace);
178 m_importCache->populateCache(m_scriptData->typeNameCache.data());
181 if (
auto cu = m_scriptData->compilationUnit()) {
182 cu->qmlType = QQmlMetaType::findCompositeType(url(), cu, QQmlMetaType::JavaScript);
183 for (
const auto &script : std::as_const(m_scripts))
184 cu->dependentScripts.append(script.script->scriptData());
185 QQmlMetaType::registerInternalCompositeType(cu);