diff options
| author | Simon Hausmann <simon.hausmann@qt.io> | 2018-07-23 10:40:41 +0200 |
|---|---|---|
| committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-07-31 05:13:48 +0000 |
| commit | e56eeee9902ffc341506040e637654b2b0451209 (patch) | |
| tree | b316f49506739e96e85dfe25bb7759703bcb95f7 /src/qml/compiler/qv4compileddata.cpp | |
| parent | 4ac9cf78969436dae456c8fec4a0a706a3d65ec4 (diff) | |
Encapsulate the unit data in CompilationUnit
This allows updating the constants table when the unit data is set /
changes and removes the tie to the engine.
Change-Id: Ice553650390589e30e18421c4e55422a55d0df89
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4compileddata.cpp')
| -rw-r--r-- | src/qml/compiler/qv4compileddata.cpp | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index 0c81a5b3c6..a4c7c98642 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -64,6 +64,7 @@ #include <QCoreApplication> #include <QCryptographicHash> #include <QSaveFile> +#include <QScopeGuard> // generated by qmake: #include "qml_compile_hash_p.h" @@ -91,7 +92,7 @@ static_assert(sizeof(Unit::libraryVersionHash) >= QML_COMPILE_HASH_LENGTH + 1, " CompilationUnit::CompilationUnit(const Unit *unitData) { - data = unitData; + setUnitData(unitData); } #ifndef V4_BOOTSTRAP @@ -101,6 +102,10 @@ CompilationUnit::~CompilationUnit() if (data && !(data->flags & QV4::CompiledData::Unit::StaticData)) free(const_cast<Unit *>(data)); data = nullptr; +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + delete [] constants; + constants = nullptr; +#endif } QString CompilationUnit::localCacheFilePath(const QUrl &url) @@ -175,16 +180,6 @@ QV4::Function *CompilationUnit::linkToEngine(ExecutionEngine *engine) } } -#if Q_BYTE_ORDER == Q_BIG_ENDIAN - Value *bigEndianConstants = new Value[data->constantTableSize]; - const quint64_le *littleEndianConstants = data->constants(); - for (uint i = 0; i < data->constantTableSize; ++i) - bigEndianConstants[i] = Value::fromReturnedValue(littleEndianConstants[i]); - constants = bigEndianConstants; -#else - constants = reinterpret_cast<const Value*>(data->constants()); -#endif - linkBackendToEngine(engine); static const bool showCode = qEnvironmentVariableIsSet("QV4_SHOW_BYTECODE"); @@ -240,10 +235,6 @@ void CompilationUnit::unlink() runtimeClasses = nullptr; qDeleteAll(runtimeFunctions); runtimeFunctions.clear(); -#if Q_BYTE_ORDER == Q_BIG_ENDIAN - delete [] constants; - constants = nullptr; -#endif } void CompilationUnit::markObjects(QV4::MarkStack *markStack) @@ -369,14 +360,18 @@ bool CompilationUnit::loadFromDisk(const QUrl &url, const QDateTime &sourceTimeS continue; const Unit * const oldDataPtr = (data && !(data->flags & QV4::CompiledData::Unit::StaticData)) ? data : nullptr; - QScopedValueRollback<const Unit *> dataPtrChange(data, mappedUnit); + const Unit *oldData = data; + auto dataPtrRevert = qScopeGuard([this, oldData](){ + setUnitData(oldData); + }); + setUnitData(mappedUnit); if (data->sourceFileIndex != 0 && sourcePath != QQmlFile::urlToLocalFileOrQrc(stringAt(data->sourceFileIndex))) { *errorString = QStringLiteral("QML source file has moved to a different location."); continue; } - dataPtrChange.commit(); + dataPtrRevert.dismiss(); free(const_cast<Unit*>(oldDataPtr)); backingFile.reset(cacheFile.take()); return true; @@ -572,6 +567,27 @@ Unit *CompilationUnit::createUnitData(QmlIR::Document *irDocument) return jsUnit; } +void CompilationUnit::setUnitData(const Unit *unitData) +{ + data = unitData; +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + delete [] constants; +#endif + constants = nullptr; + if (!data) + return; + +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + Value *bigEndianConstants = new Value[data->constantTableSize]; + const quint64_le *littleEndianConstants = data->constants(); + for (uint i = 0; i < data->constantTableSize; ++i) + bigEndianConstants[i] = Value::fromReturnedValue(littleEndianConstants[i]); + constants = bigEndianConstants; +#else + constants = reinterpret_cast<const Value*>(data->constants()); +#endif +} + QString Binding::valueAsString(const Unit *unit) const { switch (type) { @@ -697,7 +713,7 @@ bool ResolvedTypeReference::addToHash(QCryptographicHash *hash, QQmlEngine *engi hash->addData(createPropertyCache(engine)->checksum(&ok)); return ok; } - hash->addData(compilationUnit->data->md5Checksum, sizeof(compilationUnit->data->md5Checksum)); + hash->addData(compilationUnit->unitData()->md5Checksum, sizeof(compilationUnit->unitData()->md5Checksum)); return true; } |
