diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2024-01-05 15:25:39 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-01-11 00:42:17 +0100 |
commit | 809292e9b801fb5eb47dd7049bddc0fd776ab872 (patch) | |
tree | 01a772029dc20293dd278476f7347b0d064df36e | |
parent | 7a9a778604a03473b6c4ef8a481ba3cc06d48265 (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.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 17 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit_p.h | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 7 | ||||
-rw-r--r-- | src/qml/qml/qqmlscriptblob.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmltypedata.cpp | 6 | ||||
-rw-r--r-- | tools/qmljs/qmljs.cpp | 3 |
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; } |