diff options
Diffstat (limited to 'src/qmlcompiler')
-rw-r--r-- | src/qmlcompiler/qqmljscompiler.cpp | 13 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljscompiler_p.h | 4 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/qmlcompiler/qqmljscompiler.cpp b/src/qmlcompiler/qqmljscompiler.cpp index d508b290bd..938d1d68d6 100644 --- a/src/qmlcompiler/qqmljscompiler.cpp +++ b/src/qmlcompiler/qqmljscompiler.cpp @@ -40,6 +40,8 @@ Q_LOGGING_CATEGORY(lcAotCompiler, "qml.compiler.aot", QtWarningMsg); QT_BEGIN_NAMESPACE +static const int FileScopeCodeIndex = -1; + static QSet<QString> getIllegalNames() { QSet<QString> illegalNames; @@ -216,6 +218,8 @@ bool qCompileQmlFile(const QString &inputFileName, QQmlJSSaveFunction saveFuncti aotCompiler->setScopeObject(object); + aotFunctionsByIndex[FileScopeCodeIndex] = aotCompiler->globalCode(); + std::for_each(object->bindingsBegin(), object->bindingsEnd(), [&](const QmlIR::Binding &binding) { switch (binding.type) { @@ -381,10 +385,7 @@ bool qSaveQmlJSUnitAsCpp(const QString &inputFileName, const QString &outputFile return false; if (!aotFunctions.isEmpty()) { - QStringList includes = { - QStringLiteral("QtQml/qqmlcontext.h"), - QStringLiteral("type_traits") - }; + QStringList includes; for (const auto &function : aotFunctions) includes.append(function.includes); @@ -435,6 +436,7 @@ bool qSaveQmlJSUnitAsCpp(const QString &inputFileName, const QString &outputFile if (aotFunctions.isEmpty()) { writeStr("extern const QQmlPrivate::AOTCompiledFunction aotBuiltFunctions[] = { { 0, QMetaType::fromType<void>(), nullptr } };"); } else { + writeStr(aotFunctions[FileScopeCodeIndex].code.toUtf8().constData()); writeStr(R"(template <typename Binding> void wrapCall(QQmlContext *context, QObject *scopeObject, void *dataPtr, Binding &&binding) { using return_type = std::invoke_result_t<Binding, QQmlContext*, QObject*>; @@ -458,6 +460,9 @@ bool qSaveQmlJSUnitAsCpp(const QString &inputFileName, const QString &outputFile end = aotFunctions.constEnd(); func != end; ++func) { + if (func.key() == FileScopeCodeIndex) + continue; + QString function = header + func.value().code + footer; writeStr(QStringLiteral("{ %1, QMetaType::fromType<%2>(), %3 },") diff --git a/src/qmlcompiler/qqmljscompiler_p.h b/src/qmlcompiler/qqmljscompiler_p.h index f750fadbf4..6d40c28cc2 100644 --- a/src/qmlcompiler/qqmljscompiler_p.h +++ b/src/qmlcompiler/qqmljscompiler_p.h @@ -77,10 +77,12 @@ public: virtual void setScopeObject(const QmlIR::Object *object) = 0; virtual std::variant<QQmlJSAotFunction, QQmlJS::DiagnosticMessage> compileBinding( const QmlIR::Binding &binding) = 0; + + virtual QQmlJSAotFunction globalCode() const = 0; }; -using QQmlJSAotFunctionMap = QMap<uint, QQmlJSAotFunction>; +using QQmlJSAotFunctionMap = QMap<int, QQmlJSAotFunction>; using QQmlJSSaveFunction = std::function<bool(const QV4::CompiledData::SaveableUnitPointer &, const QQmlJSAotFunctionMap &, QString *)>; |