aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/common/qv4compileddata_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/common/qv4compileddata_p.h')
-rw-r--r--src/qml/common/qv4compileddata_p.h52
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)
{