diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-01-03 15:45:31 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-01-20 20:39:11 +0100 |
commit | ec58c0ddb7fe1ebf33c80335ab9435e53fd00274 (patch) | |
tree | d30a8779fa5fb82bcc9e3b31e581d3962dc81d21 /src/qml/compiler/qqmlirbuilder.cpp | |
parent | ea5200b82f21e0f4d080d3fc256b218e0ee56f3d (diff) |
QML: Add a pragma for value type behavior
Unfortunately value types behave differently when compiled to C++.
Document the difference and introduce a pragma to make them behave one
way or the other.
Pick-to: 6.5
Fixes: QTBUG-109221
Change-Id: Ib2685153c0b4ae209bafbea7a01229377fdb47dd
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/compiler/qqmlirbuilder.cpp')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index b2d5f2c3d2..3fd66d302c 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -788,6 +788,8 @@ private: return Pragma::FunctionSignatureBehavior; } else if constexpr (std::is_same_v<Argument, Pragma::NativeMethodBehaviorValue>) { return Pragma::NativeMethodBehavior; + } else if constexpr (std::is_same_v<Argument, Pragma::ValueTypeBehaviorValue>) { + return Pragma::ValueTypeBehavior; } Q_UNREACHABLE_RETURN(Pragma::PragmaType(-1)); @@ -838,6 +840,15 @@ private: pragma->nativeMethodBehavior = Pragma::RejectThisObject; return true; } + } else if constexpr (std::is_same_v<Argument, Pragma::ValueTypeBehaviorValue>) { + if (value == "Reference"_L1) { + pragma->valueTypeBehavior = Pragma::Reference; + return true; + } + if (value == "Copy"_L1) { + pragma->valueTypeBehavior = Pragma::Copy; + return true; + } } return false; @@ -863,6 +874,8 @@ private: return "function signature behavior"_L1; case Pragma::NativeMethodBehavior: return "native method behavior"_L1; + case Pragma::ValueTypeBehavior: + return "value type behavior"_L1; default: break; } @@ -875,22 +888,25 @@ bool IRBuilder::visit(QQmlJS::AST::UiPragma *node) Pragma *pragma = New<Pragma>(); if (!node->name.isNull()) { - if (node->name == QStringLiteral("Singleton")) { + if (node->name == "Singleton"_L1) { pragma->type = Pragma::Singleton; - } else if (node->name == QStringLiteral("Strict")) { + } else if (node->name == "Strict"_L1) { pragma->type = Pragma::Strict; - } else if (node->name == QStringLiteral("ComponentBehavior")) { + } else if (node->name == "ComponentBehavior"_L1) { if (!PragmaParser<Pragma::ComponentBehaviorValue>::run(this, node, pragma)) return false; - } else if (node->name == QStringLiteral("ListPropertyAssignBehavior")) { + } else if (node->name == "ListPropertyAssignBehavior"_L1) { if (!PragmaParser<Pragma::ListPropertyAssignBehaviorValue>::run(this, node, pragma)) return false; - } else if (node->name == QStringLiteral("FunctionSignatureBehavior")) { + } else if (node->name == "FunctionSignatureBehavior"_L1) { if (!PragmaParser<Pragma::FunctionSignatureBehaviorValue>::run(this, node, pragma)) return false; - } else if (node->name == QStringLiteral("NativeMethodBehavior")) { + } else if (node->name == "NativeMethodBehavior"_L1) { if (!PragmaParser<Pragma::NativeMethodBehaviorValue>::run(this, node, pragma)) return false; + } else if (node->name == "ValueTypeBehavior"_L1) { + if (!PragmaParser<Pragma::ValueTypeBehaviorValue>::run(this, node, pragma)) + return false; } else { recordError(node->pragmaToken, QCoreApplication::translate( "QQmlParser", "Unknown pragma '%1'").arg(node->name)); @@ -1671,6 +1687,17 @@ void QmlUnitGenerator::generate(Document &output, const QV4::CompiledData::Depen // this is the default; break; } + break; + case Pragma::ValueTypeBehavior: + switch (p->valueTypeBehavior) { + case Pragma::Copy: + createdUnit->flags |= Unit::ValueTypesCopied; + break; + case Pragma::Reference: + //this is the default; + break; + } + break; } } |