diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-04-30 11:22:23 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-05-07 07:36:24 +0000 |
commit | 3df85008591dffc64427095b022421469cb9a866 (patch) | |
tree | 5ed97536bf3a96d9c78c86fd743eae7f2d8ee3df | |
parent | d2c089eb11d3ad6a9917efde8f13b36931b35baf (diff) |
Avoid std::function in qqmlirbuilder.cpp
Some compilers seem to miscompile this construction. Furthermore, it
doesn't really add to the readability of the code. Inline the code in
question at the only place it's used and avoid most of the const_cast by
adding a non-const accessor to CompiledData::Unit.
Fixes: QTBUG-75392
Change-Id: I015317f28a92817d08d616cc35956745758d7847
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 36 | ||||
-rw-r--r-- | src/qml/compiler/qv4compileddata_p.h | 4 |
2 files changed, 18 insertions, 22 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index 868f600a10..558399ad6c 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -1558,15 +1558,12 @@ void QmlUnitGenerator::generate(Document &output, const QV4::CompiledData::Depen QQmlRefPointer<QV4::CompiledData::CompilationUnit> compilationUnit = output.javaScriptCompilationUnit; - const QV4::CompiledData::Unit *jsUnit = nullptr; - std::function<QV4::CompiledData::QmlUnit *(QV4::CompiledData::QmlUnit *, uint)> unitFinalizer - = [](QV4::CompiledData::QmlUnit *unit, uint) { - return unit; - }; + QV4::CompiledData::Unit *jsUnit = nullptr; + const bool finalize = !compilationUnit->data; // We may already have unit data if we're loading an ahead-of-time generated cache file. - if (compilationUnit->data) { - jsUnit = compilationUnit->data; + if (!finalize) { + jsUnit = const_cast<QV4::CompiledData::Unit *>(compilationUnit->data); #ifndef V4_BOOTSTRAP output.javaScriptCompilationUnit->dynamicStrings = output.jsGenerator.stringTable.allStrings(); #endif @@ -1599,20 +1596,6 @@ void QmlUnitGenerator::generate(Document &output, const QV4::CompiledData::Depen #endif createdUnit->sourceFileIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.fileName); createdUnit->finalUrlIndex = output.jsGenerator.stringTable.getStringId(output.jsModule.finalUrl); - - // Combine the qml data into the general unit data. - unitFinalizer = [&jsUnit](QV4::CompiledData::QmlUnit *qmlUnit, uint qmlDataSize) { - void *ptr = const_cast<QV4::CompiledData::Unit*>(jsUnit); - QV4::CompiledData::Unit *newUnit = (QV4::CompiledData::Unit *)realloc(ptr, jsUnit->unitSize + qmlDataSize); - jsUnit = newUnit; - newUnit->offsetToQmlUnit = newUnit->unitSize; - newUnit->unitSize += qmlDataSize; - memcpy(const_cast<QV4::CompiledData::QmlUnit *>(newUnit->qmlUnit()), qmlUnit, qmlDataSize); - free(const_cast<QV4::CompiledData::QmlUnit*>(qmlUnit)); - qmlUnit = nullptr; - newUnit->generateChecksum(); - return const_cast<QV4::CompiledData::QmlUnit*>(newUnit->qmlUnit()); - }; } // No more new strings after this point, we're calculating offsets. @@ -1779,7 +1762,16 @@ void QmlUnitGenerator::generate(Document &output, const QV4::CompiledData::Depen } } - qmlUnit = unitFinalizer(qmlUnit, totalSize); + if (finalize) { + // Combine the qml data into the general unit data. + jsUnit = static_cast<QV4::CompiledData::Unit *>(realloc(jsUnit, jsUnit->unitSize + totalSize)); + jsUnit->offsetToQmlUnit = jsUnit->unitSize; + jsUnit->unitSize += totalSize; + memcpy(jsUnit->qmlUnit(), qmlUnit, totalSize); + free(qmlUnit); + jsUnit->generateChecksum(); + qmlUnit = jsUnit->qmlUnit(); + } static const bool showStats = qEnvironmentVariableIsSet("QML_SHOW_UNIT_STATS"); if (showStats) { diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 3fd9fdf74b..76795f7aa3 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -891,6 +891,10 @@ struct Unit return reinterpret_cast<const QmlUnit *>(reinterpret_cast<const char *>(this) + offsetToQmlUnit); } + QmlUnit *qmlUnit() { + return reinterpret_cast<QmlUnit *>(reinterpret_cast<char *>(this) + offsetToQmlUnit); + } + bool isSingleton() const { return flags & Unit::IsSingleton; } |