From 08058326f04e9b5e55c903b3702405a8d3556ac6 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Wed, 25 Mar 2026 00:16:36 -0700 Subject: [PATCH] core: reuse global pragma parsing js engine during scanning QJSEngine cleanup is not fast or clean and results in speed degradation over time if too many are destroyed. --- src/core/scan.cpp | 15 +++++++++++---- src/core/scan.hpp | 3 +++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/core/scan.cpp b/src/core/scan.cpp index 58da38c..3605c52 100644 --- a/src/core/scan.cpp +++ b/src/core/scan.cpp @@ -145,10 +145,7 @@ bool QmlScanner::scanQmlFile(const QString& path, bool& singleton, bool& interna QString overrideText; bool isOverridden = false; - auto pragmaEngine = QJSEngine(); - pragmaEngine.globalObject().setPrototype( - pragmaEngine.newQObject(new qs::scan::env::PreprocEnv()) - ); + auto& pragmaEngine = *QmlScanner::preprocEngine(); auto postError = [&, this](QString error) { this->scanErrors.append({.file = path, .message = std::move(error), .line = lineNum}); @@ -370,3 +367,13 @@ QPair QmlScanner::jsonToQml(const QJsonValue& value, int inden return qMakePair(QStringLiteral("var"), "null"); } } + +QJSEngine* QmlScanner::preprocEngine() { + static auto* engine = [] { + auto* engine = new QJSEngine(); + engine->globalObject().setPrototype(engine->newQObject(new qs::scan::env::PreprocEnv())); + return engine; + }(); + + return engine; +} diff --git a/src/core/scan.hpp b/src/core/scan.hpp index 26034e1..7d807e1 100644 --- a/src/core/scan.hpp +++ b/src/core/scan.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -42,4 +43,6 @@ private: bool scanQmlFile(const QString& path, bool& singleton, bool& internal); bool scanQmlJson(const QString& path); [[nodiscard]] static QPair jsonToQml(const QJsonValue& value, int indent = 0); + + static QJSEngine* preprocEngine(); };