From a8b3536d6e5e7eb1c51fb20df071185dbce317a2 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 8 May 2019 13:29:50 +0200 Subject: Move compileModule() into qv4codegen.cpp This is a better fit for the method. In turn, remove all the V4_BOOTSTRAP conditions from qv4engine_p.h and make sure we don't include or compile it in bootstrap mode. Change-Id: I5933b0724e561313ca20c420b83e4d70e63bddf5 Reviewed-by: Simon Hausmann --- tools/qmlcachegen/qmlcachegen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/qmlcachegen/qmlcachegen.cpp b/tools/qmlcachegen/qmlcachegen.cpp index df7468eaef..bf0bcaf04e 100644 --- a/tools/qmlcachegen/qmlcachegen.cpp +++ b/tools/qmlcachegen/qmlcachegen.cpp @@ -262,7 +262,8 @@ static bool compileJSFile(const QString &inputFileName, const QString &inputFile QList diagnostics; // Precompiled files are relocatable and the final location will be set when loading. QString url; - unit = QV4::ExecutionEngine::compileModule(/*debugMode*/false, url, sourceCode, QDateTime(), &diagnostics); + unit = QV4::Compiler::Codegen::compileModule(/*debugMode*/false, url, sourceCode, + QDateTime(), &diagnostics); error->appendDiagnostics(inputFileName, diagnostics); if (!unit) return false; -- cgit v1.2.3 From 7f7d87c68da4cb29b2b2b9c324c6863228da0c26 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 7 May 2019 12:47:33 +0200 Subject: Split CompiledData::CompilationUnit in two We need a CompilationUnit that only holds the data needed for compilation and another one that is executable by the runtime. Change-Id: I704d859ba028576a18460f5e3a59f210f64535d3 Reviewed-by: Simon Hausmann --- tools/qmlcachegen/qmlcachegen.cpp | 30 +++++++++++++++++------------- tools/qmljs/qmljs.cpp | 3 ++- 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'tools') diff --git a/tools/qmlcachegen/qmlcachegen.cpp b/tools/qmlcachegen/qmlcachegen.cpp index bf0bcaf04e..63be5c5ec4 100644 --- a/tools/qmlcachegen/qmlcachegen.cpp +++ b/tools/qmlcachegen/qmlcachegen.cpp @@ -169,7 +169,7 @@ static bool checkArgumentsObjectUseInSignalHandlers(const QmlIR::Document &doc, return true; } -using SaveFunction = std::function &, QString *)>; +using SaveFunction = std::function; static bool compileQmlFile(const QString &inputFileName, SaveFunction saveFunction, Error *error) { @@ -229,7 +229,7 @@ static bool compileQmlFile(const QString &inputFileName, SaveFunction saveFuncti QmlIR::QmlUnitGenerator generator; irDocument.javaScriptCompilationUnit = v4CodeGen.generateCompilationUnit(/*generate unit*/false); generator.generate(irDocument); - QV4::CompiledData::Unit *unit = const_cast(irDocument.javaScriptCompilationUnit->data); + QV4::CompiledData::Unit *unit = const_cast(irDocument.javaScriptCompilationUnit.data); unit->flags |= QV4::CompiledData::Unit::StaticData; unit->flags |= QV4::CompiledData::Unit::PendingTypeCompilation; @@ -241,7 +241,7 @@ static bool compileQmlFile(const QString &inputFileName, SaveFunction saveFuncti static bool compileJSFile(const QString &inputFileName, const QString &inputFileUrl, SaveFunction saveFunction, Error *error) { - QQmlRefPointer unit; + QV4::CompiledData::CompilationUnit unit; QString sourceCode; { @@ -265,7 +265,7 @@ static bool compileJSFile(const QString &inputFileName, const QString &inputFile unit = QV4::Compiler::Codegen::compileModule(/*debugMode*/false, url, sourceCode, QDateTime(), &diagnostics); error->appendDiagnostics(inputFileName, diagnostics); - if (!unit) + if (!unit.unitData()) return false; } else { QmlIR::Document irDocument(/*debugMode*/false); @@ -321,9 +321,9 @@ static bool compileJSFile(const QString &inputFileName, const QString &inputFile irDocument.javaScriptCompilationUnit = v4CodeGen.generateCompilationUnit(/*generate unit*/false); QmlIR::QmlUnitGenerator generator; generator.generate(irDocument); - QV4::CompiledData::Unit *unitData = const_cast(irDocument.javaScriptCompilationUnit->data); + QV4::CompiledData::Unit *unitData = const_cast(irDocument.javaScriptCompilationUnit.data); unitData->flags |= QV4::CompiledData::Unit::StaticData; - unit = irDocument.javaScriptCompilationUnit; + unit = std::move(irDocument.javaScriptCompilationUnit); } } @@ -331,7 +331,8 @@ static bool compileJSFile(const QString &inputFileName, const QString &inputFile } static bool saveUnitAsCpp(const QString &inputFileName, const QString &outputFileName, - const QQmlRefPointer &unit, QString *errorString) + const QV4::CompiledData::CompilationUnit &unit, + QString *errorString) { QSaveFile f(outputFileName); if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { @@ -368,8 +369,8 @@ static bool saveUnitAsCpp(const QString &inputFileName, const QString &outputFil QByteArray hexifiedData; { QByteArray modifiedUnit; - modifiedUnit.resize(unit->data->unitSize); - memcpy(modifiedUnit.data(), unit->data, unit->data->unitSize); + modifiedUnit.resize(unit.data->unitSize); + memcpy(modifiedUnit.data(), unit.data, unit.data->unitSize); const char *dataPtr = modifiedUnit.data(); QV4::CompiledData::Unit *unitPtr; memcpy(&unitPtr, &dataPtr, sizeof(unitPtr)); @@ -377,7 +378,7 @@ static bool saveUnitAsCpp(const QString &inputFileName, const QString &outputFil QTextStream stream(&hexifiedData); const uchar *begin = reinterpret_cast(modifiedUnit.constData()); - const uchar *end = begin + unit->data->unitSize; + const uchar *end = begin + unit.data->unitSize; stream << hex; int col = 0; for (const uchar *data = begin; data < end; ++data, ++col) { @@ -525,13 +526,16 @@ int main(int argc, char **argv) inputFileUrl = QStringLiteral("qrc://") + inputResourcePath; - saveFunction = [inputResourcePath, outputFileName](const QQmlRefPointer &unit, QString *errorString) { + saveFunction = [inputResourcePath, outputFileName]( + const QV4::CompiledData::CompilationUnit &unit, + QString *errorString) { return saveUnitAsCpp(inputResourcePath, outputFileName, unit, errorString); }; } else { - saveFunction = [outputFileName](const QQmlRefPointer &unit, QString *errorString) { - return unit->saveToDisk(outputFileName, errorString); + saveFunction = [outputFileName](const QV4::CompiledData::CompilationUnit &unit, + QString *errorString) { + return unit.saveToDisk(outputFileName, errorString); }; } diff --git a/tools/qmljs/qmljs.cpp b/tools/qmljs/qmljs.cpp index 4b581fff05..ba5e5f553c 100644 --- a/tools/qmljs/qmljs.cpp +++ b/tools/qmljs/qmljs.cpp @@ -137,7 +137,8 @@ int main(int argc, char *argv[]) } QScopedPointer script; if (cache && QFile::exists(fn + QLatin1Char('c'))) { - QQmlRefPointer unit = QV4::Compiler::Codegen::createUnitForLoading(); + QQmlRefPointer unit + = QV4::ExecutableCompilationUnit::create(); QString error; if (unit->loadFromDisk(QUrl::fromLocalFile(fn), QFileInfo(fn).lastModified(), &error)) { script.reset(new QV4::Script(&vm, nullptr, unit)); -- cgit v1.2.3 From ae1c2375f596258c878933adc46a19a541a43a6c Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 13 May 2019 11:07:39 +0200 Subject: Add abstraction for temporarily setting StaticData when saving The StaticData flag needs to be saved to disk, but removed again afterwards so that we can free() the malloc'd data. This also allows us to avoid copying all the data into a byte array before saving. Change-Id: I96513f8d98acf0ea0b4514d96376b487e8444917 Reviewed-by: Simon Hausmann --- tools/qmlcachegen/qmlcachegen.cpp | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) (limited to 'tools') diff --git a/tools/qmlcachegen/qmlcachegen.cpp b/tools/qmlcachegen/qmlcachegen.cpp index 63be5c5ec4..7b4135e1f8 100644 --- a/tools/qmlcachegen/qmlcachegen.cpp +++ b/tools/qmlcachegen/qmlcachegen.cpp @@ -169,7 +169,7 @@ static bool checkArgumentsObjectUseInSignalHandlers(const QmlIR::Document &doc, return true; } -using SaveFunction = std::function; +using SaveFunction = std::function; static bool compileQmlFile(const QString &inputFileName, SaveFunction saveFunction, Error *error) { @@ -229,11 +229,13 @@ static bool compileQmlFile(const QString &inputFileName, SaveFunction saveFuncti QmlIR::QmlUnitGenerator generator; irDocument.javaScriptCompilationUnit = v4CodeGen.generateCompilationUnit(/*generate unit*/false); generator.generate(irDocument); - QV4::CompiledData::Unit *unit = const_cast(irDocument.javaScriptCompilationUnit.data); - unit->flags |= QV4::CompiledData::Unit::StaticData; - unit->flags |= QV4::CompiledData::Unit::PendingTypeCompilation; - if (!saveFunction(irDocument.javaScriptCompilationUnit, &error->message)) + const quint32 saveFlags + = QV4::CompiledData::Unit::StaticData + | QV4::CompiledData::Unit::PendingTypeCompilation; + QV4::CompiledData::SaveableUnitPointer saveable(&irDocument.javaScriptCompilationUnit, + saveFlags); + if (!saveFunction(saveable, &error->message)) return false; } return true; @@ -321,17 +323,15 @@ static bool compileJSFile(const QString &inputFileName, const QString &inputFile irDocument.javaScriptCompilationUnit = v4CodeGen.generateCompilationUnit(/*generate unit*/false); QmlIR::QmlUnitGenerator generator; generator.generate(irDocument); - QV4::CompiledData::Unit *unitData = const_cast(irDocument.javaScriptCompilationUnit.data); - unitData->flags |= QV4::CompiledData::Unit::StaticData; unit = std::move(irDocument.javaScriptCompilationUnit); } } - return saveFunction(unit, &error->message); + return saveFunction(QV4::CompiledData::SaveableUnitPointer(&unit), &error->message); } static bool saveUnitAsCpp(const QString &inputFileName, const QString &outputFileName, - const QV4::CompiledData::CompilationUnit &unit, + const QV4::CompiledData::SaveableUnitPointer &unit, QString *errorString) { QSaveFile f(outputFileName); @@ -368,17 +368,9 @@ static bool saveUnitAsCpp(const QString &inputFileName, const QString &outputFil QByteArray hexifiedData; { - QByteArray modifiedUnit; - modifiedUnit.resize(unit.data->unitSize); - memcpy(modifiedUnit.data(), unit.data, unit.data->unitSize); - const char *dataPtr = modifiedUnit.data(); - QV4::CompiledData::Unit *unitPtr; - memcpy(&unitPtr, &dataPtr, sizeof(unitPtr)); - unitPtr->flags |= QV4::CompiledData::Unit::StaticData; - QTextStream stream(&hexifiedData); - const uchar *begin = reinterpret_cast(modifiedUnit.constData()); - const uchar *end = begin + unit.data->unitSize; + const uchar *begin = unit.data(); + const uchar *end = begin + unit.size(); stream << hex; int col = 0; for (const uchar *data = begin; data < end; ++data, ++col) { @@ -527,15 +519,15 @@ int main(int argc, char **argv) inputFileUrl = QStringLiteral("qrc://") + inputResourcePath; saveFunction = [inputResourcePath, outputFileName]( - const QV4::CompiledData::CompilationUnit &unit, + const QV4::CompiledData::SaveableUnitPointer &unit, QString *errorString) { return saveUnitAsCpp(inputResourcePath, outputFileName, unit, errorString); }; } else { - saveFunction = [outputFileName](const QV4::CompiledData::CompilationUnit &unit, + saveFunction = [outputFileName](const QV4::CompiledData::SaveableUnitPointer &unit, QString *errorString) { - return unit.saveToDisk(outputFileName, errorString); + return unit->saveToDisk(outputFileName, errorString); }; } -- cgit v1.2.3