diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-21 14:06:42 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-26 18:43:10 +0000 |
commit | b4cf8c1f1af444c829e46ad79f778951886cc29d (patch) | |
tree | 285152235193f038e800d91bc535f2dd9a992c95 | |
parent | cae23efe45ee92b41b7899a28d4d1d7d1048584d (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.h | 2 | ||||
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executablecompilationunit_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4function.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlirloader.cpp | 4 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/data/signatureIgnored.qml | 2 |
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 |