diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-30 10:14:17 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-07-06 21:29:39 +0200 |
commit | ca27c051ab52b764df8c8aab9c33211cbf94eba1 (patch) | |
tree | f2215f58c940585ffa7dc00d11e4a61dc458711b /src/qml/compiler/qv4compiler.cpp | |
parent | 984f774ca9949c096bc3b9d04122c6c5014750a4 (diff) |
QmlCompiler: Allow creation of structured value types
With this change, qmlcachegen can populate structured value types from
object literals.
Also fix the construction of value types via Q_INVOKABLE ctors. We don't
need to wrap the ctor argument in QVariant if we can store the original
type, and we should always look at the base type for the creatable flag,
not the extension.
Task-number: QTBUG-107469
Task-number: QTBUG-112485
Change-Id: I9f3db13f00466dc9d87237bdf0b380d6eeb58a10
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4compiler.cpp')
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 8df61e51ab..34c62cc992 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -197,6 +197,10 @@ QV4::ReturnedValue QV4::Compiler::JSUnitGenerator::constant(int idx) const return constants.at(idx); } +// The JSClass object and its members are stored contiguously in the jsClassData. +// In order to get to the members you have to skip over the JSClass, therefore +1. +static constexpr qsizetype jsClassMembersOffset = 1; + int QV4::Compiler::JSUnitGenerator::registerJSClass(const QStringList &members) { // ### re-use existing class definitions. @@ -209,7 +213,8 @@ int QV4::Compiler::JSUnitGenerator::registerJSClass(const QStringList &members) CompiledData::JSClass *jsClass = reinterpret_cast<CompiledData::JSClass*>(jsClassData.data() + oldSize); jsClass->nMembers = members.size(); - CompiledData::JSClassMember *member = reinterpret_cast<CompiledData::JSClassMember*>(jsClass + 1); + CompiledData::JSClassMember *member + = reinterpret_cast<CompiledData::JSClassMember*>(jsClass + jsClassMembersOffset); for (const auto &name : members) { member->set(registerString(name), false); @@ -219,6 +224,25 @@ int QV4::Compiler::JSUnitGenerator::registerJSClass(const QStringList &members) return jsClassOffsets.size() - 1; } +int QV4::Compiler::JSUnitGenerator::jsClassSize(int jsClassId) const +{ + const CompiledData::JSClass *jsClass + = reinterpret_cast<const CompiledData::JSClass*>( + jsClassData.data() + jsClassOffsets[jsClassId]); + return jsClass->nMembers; +} + +QString QV4::Compiler::JSUnitGenerator::jsClassMember(int jsClassId, int member) const +{ + const CompiledData::JSClass *jsClass = reinterpret_cast<const CompiledData::JSClass*>( + jsClassData.data() + jsClassOffsets[jsClassId]); + Q_ASSERT(member >= 0); + Q_ASSERT(uint(member) < jsClass->nMembers); + const CompiledData::JSClassMember *members + = reinterpret_cast<const CompiledData::JSClassMember*>(jsClass + jsClassMembersOffset); + return stringForIndex(members[member].nameOffset()); +} + int QV4::Compiler::JSUnitGenerator::registerTranslation(const QV4::CompiledData::TranslationData &translation) { translations.append(translation); |