diff options
Diffstat (limited to 'src/qml/common/qv4compileddata_p.h')
| -rw-r--r-- | src/qml/common/qv4compileddata_p.h | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/src/qml/common/qv4compileddata_p.h b/src/qml/common/qv4compileddata_p.h index 01121bd008..e00e3aedd0 100644 --- a/src/qml/common/qv4compileddata_p.h +++ b/src/qml/common/qv4compileddata_p.h @@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE // Also change the comment behind the number to describe the latest change. This has the added // benefit that if another patch changes the version too, it will result in a merge conflict, and // not get removed silently. -#define QV4_DATA_STRUCTURE_VERSION 0x48 // Hotfix 6.10 - meta object change +#define QV4_DATA_STRUCTURE_VERSION 0x49 // Added isVirtual and isOverride fields to property class QIODevice; class QQmlTypeNameCache; @@ -788,19 +788,43 @@ struct Signal }; static_assert(sizeof(Signal) == 12, "Signal structure needs to have the expected size to be binary compatible on disk when generated by host compiler and loaded by target"); +/* + * We aim to minimize the size of a struct as much as possible, while preserving at least 28 bits + * for each index. + * + * Note that Name and Type indices are provided by StringTableGenerator, containing a hashmap + * (and a list) of unique strings within one Compilation Unit. It sounds rather unrealistic to have + * 2^28 (260+ million) unique strings within 1 CU (even if it's some form of global registry), not + * to mention the amount of memory needed to maintain such a StringTableGenerator. + * Therefore, after some preliminary analysis, it seems that even 20 bits + * should be a rather conservative cap. + * + * However it doesn't seem to easily provide many benefits atm other than better (logically) grouped + * unions like, let's say nameIndexAndAttributes. + * + * Atm 32-bit member nameIndexAndVirtSpecifiers looks smth like this: + * + * NameIndexField IsVirtualField IsOverrideField IsFinalField + * |10100000101000111000001110000| 0 | 1 | 0 | + * + */ struct Property { private: - using NameIndexField = quint32_le_bitfield_member<0, 31>; - using FinalField = quint32_le_bitfield_member<31, 1>; + using NameIndexField = quint32_le_bitfield_member<0, 29>; + using IsVirtualField = quint32_le_bitfield_member<29, 1>; + using IsOverrideField = quint32_le_bitfield_member<30, 1>; + using IsFinalField = quint32_le_bitfield_member<31, 1>; using CommonTypeOrTypeNameIndexField = quint32_le_bitfield_member<0, 28>; using IsRequiredField = quint32_le_bitfield_member<28, 1>; using IsCommonTypeField = quint32_le_bitfield_member<29, 1>; using IsListField = quint32_le_bitfield_member<30, 1>; using IsReadOnlyField = quint32_le_bitfield_member<31, 1>; + public: - quint32_le_bitfield_union<NameIndexField, FinalField> nameIndexAndFinal; + quint32_le_bitfield_union<NameIndexField, IsVirtualField, IsOverrideField, IsFinalField> + nameIndexAndVirtSpecifiers; quint32_le_bitfield_union< CommonTypeOrTypeNameIndexField, IsRequiredField, @@ -809,11 +833,23 @@ public: IsReadOnlyField> data; Location location; - quint32 nameIndex() const { return nameIndexAndFinal.get<NameIndexField>(); } - void setNameIndex(int nameIndex) { nameIndexAndFinal.set<NameIndexField>(nameIndex); } + quint32 nameIndex() const { return nameIndexAndVirtSpecifiers.get<NameIndexField>(); } + void setNameIndex(int nameIndex) { nameIndexAndVirtSpecifiers.set<NameIndexField>(nameIndex); } + + bool isVirtual() const { return nameIndexAndVirtSpecifiers.get<IsVirtualField>(); } + void setIsVirtual(bool isVirtual) + { + nameIndexAndVirtSpecifiers.set<IsVirtualField>(isVirtual ? 1 : 0); + } + + bool isOverride() const { return nameIndexAndVirtSpecifiers.get<IsOverrideField>(); } + void setIsOverride(bool isOverride) + { + nameIndexAndVirtSpecifiers.set<IsOverrideField>(isOverride ? 1 : 0); + } - bool isFinal() const { return nameIndexAndFinal.get<FinalField>(); } - void setIsFinal(bool final) { nameIndexAndFinal.set<FinalField>(final ? 1 : 0); } + bool isFinal() const { return nameIndexAndVirtSpecifiers.get<IsFinalField>(); } + void setIsFinal(bool isFinal) { nameIndexAndVirtSpecifiers.set<IsFinalField>(isFinal ? 1 : 0); } void setCommonType(CommonType t) { |
