From d0580a231c9b8e2a97fc0ea6a558b593dcb0c3d0 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 8 Oct 2024 17:26:10 -0700 Subject: [PATCH] QMetaMethodBuilder: limit the bits of attribute()/setAttribute() Pick-to: 6.8 Change-Id: I2d680563e65be28666f5fffd6aac927fd40c6b5d Reviewed-by: Oliver Wolff Reviewed-by: Fabian Kosmale --- src/corelib/kernel/qmetaobjectbuilder.cpp | 8 ++++--- .../tst_qmetaobjectbuilder.cpp | 24 +++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index 96b25bd3722..b5911aff549 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -1707,7 +1707,7 @@ int QMetaMethodBuilder::attributes() const { QMetaMethodBuilderPrivate *d = d_func(); if (d) - return (d->attributes >> 4); + return (d->attributes >> 4) & 0x7; else return 0; } @@ -1720,8 +1720,10 @@ int QMetaMethodBuilder::attributes() const void QMetaMethodBuilder::setAttributes(int value) { QMetaMethodBuilderPrivate *d = d_func(); - if (d) - d->attributes = ((d->attributes & 0x0f) | (value << 4)); + if (d) { + d->attributes &= ~0x70; + d->attributes |= (value & 0x7) << 4; + } } /*! diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index 0f26e67fb27..f5ec58e8e96 100644 --- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -258,7 +258,7 @@ void tst_QMetaObjectBuilder::method() method1.setParameterNames(QList() << "a" << "b"); method1.setTag("tag"); method1.setAccess(QMetaMethod::Private); - method1.setAttributes(42); + method1.setAttributes(QMetaMethod::Cloned); method1.setRevision(123); // Check that method1 is changed, but method2 is not. @@ -269,7 +269,7 @@ void tst_QMetaObjectBuilder::method() QCOMPARE(method1.parameterNames(), QList() << "a" << "b"); QCOMPARE(method1.tag(), QByteArray("tag")); QCOMPARE(method1.access(), QMetaMethod::Private); - QCOMPARE(method1.attributes(), 42); + QCOMPARE(method1.attributes(), QMetaMethod::Cloned); QCOMPARE(method1.revision(), 123); QCOMPARE(method1.index(), 0); QCOMPARE(method2.signature(), QByteArray("bar(QString)")); @@ -289,7 +289,7 @@ void tst_QMetaObjectBuilder::method() method2.setParameterNames(QList() << "c"); method2.setTag("Q_FOO"); method2.setAccess(QMetaMethod::Protected); - method2.setAttributes(24); + method2.setAttributes(QMetaMethod::Scriptable); method2.setRevision(321); // This time check that only method2 changed. @@ -300,7 +300,7 @@ void tst_QMetaObjectBuilder::method() QCOMPARE(method1.parameterNames(), QList() << "a" << "b"); QCOMPARE(method1.tag(), QByteArray("tag")); QCOMPARE(method1.access(), QMetaMethod::Private); - QCOMPARE(method1.attributes(), 42); + QCOMPARE(method1.attributes(), QMetaMethod::Cloned); QCOMPARE(method1.revision(), 123); QCOMPARE(method1.index(), 0); QCOMPARE(method2.signature(), QByteArray("bar(QString)")); @@ -310,7 +310,7 @@ void tst_QMetaObjectBuilder::method() QCOMPARE(method2.parameterNames(), QList() << "c"); QCOMPARE(method2.tag(), QByteArray("Q_FOO")); QCOMPARE(method2.access(), QMetaMethod::Protected); - QCOMPARE(method2.attributes(), 24); + QCOMPARE(method2.attributes(), QMetaMethod::Scriptable); QCOMPARE(method2.revision(), 321); QCOMPARE(method2.index(), 1); QCOMPARE(builder.methodCount(), 2); @@ -326,7 +326,7 @@ void tst_QMetaObjectBuilder::method() QCOMPARE(method2.parameterNames(), QList() << "c"); QCOMPARE(method2.tag(), QByteArray("Q_FOO")); QCOMPARE(method2.access(), QMetaMethod::Protected); - QCOMPARE(method2.attributes(), 24); + QCOMPARE(method2.attributes(), QMetaMethod::Scriptable); QCOMPARE(method2.revision(), 321); QCOMPARE(method2.index(), 0); @@ -461,7 +461,7 @@ void tst_QMetaObjectBuilder::constructor() ctor1.setParameterNames(QList() << "a" << "b"); ctor1.setTag("tag"); ctor1.setAccess(QMetaMethod::Private); - ctor1.setAttributes(42); + ctor1.setAttributes(QMetaMethod::Scriptable); // Check that ctor1 is changed, but ctor2 is not. QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)")); @@ -471,7 +471,7 @@ void tst_QMetaObjectBuilder::constructor() QCOMPARE(ctor1.parameterNames(), QList() << "a" << "b"); QCOMPARE(ctor1.tag(), QByteArray("tag")); QCOMPARE(ctor1.access(), QMetaMethod::Private); - QCOMPARE(ctor1.attributes(), 42); + QCOMPARE(ctor1.attributes(), QMetaMethod::Scriptable); QCOMPARE(ctor1.index(), 0); QCOMPARE(ctor2.signature(), QByteArray("bar(QString)")); QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor); @@ -489,7 +489,7 @@ void tst_QMetaObjectBuilder::constructor() ctor2.setParameterNames(QList() << "c"); ctor2.setTag("Q_FOO"); ctor2.setAccess(QMetaMethod::Protected); - ctor2.setAttributes(24); + ctor2.setAttributes(QMetaMethod::Compatibility); // This time check that only ctor2 changed. QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)")); @@ -499,7 +499,7 @@ void tst_QMetaObjectBuilder::constructor() QCOMPARE(ctor1.parameterNames(), QList() << "a" << "b"); QCOMPARE(ctor1.tag(), QByteArray("tag")); QCOMPARE(ctor1.access(), QMetaMethod::Private); - QCOMPARE(ctor1.attributes(), 42); + QCOMPARE(ctor1.attributes(), QMetaMethod::Scriptable); QCOMPARE(ctor1.index(), 0); QCOMPARE(ctor2.signature(), QByteArray("bar(QString)")); QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor); @@ -508,7 +508,7 @@ void tst_QMetaObjectBuilder::constructor() QCOMPARE(ctor2.parameterNames(), QList() << "c"); QCOMPARE(ctor2.tag(), QByteArray("Q_FOO")); QCOMPARE(ctor2.access(), QMetaMethod::Protected); - QCOMPARE(ctor2.attributes(), 24); + QCOMPARE(ctor2.attributes(), QMetaMethod::Compatibility); QCOMPARE(ctor2.index(), 1); QCOMPARE(builder.constructorCount(), 2); @@ -523,7 +523,7 @@ void tst_QMetaObjectBuilder::constructor() QCOMPARE(ctor2.parameterNames(), QList() << "c"); QCOMPARE(ctor2.tag(), QByteArray("Q_FOO")); QCOMPARE(ctor2.access(), QMetaMethod::Protected); - QCOMPARE(ctor2.attributes(), 24); + QCOMPARE(ctor2.attributes(), QMetaMethod::Compatibility); QCOMPARE(ctor2.index(), 0); // Perform index-based lookup again.