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