aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-06-21 14:06:42 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-06-26 18:43:10 +0000
commitb4cf8c1f1af444c829e46ad79f778951886cc29d (patch)
tree285152235193f038e800d91bc535f2dd9a992c95
parentcae23efe45ee92b41b7899a28d4d1d7d1048584d (diff)
QML: Revert the default for enforcing function signatures
[ChangeLog][QtQml][Important Behavior Changes] Type annotations on function signatures are now enforced, no matter if the code in question is interpreted, JIT-compiled, or AOT-compiled. Previously, only AOT-compiled code enforced the signatures. Therefore you could produce divergent behavior by passing or returning values that violated the type annotations. Fixes: QTBUG-113527 Fixes: QTBUG-109221 Change-Id: Ie573b31f35813db37b75189e747c764d1b9bbe78 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qml/common/qv4compileddata_p.h2
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp3
-rw-r--r--src/qml/jsruntime/qv4executablecompilationunit_p.h4
-rw-r--r--src/qml/jsruntime/qv4function.cpp2
-rw-r--r--src/qml/qml/qqmlirloader.cpp4
-rw-r--r--tests/auto/qml/qqmllanguage/data/signatureIgnored.qml2
6 files changed, 8 insertions, 9 deletions
diff --git a/src/qml/common/qv4compileddata_p.h b/src/qml/common/qv4compileddata_p.h
index dde4082172..41608bb625 100644
--- a/src/qml/common/qv4compileddata_p.h
+++ b/src/qml/common/qv4compileddata_p.h
@@ -1200,7 +1200,7 @@ struct Unit
ListPropertyAssignReplace
= ListPropertyAssignReplaceIfDefault | ListPropertyAssignReplaceIfNotDefault,
ComponentsBound = 0x200,
- FunctionSignaturesEnforced = 0x400,
+ FunctionSignaturesIgnored = 0x400,
NativeMethodsAcceptThisObject = 0x800,
ValueTypesCopied = 0x1000,
ValueTypesAddressable = 0x2000,
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index 7a1ea6905a..072894adde 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -1717,10 +1717,9 @@ void QmlUnitGenerator::generate(Document &output, const QV4::CompiledData::Depen
case Pragma::FunctionSignatureBehavior:
switch (p->functionSignatureBehavior) {
case Pragma::Enforced:
- createdUnit->flags |= Unit::FunctionSignaturesEnforced;
break;
case Pragma::Ignored:
- //this is the default;
+ createdUnit->flags |= Unit::FunctionSignaturesIgnored;
break;
}
break;
diff --git a/src/qml/jsruntime/qv4executablecompilationunit_p.h b/src/qml/jsruntime/qv4executablecompilationunit_p.h
index bf5ccc08d2..f7a491c740 100644
--- a/src/qml/jsruntime/qv4executablecompilationunit_p.h
+++ b/src/qml/jsruntime/qv4executablecompilationunit_p.h
@@ -194,9 +194,9 @@ public:
return ListPropertyAssignBehavior::Append;
}
- bool enforcesFunctionSignature() const
+ bool ignoresFunctionSignature() const
{
- return data->flags & CompiledData::Unit::FunctionSignaturesEnforced;
+ return data->flags & CompiledData::Unit::FunctionSignaturesIgnored;
}
bool nativeMethodsAcceptThisObjects() const
diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp
index c1725f8818..b0d937de90 100644
--- a/src/qml/jsruntime/qv4function.cpp
+++ b/src/qml/jsruntime/qv4function.cpp
@@ -117,7 +117,7 @@ Function::Function(ExecutionEngine *engine, ExecutableCompilationUnit *unit,
ic = ic->addMember(engine->identifierTable->asPropertyKey(compilationUnit->runtimeStrings[localsIndices[i]]), Attr_NotConfigurable);
const CompiledData::Parameter *formalsIndices = compiledFunction->formalsTable();
- bool enforceJsTypes = !aotFunction && unit->enforcesFunctionSignature();
+ bool enforceJsTypes = !aotFunction && !unit->ignoresFunctionSignature();
for (quint32 i = 0; i < compiledFunction->nFormals; ++i) {
ic = ic->addMember(engine->identifierTable->asPropertyKey(compilationUnit->runtimeStrings[formalsIndices[i].nameIndex]), Attr_NotConfigurable);
diff --git a/src/qml/qml/qqmlirloader.cpp b/src/qml/qml/qqmlirloader.cpp
index f3e6b9ec39..b29ce185ef 100644
--- a/src/qml/qml/qqmlirloader.cpp
+++ b/src/qml/qml/qqmlirloader.cpp
@@ -74,8 +74,8 @@ void QQmlIRLoader::load()
if (unit->flags & QV4::CompiledData::Unit::ComponentsBound)
createComponentPragma(Pragma::ComponentBehavior, Pragma::Bound);
- if (unit->flags & QV4::CompiledData::Unit::FunctionSignaturesEnforced)
- createFunctionSignaturePragma(Pragma::FunctionSignatureBehavior, Pragma::Enforced);
+ if (unit->flags & QV4::CompiledData::Unit::FunctionSignaturesIgnored)
+ createFunctionSignaturePragma(Pragma::FunctionSignatureBehavior, Pragma::Ignored);
if (unit->flags & QV4::CompiledData::Unit::NativeMethodsAcceptThisObject)
createNativeMethodPragma(Pragma::NativeMethodBehavior, Pragma::AcceptThisObject);
diff --git a/tests/auto/qml/qqmllanguage/data/signatureIgnored.qml b/tests/auto/qml/qqmllanguage/data/signatureIgnored.qml
index 0e9d0f42dc..bdb373040d 100644
--- a/tests/auto/qml/qqmllanguage/data/signatureIgnored.qml
+++ b/tests/auto/qml/qqmllanguage/data/signatureIgnored.qml
@@ -1,6 +1,6 @@
+pragma FunctionSignatureBehavior: Ignored
import StaticTest
import QtQml
-
QtObject {
property rect rect: ({ x: 12, y: 13 })
property withLength withLength: 5