diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-06-14 13:59:57 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-06-26 10:03:53 +0200 |
commit | e86946b5d8575d134fdc24c782f1757a8cc22d8f (patch) | |
tree | e822eecd2dd5503e7b520d6cfbe98cc2331e52fb /src/qml/compiler/qv4compileddata_p.h | |
parent | c060f6e765a2f155b38158f2ed73eac4aad37e02 (diff) |
Inline the rest of qv4compileddata.cpp
This way we get a header-only representation usable for the QmlCommon
module.
Change-Id: Ia75e445ffbee0c3b2d473a2a3a6309b2f12e8eea
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4compileddata_p.h')
-rw-r--r-- | src/qml/compiler/qv4compileddata_p.h | 132 |
1 files changed, 109 insertions, 23 deletions
diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 1db23fc755..c4e7a5ba0d 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -52,22 +52,16 @@ #include <QtCore/qstring.h> #include <QtCore/qscopeguard.h> +#include <QtCore/qvector.h> +#include <QtCore/qstringlist.h> +#include <QtCore/qhash.h> #if QT_CONFIG(temporaryfile) #include <QtCore/qsavefile.h> #endif -#include <QVector> -#include <QStringList> -#include <QHash> -#include <QUrl> - -#include <private/qv4executableallocator_p.h> -#include <private/qqmlrefcount_p.h> -#include <private/qqmlnullablevalue_p.h> -#include <private/qv4identifier_p.h> -#include <private/qflagpointer_p.h> #include <private/qendian_p.h> +#include <private/qv4staticvalue_p.h> QT_BEGIN_NAMESPACE @@ -92,10 +86,10 @@ struct Document; } namespace QV4 { -struct StaticValue; - namespace Heap { struct Module; +struct String; +struct InternalClass; }; struct Function; @@ -413,7 +407,7 @@ static_assert(sizeof(ImportEntry) == 16, "ImportEntry structure needs to have th // Qml data structures -struct Q_QML_EXPORT TranslationData +struct TranslationData { quint32_le stringIndex; quint32_le commentIndex; @@ -422,7 +416,7 @@ struct Q_QML_EXPORT TranslationData }; static_assert(sizeof(TranslationData) == 16, "TranslationData structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target"); -struct Q_QML_PRIVATE_EXPORT Binding +struct Binding { quint32_le propertyNameIndex; @@ -519,7 +513,48 @@ struct Q_QML_PRIVATE_EXPORT Binding bool isFunctionExpression() const { return (flags & IsFunctionExpression); } - static QString escapedString(const QString &string); + //reverse of Lexer::singleEscape() + static QString escapedString(const QString &string) + { + QString tmp = QLatin1String("\""); + for (int i = 0; i < string.length(); ++i) { + const QChar &c = string.at(i); + switch (c.unicode()) { + case 0x08: + tmp += QLatin1String("\\b"); + break; + case 0x09: + tmp += QLatin1String("\\t"); + break; + case 0x0A: + tmp += QLatin1String("\\n"); + break; + case 0x0B: + tmp += QLatin1String("\\v"); + break; + case 0x0C: + tmp += QLatin1String("\\f"); + break; + case 0x0D: + tmp += QLatin1String("\\r"); + break; + case 0x22: + tmp += QLatin1String("\\\""); + break; + case 0x27: + tmp += QLatin1String("\\\'"); + break; + case 0x5C: + tmp += QLatin1String("\\\\"); + break; + default: + tmp += c; + break; + } + } + tmp += QLatin1Char('\"'); + return tmp; + } bool isTranslationBinding() const { return type == Type_Translation || type == Type_TranslationById; } bool evaluatesToString() const { return type == Type_String || isTranslationBinding(); } @@ -1040,7 +1075,7 @@ typedef QVector<QQmlPropertyData*> BindingPropertyData; // This is how this hooks into the existing structures: -struct Q_QML_PRIVATE_EXPORT CompilationUnitBase +struct CompilationUnitBase { Q_DISABLE_COPY(CompilationUnitBase) @@ -1077,11 +1112,11 @@ struct Q_QML_PRIVATE_EXPORT CompilationUnitBase Q_STATIC_ASSERT(std::is_standard_layout<CompilationUnitBase>::value); Q_STATIC_ASSERT(offsetof(CompilationUnitBase, runtimeStrings) == 0); Q_STATIC_ASSERT(offsetof(CompilationUnitBase, constants) == sizeof(QV4::Heap::String **)); -Q_STATIC_ASSERT(offsetof(CompilationUnitBase, runtimeRegularExpressions) == offsetof(CompilationUnitBase, constants) + sizeof(const Value *)); -Q_STATIC_ASSERT(offsetof(CompilationUnitBase, runtimeClasses) == offsetof(CompilationUnitBase, runtimeRegularExpressions) + sizeof(const Value *)); -Q_STATIC_ASSERT(offsetof(CompilationUnitBase, imports) == offsetof(CompilationUnitBase, runtimeClasses) + sizeof(const Value *)); +Q_STATIC_ASSERT(offsetof(CompilationUnitBase, runtimeRegularExpressions) == offsetof(CompilationUnitBase, constants) + sizeof(const StaticValue *)); +Q_STATIC_ASSERT(offsetof(CompilationUnitBase, runtimeClasses) == offsetof(CompilationUnitBase, runtimeRegularExpressions) + sizeof(const StaticValue *)); +Q_STATIC_ASSERT(offsetof(CompilationUnitBase, imports) == offsetof(CompilationUnitBase, runtimeClasses) + sizeof(const StaticValue *)); -struct Q_QML_PRIVATE_EXPORT CompilationUnit : public CompilationUnitBase +struct CompilationUnit : public CompilationUnitBase { Q_DISABLE_COPY(CompilationUnit) @@ -1091,8 +1126,31 @@ struct Q_QML_PRIVATE_EXPORT CompilationUnit : public CompilationUnitBase public: using CompiledObject = CompiledData::Object; - CompilationUnit(const Unit *unitData = nullptr, const QString &fileName = QString(), const QString &finalUrlString = QString()); - ~CompilationUnit(); + CompilationUnit(const Unit *unitData = nullptr, const QString &fileName = QString(), + const QString &finalUrlString = QString()) + { + setUnitData(unitData, nullptr, fileName, finalUrlString); + } + + ~CompilationUnit() + { + if (data) { + if (data->qmlUnit() != qmlData) + free(const_cast<QmlUnit *>(qmlData)); + qmlData = nullptr; + + if (!(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 + + delete [] imports; + imports = nullptr; + } CompilationUnit(CompilationUnit &&other) noexcept { @@ -1120,8 +1178,36 @@ public: } const Unit *unitData() const { return data; } + void setUnitData(const Unit *unitData, const QmlUnit *qmlUnit = nullptr, - const QString &fileName = QString(), const QString &finalUrlString = QString()); + const QString &fileName = QString(), const QString &finalUrlString = QString()) + { + data = unitData; + qmlData = nullptr; +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + delete [] constants; +#endif + constants = nullptr; + m_fileName.clear(); + m_finalUrlString.clear(); + if (!data) + return; + + qmlData = qmlUnit ? qmlUnit : data->qmlUnit(); + +#if Q_BYTE_ORDER == Q_BIG_ENDIAN + StaticValue *bigEndianConstants = new StaticValue[data->constantTableSize]; + const quint64_le *littleEndianConstants = data->constants(); + for (uint i = 0; i < data->constantTableSize; ++i) + bigEndianConstants[i] = StaticValue::fromReturnedValue(littleEndianConstants[i]); + constants = bigEndianConstants; +#else + constants = reinterpret_cast<const StaticValue*>(data->constants()); +#endif + + m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex); + m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex); + } QString stringAt(int index) const { |