aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2024-01-05 15:25:39 +0100
committerUlf Hermann <ulf.hermann@qt.io>2024-01-11 00:42:17 +0100
commit809292e9b801fb5eb47dd7049bddc0fd776ab872 (patch)
tree01a772029dc20293dd278476f7347b0d064df36e
parent7a9a778604a03473b6c4ef8a481ba3cc06d48265 (diff)
QtQml: Move creation of ExecutableCompilationUnit into engine
This is in preparation for letting the engine cache the executable CUs. Change-Id: Ideac10d8dda0784b41304b58f9b9fbd106173ea6 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp17
-rw-r--r--src/qml/jsruntime/qv4engine_p.h10
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit.cpp4
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit_p.h12
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4script.cpp7
-rw-r--r--src/qml/qml/qqmlscriptblob.cpp5
-rw-r--r--src/qml/qml/qqmltypedata.cpp6
-rw-r--r--tools/qmljs/qmljs.cpp3
10 files changed, 41 insertions, 27 deletions
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp
index 79ca13b37b..4bfe758c34 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp
@@ -232,7 +232,7 @@ GatherSourcesJob::GatherSourcesJob(QV4::ExecutionEngine *engine)
void GatherSourcesJob::run()
{
- for (QV4::ExecutableCompilationUnit *unit : engine->compilationUnits) {
+ for (QV4::ExecutableCompilationUnit *unit : engine->compilationUnits()) {
QString fileName = unit->fileName();
if (!fileName.isEmpty())
sources.append(fileName);
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 6b01e83bdf..0314b6d997 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -860,8 +860,8 @@ ExecutionEngine::~ExecutionEngine()
delete memoryManager;
// Take a temporary reference to the CU so that it doesn't disappear during unlinking.
- while (!compilationUnits.isEmpty()) {
- QQmlRefPointer<ExecutableCompilationUnit> cu(*compilationUnits.begin());
+ while (!m_compilationUnits.isEmpty()) {
+ QQmlRefPointer<ExecutableCompilationUnit> cu(*m_compilationUnits.begin());
Q_ASSERT(cu->engine == this);
cu->clear();
cu->engine = nullptr;
@@ -1330,7 +1330,7 @@ void ExecutionEngine::markObjects(MarkStack *markStack)
identifierTable->markObjects(markStack);
- for (auto compilationUnit: compilationUnits)
+ for (const auto &compilationUnit : m_compilationUnits)
compilationUnit->markObjects(markStack);
}
@@ -2079,11 +2079,10 @@ QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::compileModule(const Q
: QQmlMetaType::RequireFullyTyped,
&cacheError)
: nullptr) {
- return ExecutableCompilationUnit::create(
+ return executableCompilationUnit(
QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>(
cachedUnit->qmlData, cachedUnit->aotCompiledFunctions, url.fileName(),
- url.toString()),
- this);
+ url.toString()));
}
QFile f(QQmlFile::urlToLocalFileOrQrc(url));
@@ -2117,6 +2116,12 @@ QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::compileModule(
}
}
+ return executableCompilationUnit(std::move(unit));
+}
+
+QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::executableCompilationUnit(
+ QQmlRefPointer<CompiledData::CompilationUnit> &&unit)
+{
return ExecutableCompilationUnit::create(std::move(unit), this);
}
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index f0d9ecf143..fc4940d006 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -496,7 +496,10 @@ public:
Symbol *symbol_unscopables() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_unscopables); }
Symbol *symbol_revokableProxy() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_revokableProxy); }
- QIntrusiveList<ExecutableCompilationUnit, &ExecutableCompilationUnit::nextCompilationUnit> compilationUnits;
+ using CompilationUnitList = QIntrusiveList<
+ ExecutableCompilationUnit, &ExecutableCompilationUnit::nextCompilationUnit>;
+ CompilationUnitList &compilationUnits() { return m_compilationUnits; }
+ const CompilationUnitList &compilationUnits() const { return m_compilationUnits; }
quint32 m_engineId;
@@ -755,6 +758,9 @@ public:
QQmlRefPointer<ExecutableCompilationUnit> compileModule(
const QUrl &url, const QString &sourceCode, const QDateTime &sourceTimeStamp);
+ QQmlRefPointer<ExecutableCompilationUnit> executableCompilationUnit(
+ QQmlRefPointer<QV4::CompiledData::CompilationUnit> &&unit);
+
void injectCompiledModule(const QQmlRefPointer<ExecutableCompilationUnit> &moduleUnit);
QV4::Value *registerNativeModule(const QUrl &url, const QV4::Value &module);
@@ -878,6 +884,8 @@ private:
// Instead, we allocate a raw pointer using the same manual memory management
// technique in QV4::PersistentValue.
QHash<QUrl, Value *> nativeModules;
+
+ CompilationUnitList m_compilationUnits;
};
#define CHECK_STACK_LIMITS(v4) \
diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp
index 7f44182a57..9c67b05e3e 100644
--- a/src/qml/jsruntime/qv4executablecompilationunit.cpp
+++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp
@@ -288,7 +288,7 @@ void ExecutableCompilationUnit::clear()
runtimeClasses = nullptr;
}
-void ExecutableCompilationUnit::markObjects(QV4::MarkStack *markStack)
+void ExecutableCompilationUnit::markObjects(QV4::MarkStack *markStack) const
{
const CompiledData::Unit *data = m_compilationUnit->data;
@@ -371,7 +371,7 @@ QQmlRefPointer<ExecutableCompilationUnit> ExecutableCompilationUnit::create(
new ExecutableCompilationUnit(std::move(compilationUnit)),
QQmlRefPointer<ExecutableCompilationUnit>::Adopt);
result->engine = engine;
- engine->compilationUnits.insert(result.data());
+ engine->compilationUnits().insert(result.data());
return result;
}
diff --git a/src/qml/jsruntime/qv4executablecompilationunit_p.h b/src/qml/jsruntime/qv4executablecompilationunit_p.h
index 4f79f12030..b4379707f3 100644
--- a/src/qml/jsruntime/qv4executablecompilationunit_p.h
+++ b/src/qml/jsruntime/qv4executablecompilationunit_p.h
@@ -99,10 +99,6 @@ public:
friend class QQmlRefCounted<ExecutableCompilationUnit>;
friend class QQmlRefPointer<ExecutableCompilationUnit>;
- static QQmlRefPointer<ExecutableCompilationUnit> create(
- QQmlRefPointer<CompiledData::CompilationUnit> &&compilationUnit,
- ExecutionEngine *engine);
-
QIntrusiveListNode nextCompilationUnit;
ExecutionEngine *engine = nullptr;
@@ -289,7 +285,7 @@ public:
void evaluate();
void evaluateModuleRequests();
- void markObjects(MarkStack *markStack);
+ void markObjects(MarkStack *markStack) const;
QString bindingValueAsString(const CompiledData::Binding *binding) const;
double bindingValueAsNumber(const CompiledData::Binding *binding) const
@@ -344,6 +340,8 @@ protected:
{ return unitData()->stringTableSize; }
private:
+ friend struct ExecutionEngine;
+
QQmlRefPointer<CompiledData::CompilationUnit> m_compilationUnit;
Heap::Module *m_module = nullptr;
@@ -360,6 +358,10 @@ private:
ExecutableCompilationUnit(QQmlRefPointer<CompiledData::CompilationUnit> &&compilationUnit);
~ExecutableCompilationUnit();
+ static QQmlRefPointer<ExecutableCompilationUnit> create(
+ QQmlRefPointer<CompiledData::CompilationUnit> &&compilationUnit,
+ ExecutionEngine *engine);
+
const Value *resolveExportRecursively(QV4::String *exportName,
QVector<ResolveSetEntry> *resolveSet);
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index aff4a02115..e7d25d55f4 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -256,7 +256,7 @@ QQmlRefPointer<ExecutableCompilationUnit> FunctionCtor::parse(ExecutionEngine *e
if (engine->hasException)
return nullptr;
- return ExecutableCompilationUnit::create(cg.generateCompilationUnit(), engine);
+ return engine->executableCompilationUnit(cg.generateCompilationUnit());
}
ReturnedValue FunctionCtor::virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *newTarget)
diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp
index 4fee617c7f..c68c869ae3 100644
--- a/src/qml/jsruntime/qv4script.cpp
+++ b/src/qml/jsruntime/qv4script.cpp
@@ -94,8 +94,7 @@ void Script::parse()
if (v4->hasException)
return;
- compilationUnit = QV4::ExecutableCompilationUnit::create(
- cg.generateCompilationUnit(), v4);
+ compilationUnit = v4->executableCompilationUnit(cg.generateCompilationUnit());
vmFunction = compilationUnit->rootFunction();
}
@@ -198,9 +197,9 @@ Script *Script::createFromFileOrCache(ExecutionEngine *engine, QmlContext *qmlCo
&cacheError)
: nullptr) {
QQmlRefPointer<QV4::ExecutableCompilationUnit> jsUnit
- = QV4::ExecutableCompilationUnit::create(
+ = engine->executableCompilationUnit(
QQml::makeRefPointer<QV4::CompiledData::CompilationUnit>(
- cachedUnit->qmlData, cachedUnit->aotCompiledFunctions), engine);
+ cachedUnit->qmlData, cachedUnit->aotCompiledFunctions));
return new QV4::Script(engine, qmlContext, jsUnit);
}
diff --git a/src/qml/qml/qqmlscriptblob.cpp b/src/qml/qml/qqmlscriptblob.cpp
index 89f9eee1cd..9b6badeb70 100644
--- a/src/qml/qml/qqmlscriptblob.cpp
+++ b/src/qml/qml/qqmlscriptblob.cpp
@@ -201,8 +201,9 @@ void QQmlScriptBlob::initializeFromCompilationUnit(
m_scriptData.adopt(new QQmlScriptData());
m_scriptData->url = finalUrl();
m_scriptData->urlString = finalUrlString();
- m_scriptData->m_precompiledScript = QV4::ExecutableCompilationUnit::create(
- std::move(unit), QQmlEnginePrivate::getV4Engine(typeLoader()->engine()));
+ m_scriptData->m_precompiledScript
+ = QQmlEnginePrivate::getV4Engine(typeLoader()->engine())->executableCompilationUnit(
+ std::move(unit));
m_importCache->setBaseUrl(finalUrl(), finalUrlString());
diff --git a/src/qml/qml/qqmltypedata.cpp b/src/qml/qml/qqmltypedata.cpp
index 9be9f323e4..3c306953e1 100644
--- a/src/qml/qml/qqmltypedata.cpp
+++ b/src/qml/qml/qqmltypedata.cpp
@@ -104,7 +104,7 @@ bool QQmlTypeData::tryLoadFromDiskCache()
return true;
}
- m_compiledData = QV4::ExecutableCompilationUnit::create(std::move(unit), v4);
+ m_compiledData = v4->executableCompilationUnit(std::move(unit));
QVector<QV4::CompiledData::InlineComponent> ics;
for (int i = 0, count = m_compiledData->objectCount(); i < count; ++i) {
@@ -842,8 +842,8 @@ void QQmlTypeData::compile(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCach
}
}
- m_compiledData = QV4::ExecutableCompilationUnit::create(
- std::move(compilationUnit), enginePrivate->v4engine());
+ m_compiledData = enginePrivate->v4engine()->executableCompilationUnit(
+ std::move(compilationUnit));
m_compiledData->typeNameCache = typeNameCache;
m_compiledData->resolvedTypes = *resolvedTypeCache;
m_compiledData->propertyCaches = std::move(*compiler.propertyCaches());
diff --git a/tools/qmljs/qmljs.cpp b/tools/qmljs/qmljs.cpp
index 99de7f528c..d6b4d1666b 100644
--- a/tools/qmljs/qmljs.cpp
+++ b/tools/qmljs/qmljs.cpp
@@ -124,8 +124,7 @@ int main(int argc, char *argv[])
QString error;
if (unit->loadFromDisk(QUrl::fromLocalFile(fn), QFileInfo(fn).lastModified(), &error)) {
script.reset(new QV4::Script(
- &vm, nullptr, QV4::ExecutableCompilationUnit::create(
- std::move(unit), &vm)));
+ &vm, nullptr, vm.executableCompilationUnit(std::move(unit))));
} else {
std::cout << "Error loading" << qPrintable(fn) << "from disk cache:" << qPrintable(error) << std::endl;
}