aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/common/qv4compileddata_p.h13
-rw-r--r--src/qml/jsruntime/qv4engine.cpp2
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit.cpp12
-rw-r--r--src/qml/jsruntime/qv4script.cpp2
-rw-r--r--src/qml/qml/qqmldatablob_p.h1
-rw-r--r--src/qml/qml/qqmlprivate.h8
-rw-r--r--src/qml/qml/qqmlscriptblob.cpp2
-rw-r--r--src/qml/qml/qqmltypedata.cpp2
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();
}