summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2021-05-07 09:21:23 +0200
committerFabian Kosmale <fabian.kosmale@qt.io>2021-05-07 21:50:58 +0200
commit300dec66ce18b63a08027ef9f200117e87902274 (patch)
treeab4719e81ceff1f7268a358f93a4d7a289e73c92 /src/corelib
parentd5c3e1336bce42df53d4b525237244486ba5422d (diff)
QMetaMethod: Store method constness in metaobject system
[ChangeLog][QtCore][QMetaMethod] It is now possible to query the constness of a method with QMetaMethod::isConst. Change-Id: I8a94480b8074ef5b30555aeccd64937c4c6d97d4 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp17
-rw-r--r--src/corelib/kernel/qmetaobject.h1
-rw-r--r--src/corelib/kernel/qmetaobject_p.h5
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp22
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder_p.h3
5 files changed, 47 insertions, 1 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index a574bec179..b09fe933e6 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -2140,6 +2140,23 @@ int QMetaMethod::revision() const
}
/*!
+ \since 6.2
+
+ Returns whether the method is const qualified.
+
+ \note This method might errorneously return \false for a const method
+ if it belongs to a library compiled against an older version of Qt.
+ */
+bool QMetaMethod::isConst() const
+{
+ if (!mobj)
+ return false;
+ if (QMetaObjectPrivate::get(mobj)->revision < 10)
+ return false;
+ return data.flags() & MethodIsConst;
+}
+
+/*!
Returns the access specification of this method (private,
protected, or public).
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index 1e9a0097fb..6fe259868f 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -77,6 +77,7 @@ public:
int methodIndex() const;
int relativeMethodIndex() const;
int revision() const;
+ bool isConst() const;
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index e35d0b5e0c..35aa6ea6b9 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -98,7 +98,9 @@ enum MethodFlags {
MethodCompatibility = 0x10,
MethodCloned = 0x20,
MethodScriptable = 0x40,
- MethodRevisioned = 0x80
+ MethodRevisioned = 0x80,
+
+ MethodIsConst = 0x100, // no use case for volatile so far
};
enum MetaObjectFlag {
@@ -173,6 +175,7 @@ struct QMetaObjectPrivate
// revision 8 is Qt 5.12: It adds the enum name to QMetaEnum
// revision 9 is Qt 6.0: It adds the metatype of properties and methods
// revision 10 is Qt 6.2: The metatype of the metaobject is stored in the metatypes array
+ // and metamethods store a flag stating whether they are const
enum { OutputRevision = 10 }; // Used by moc, qmetaobjectbuilder and qdbus
enum { IntsPerMethod = QMetaMethod::Data::Size };
enum { IntsPerEnum = QMetaEnum::Data::Size };
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index d46adf05fb..8513805ef4 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -1743,6 +1743,28 @@ void QMetaMethodBuilder::setAttributes(int value)
}
/*!
+ Returns true if the method is const qualified.
+ */
+int QMetaMethodBuilder::isConst() const
+{
+ QMetaMethodBuilderPrivate *d = d_func();
+ if (!d)
+ return false;
+ return (d->attributes & MethodIsConst);
+}
+
+void QMetaMethodBuilder::setConst(bool methodIsConst)
+{
+ QMetaMethodBuilderPrivate *d = d_func();
+ if (!d)
+ return;
+ if (methodIsConst)
+ d->attributes |= MethodIsConst;
+ else
+ d->attributes &= ~MethodIsConst;
+}
+
+/*!
Returns the revision of this method.
\sa setRevision()
diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h
index 0435e9cd97..429a05238e 100644
--- a/src/corelib/kernel/qmetaobjectbuilder_p.h
+++ b/src/corelib/kernel/qmetaobjectbuilder_p.h
@@ -204,6 +204,9 @@ public:
int attributes() const;
void setAttributes(int value);
+ int isConst() const;
+ void setConst(bool methodIsConst=true);
+
int revision() const;
void setRevision(int revision);