diff options
-rw-r--r-- | src/qml/common/qv4compileddata_p.h | 13 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit.cpp | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmldatablob_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlprivate.h | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlscriptblob.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmltypedata.cpp | 2 |
8 files changed, 37 insertions, 5 deletions
diff --git a/src/qml/common/qv4compileddata_p.h b/src/qml/common/qv4compileddata_p.h index 232ac9c3c3..152c70f107 100644 --- a/src/qml/common/qv4compileddata_p.h +++ b/src/qml/common/qv4compileddata_p.h @@ -85,6 +85,10 @@ class QQmlTypeNameCache; class QQmlType; class QQmlEngine; +namespace QQmlPrivate { +struct AOTCompiledFunction; +} + namespace QmlIR { struct Document; } @@ -1202,6 +1206,7 @@ struct CompilationUnit : public CompilationUnitBase const Unit *data = nullptr; const QmlUnit *qmlData = nullptr; QStringList dynamicStrings; + const QQmlPrivate::AOTCompiledFunction *aotCompiledFunctions = nullptr; public: using CompiledObject = CompiledData::Object; @@ -1211,6 +1216,13 @@ public: setUnitData(unitData, nullptr, fileName, finalUrlString); } + explicit CompilationUnit(const Unit *unitData, const QQmlPrivate::AOTCompiledFunction *aotCompiledFunctions, + const QString &fileName = QString(), const QString &finalUrlString = QString()) + : CompilationUnit(unitData, fileName, finalUrlString) + { + this->aotCompiledFunctions = aotCompiledFunctions; + } + ~CompilationUnit() { if (data) { @@ -1244,6 +1256,7 @@ public: qmlData = other.qmlData; other.qmlData = nullptr; dynamicStrings = std::move(other.dynamicStrings); + aotCompiledFunctions = other.aotCompiledFunctions; other.dynamicStrings.clear(); m_fileName = std::move(other.m_fileName); other.m_fileName.clear(); diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index dc94129cb0..fec1524667 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -1920,7 +1920,7 @@ QQmlRefPointer<ExecutableCompilationUnit> ExecutionEngine::compileModule(const Q QQmlMetaType::CachedUnitLookupError cacheError = QQmlMetaType::CachedUnitLookupError::NoError; if (const QQmlPrivate::CachedQmlUnit *cachedUnit = QQmlMetaType::findCachedCompilationUnit(url, &cacheError)) { return ExecutableCompilationUnit::create( - QV4::CompiledData::CompilationUnit(cachedUnit->qmlData, url.fileName(), url.toString())); + QV4::CompiledData::CompilationUnit(cachedUnit->qmlData, cachedUnit->aotCompiledFunctions, url.fileName(), url.toString())); } QFile f(QQmlFile::urlToLocalFileOrQrc(url)); diff --git a/src/qml/jsruntime/qv4executablecompilationunit.cpp b/src/qml/jsruntime/qv4executablecompilationunit.cpp index 47357bea49..94fa3e0fbf 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit.cpp +++ b/src/qml/jsruntime/qv4executablecompilationunit.cpp @@ -37,6 +37,7 @@ ** ****************************************************************************/ +#include "qml/qqmlprivate.h" #include "qv4executablecompilationunit_p.h" #include <private/qv4engine_p.h> @@ -208,9 +209,20 @@ QV4::Function *ExecutableCompilationUnit::linkToEngine(ExecutionEngine *engine) } runtimeFunctions.resize(data->functionTableSize); + const QQmlPrivate::AOTCompiledFunction *aotFunction = aotCompiledFunctions; for (int i = 0 ;i < runtimeFunctions.size(); ++i) { const QV4::CompiledData::Function *compiledFunction = data->functionAt(i); runtimeFunctions[i] = QV4::Function::create(engine, this, compiledFunction); + if (aotFunction) { + if (aotFunction->functionPtr) { + if (aotFunction->index == i) { + runtimeFunctions[i]->jittedCode = aotFunction->functionPtr; + ++aotFunction; + } + } else { + aotFunction = nullptr; + } + } } Scope scope(engine); diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index 56a81578b6..7fa3544e5a 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -230,7 +230,7 @@ Script *Script::createFromFileOrCache(ExecutionEngine *engine, QmlContext *qmlCo if (const QQmlPrivate::CachedQmlUnit *cachedUnit = QQmlMetaType::findCachedCompilationUnit(originalUrl, &cacheError)) { QQmlRefPointer<QV4::ExecutableCompilationUnit> jsUnit = QV4::ExecutableCompilationUnit::create( - QV4::CompiledData::CompilationUnit(cachedUnit->qmlData)); + QV4::CompiledData::CompilationUnit(cachedUnit->qmlData, cachedUnit->aotCompiledFunctions)); return new QV4::Script(engine, qmlContext, jsUnit); } diff --git a/src/qml/qml/qqmldatablob_p.h b/src/qml/qml/qqmldatablob_p.h index d8a1ee88a3..87e31a38f9 100644 --- a/src/qml/qml/qqmldatablob_p.h +++ b/src/qml/qml/qqmldatablob_p.h @@ -59,6 +59,7 @@ #include <QtNetwork/qnetworkreply.h> #endif +#include <QtQml/qqmlprivate.h> #include <QtQml/qqmlerror.h> #include <QtQml/qqmlabstracturlinterceptor.h> #include <QtQml/qqmlprivate.h> diff --git a/src/qml/qml/qqmlprivate.h b/src/qml/qml/qqmlprivate.h index 78d6d05291..cc1a14d24b 100644 --- a/src/qml/qml/qqmlprivate.h +++ b/src/qml/qml/qqmlprivate.h @@ -84,6 +84,7 @@ namespace CompiledData { struct Unit; struct CompilationUnit; } +struct CppStackFrame; } namespace QmlIR { struct Document; @@ -450,9 +451,14 @@ namespace QQmlPrivate const char *typeName; }; + struct AOTCompiledFunction { + int index; + quint64 (*functionPtr)(QV4::CppStackFrame *, QV4::ExecutionEngine *); + }; + struct CachedQmlUnit { const QV4::CompiledData::Unit *qmlData; - void *unused1; + const AOTCompiledFunction *aotCompiledFunctions; void *unused2; }; diff --git a/src/qml/qml/qqmlscriptblob.cpp b/src/qml/qml/qqmlscriptblob.cpp index 32644a06f9..4ca506a926 100644 --- a/src/qml/qml/qqmlscriptblob.cpp +++ b/src/qml/qml/qqmlscriptblob.cpp @@ -153,7 +153,7 @@ void QQmlScriptBlob::dataReceived(const SourceCodeData &data) void QQmlScriptBlob::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit) { initializeFromCompilationUnit(QV4::ExecutableCompilationUnit::create( - QV4::CompiledData::CompilationUnit(unit->qmlData, urlString(), finalUrlString()))); + QV4::CompiledData::CompilationUnit(unit->qmlData, unit->aotCompiledFunctions, urlString(), finalUrlString()))); } void QQmlScriptBlob::done() diff --git a/src/qml/qml/qqmltypedata.cpp b/src/qml/qml/qqmltypedata.cpp index 6a4f965a26..3b50027c4f 100644 --- a/src/qml/qml/qqmltypedata.cpp +++ b/src/qml/qml/qqmltypedata.cpp @@ -608,7 +608,7 @@ void QQmlTypeData::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *un loader.load(); m_document->jsModule.fileName = urlString(); m_document->jsModule.finalUrl = finalUrlString(); - m_document->javaScriptCompilationUnit = QV4::CompiledData::CompilationUnit(unit->qmlData); + m_document->javaScriptCompilationUnit = QV4::CompiledData::CompilationUnit(unit->qmlData, unit->aotCompiledFunctions); continueLoadFromIR(); } |