aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qqmlirbuilder.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-01-03 15:45:31 +0100
committerUlf Hermann <ulf.hermann@qt.io>2023-01-20 20:39:11 +0100
commitec58c0ddb7fe1ebf33c80335ab9435e53fd00274 (patch)
treed30a8779fa5fb82bcc9e3b31e581d3962dc81d21 /src/qml/compiler/qqmlirbuilder.cpp
parentea5200b82f21e0f4d080d3fc256b218e0ee56f3d (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.cpp39
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;
}
}