From e86946b5d8575d134fdc24c782f1757a8cc22d8f Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 14 Jun 2019 13:59:57 +0200 Subject: 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 --- src/qml/compiler/compiler.pri | 1 - src/qml/compiler/qv4codegen.cpp | 1 + src/qml/compiler/qv4compileddata.cpp | 157 --------------------- src/qml/compiler/qv4compileddata_p.h | 132 ++++++++++++++--- src/qml/jsruntime/qv4executablecompilationunit_p.h | 2 + src/qml/qml/qqmlirloader_p.h | 1 + 6 files changed, 113 insertions(+), 181 deletions(-) delete mode 100644 src/qml/compiler/qv4compileddata.cpp (limited to 'src/qml') diff --git a/src/qml/compiler/compiler.pri b/src/qml/compiler/compiler.pri index c3dd5890d6..c6ae8c6b69 100644 --- a/src/qml/compiler/compiler.pri +++ b/src/qml/compiler/compiler.pri @@ -20,7 +20,6 @@ HEADERS += \ SOURCES += \ $$PWD/qv4bytecodegenerator.cpp \ - $$PWD/qv4compileddata.cpp \ $$PWD/qv4compiler.cpp \ $$PWD/qv4compilercontext.cpp \ $$PWD/qv4compilerscanfunctions.cpp \ diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 99b73679c5..79eac5dbcc 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp deleted file mode 100644 index ee53ca1586..0000000000 --- a/src/qml/compiler/qv4compileddata.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qv4compileddata_p.h" -#include -#include -#include -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -namespace QV4 { - -namespace CompiledData { - -CompilationUnit::CompilationUnit(const Unit *unitData, const QString &fileName, const QString &finalUrlString) -{ - setUnitData(unitData, nullptr, fileName, finalUrlString); -} - -CompilationUnit::~CompilationUnit() -{ - if (data) { - if (data->qmlUnit() != qmlData) - free(const_cast(qmlData)); - qmlData = nullptr; - - if (!(data->flags & QV4::CompiledData::Unit::StaticData)) - free(const_cast(data)); - } - data = nullptr; -#if Q_BYTE_ORDER == Q_BIG_ENDIAN - delete [] constants; - constants = nullptr; -#endif - - delete [] imports; - imports = nullptr; -} - -void CompilationUnit::setUnitData(const Unit *unitData, const QmlUnit *qmlUnit, - const QString &fileName, const QString &finalUrlString) -{ - 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(data->constants()); -#endif - - m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex); - m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex); -} - -//reverse of Lexer::singleEscape() -QString Binding::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; -} - -} - -} - -QT_END_NAMESPACE 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 #include +#include +#include +#include #if QT_CONFIG(temporaryfile) #include #endif -#include -#include -#include -#include - -#include -#include -#include -#include -#include #include +#include 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 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::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(qmlData)); + qmlData = nullptr; + + if (!(data->flags & QV4::CompiledData::Unit::StaticData)) + free(const_cast(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(data->constants()); +#endif + + m_fileName = !fileName.isEmpty() ? fileName : stringAt(data->sourceFileIndex); + m_finalUrlString = !finalUrlString.isEmpty() ? finalUrlString : stringAt(data->finalUrlIndex); + } QString stringAt(int index) const { diff --git a/src/qml/jsruntime/qv4executablecompilationunit_p.h b/src/qml/jsruntime/qv4executablecompilationunit_p.h index 1823a3663c..010b8a2fd0 100644 --- a/src/qml/jsruntime/qv4executablecompilationunit_p.h +++ b/src/qml/jsruntime/qv4executablecompilationunit_p.h @@ -52,10 +52,12 @@ // #include +#include #include #include #include #include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmlirloader_p.h b/src/qml/qml/qqmlirloader_p.h index aa303c923f..4812946ef0 100644 --- a/src/qml/qml/qqmlirloader_p.h +++ b/src/qml/qml/qqmlirloader_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include #include #include -- cgit v1.2.3