diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-09-26 14:56:39 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-10-01 16:04:42 +0200 |
| commit | 60d5a5b05041e05556becbf1ce6efada6e477421 (patch) | |
| tree | 694958029de8b97c03a8a907ff8a3f4c1e649846 | |
| parent | d2f9814c62ee6904cdcbc66c03fdde3f476fa34b (diff) | |
libpyside: Add qobjectType() to return the Python type QObject
Set it directly instead of looking it up via converters, which
is a step towards decoupling the converters from the per-interpreter
types and saves dict lookups.
Task-number: PYSIDE-3155
Change-Id: I31a71d1a9d02f1247e04c57de2c2901746221b4f
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
| -rw-r--r-- | sources/pyside6/PySide6/QtCore/typesystem_core_common.xml | 2 | ||||
| -rw-r--r-- | sources/pyside6/PySide6/glue/qtcore.cpp | 4 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pyside.cpp | 22 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysideqobject.h | 7 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 2 | ||||
| -rw-r--r-- | sources/pyside6/libpysideqml/pysideqmlattached.cpp | 3 | ||||
| -rw-r--r-- | sources/pyside6/libpysideqml/pysideqmlextended.cpp | 3 | ||||
| -rw-r--r-- | sources/pyside6/libpysideqml/pysideqmllistproperty.cpp | 18 | ||||
| -rw-r--r-- | sources/pyside6/libpysideqml/pysideqmlregistertype.cpp | 13 | ||||
| -rw-r--r-- | sources/pyside6/libpysideqml/pysideqmlregistertype_p.h | 3 | ||||
| -rw-r--r-- | sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp | 13 |
11 files changed, 49 insertions, 41 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml index f4354f814..efddc9085 100644 --- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml +++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml @@ -1830,6 +1830,8 @@ </extra-includes> <inject-code class="native" position="beginning" file="../glue/qtcore.cpp" snippet="core-snippets-p-h"/> + <inject-code class="target" position="end" file="../glue/qtcore.cpp" + snippet="libpyside-set-qobject-type"/> <modify-function signature="metaObject()const"> <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qobject-metaobject"/> <modify-argument index="return"> diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp index 7fe6e9902..51549f6b1 100644 --- a/sources/pyside6/PySide6/glue/qtcore.cpp +++ b/sources/pyside6/PySide6/glue/qtcore.cpp @@ -15,6 +15,10 @@ #include "glue/core_snippets_p.h" // @snippet core-snippets-p-h +// @snippet libpyside-set-qobject-type +PySide::setQObjectType(pyType); +// @snippet libpyside-set-qobject-type + // @snippet qarg_helper // Helper for the Q_ARG/Q_RETURN_ARG functions, creating a meta type diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index 4030673a5..ca467c6c1 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -436,7 +436,7 @@ void destroyQCoreApplication() Shiboken::BindingManager &bm = Shiboken::BindingManager::instance(); SbkObject *pyQApp = bm.retrieveWrapper(app); - PyTypeObject *pyQObjectType = Shiboken::Conversions::getPythonTypeObject("QObject*"); + PyTypeObject *pyQObjectType = PySide::qObjectType(); assert(pyQObjectType); void *data[2] = {pyQApp, pyQObjectType}; @@ -507,7 +507,7 @@ const QMetaObject *retrieveMetaObject(PyObject *pyObj) void initQObjectSubType(PyTypeObject *type, PyObject *args, PyObject * /* kwds */) { - PyTypeObject *qObjType = Shiboken::Conversions::getPythonTypeObject("QObject*"); + PyTypeObject *qObjType = PySide::qObjectType(); PyObject *bases = PyTuple_GetItem(args, 1); @@ -1020,18 +1020,26 @@ bool registerInternalQtConf() return isRegistered; } -static PyTypeObject *qobjectType() +static PyTypeObject *qObjType = nullptr; + +PyTypeObject *qObjectType() { - static PyTypeObject * const result = Shiboken::Conversions::getPythonTypeObject("QObject*"); + PyTypeObject *result = qObjType; + Q_ASSERT(result); return result; } +void setQObjectType(PyTypeObject *t) +{ + qObjType = t; +} + bool isQObjectDerived(PyTypeObject *pyType, bool raiseError) { - const bool result = PyType_IsSubtype(pyType, qobjectType()); + const bool result = PyType_IsSubtype(pyType, qObjectType()); if (!result && raiseError) { PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.", - qobjectType()->tp_name, pyType->tp_name); + qObjectType()->tp_name, pyType->tp_name); } return result; } @@ -1048,7 +1056,7 @@ QObject *convertToQObject(PyObject *object, bool raiseError) return nullptr; auto *sbkObject = reinterpret_cast<SbkObject*>(object); - auto *ptr = Shiboken::Object::cppPointer(sbkObject, qobjectType()); + auto *ptr = Shiboken::Object::cppPointer(sbkObject, qObjectType()); if (ptr == nullptr) { if (raiseError) { PyErr_Format(PyExc_TypeError, "Conversion of %s to QObject failed.", diff --git a/sources/pyside6/libpyside/pysideqobject.h b/sources/pyside6/libpyside/pysideqobject.h index 41762b009..a6248ef6c 100644 --- a/sources/pyside6/libpyside/pysideqobject.h +++ b/sources/pyside6/libpyside/pysideqobject.h @@ -19,6 +19,13 @@ QT_FORWARD_DECLARE_CLASS(QMutex) namespace PySide { +/// Return PyTypeObject for QObject +/// \return type object +PYSIDE_API PyTypeObject *qObjectType(); + +/// Set the PyTypeObject for QObject to \a t (called from QtCore module). +PYSIDE_API void setQObjectType(PyTypeObject *t); + /// Fill QObject properties and do signal connections using the values found in \p kwds dictionary. /// \param qObj PyObject fot the QObject. /// \param metaObj QMetaObject of \p qObj. diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp index 16a7c9c29..659e3fa62 100644 --- a/sources/pyside6/libpyside/pysidesignal.cpp +++ b/sources/pyside6/libpyside/pysidesignal.cpp @@ -1083,7 +1083,7 @@ static void instanceInitialize(PySideSignalInstance *self, PyObject *name, PySideSignalInstance *initialize(PySideSignal *self, PyObject *name, PyObject *object) { - static PyTypeObject *pyQObjectType = Shiboken::Conversions::getPythonTypeObject("QObject*"); + PyTypeObject *pyQObjectType = PySide::qObjectType(); assert(pyQObjectType); if (!PyObject_TypeCheck(object, pyQObjectType)) { diff --git a/sources/pyside6/libpysideqml/pysideqmlattached.cpp b/sources/pyside6/libpysideqml/pysideqmlattached.cpp index e4e9c16dd..c0c6843b8 100644 --- a/sources/pyside6/libpysideqml/pysideqmlattached.cpp +++ b/sources/pyside6/libpysideqml/pysideqmlattached.cpp @@ -7,6 +7,7 @@ #include "pysideqmlregistertype_p.h" #include <signalmanager.h> +#include <pysideqobject.h> #include <pyside_p.h> #include <pysideclassdecorator_p.h> @@ -106,7 +107,7 @@ static QObject *attachedFactoryHelper(PyTypeObject *attachingType, QObject *o) return nullptr; } - if (PyType_IsSubtype(pyResult->ob_type, qObjectType()) == 0) { + if (PyType_IsSubtype(pyResult->ob_type, PySide::qObjectType()) == 0) { qWarning("QmlAttached: Attached objects must inherit QObject, got %s.", PepType_GetFullyQualifiedNameStr(Py_TYPE(pyResult))); return nullptr; diff --git a/sources/pyside6/libpysideqml/pysideqmlextended.cpp b/sources/pyside6/libpysideqml/pysideqmlextended.cpp index f26fb9f89..cf08c1889 100644 --- a/sources/pyside6/libpysideqml/pysideqmlextended.cpp +++ b/sources/pyside6/libpysideqml/pysideqmlextended.cpp @@ -7,6 +7,7 @@ #include <pyside_p.h> #include <pysideclassdecorator_p.h> +#include <pysideqobject.h> #include <autodecref.h> #include <gilstate.h> @@ -110,7 +111,7 @@ static QObject *extensionFactory(QObject *o) return nullptr; } - if (PyType_IsSubtype(pyResult->ob_type, qObjectType()) == 0) { + if (PyType_IsSubtype(pyResult->ob_type, PySide::qObjectType()) == 0) { qWarning("QmlExtended: Extension objects must inherit QObject, got %s.", PepType_GetFullyQualifiedNameStr(pyResult->ob_type)); return nullptr; diff --git a/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp b/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp index a48a3d4de..91bfaf044 100644 --- a/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp +++ b/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp @@ -15,6 +15,7 @@ #include <pysideproperty.h> #include <pysideproperty_p.h> +#include <pysideqobject.h> #include <QtCore/qobject.h> #include <QtQml/qqmllist.h> @@ -84,7 +85,7 @@ static int propListTpInit(PyObject *self, PyObject *args, PyObject *kwds) else data->doc.clear(); - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); if (!PySequence_Contains(data->type->tp_mro, reinterpret_cast<PyObject *>(qobjectType))) { PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.", @@ -143,7 +144,7 @@ void propListAppender(QQmlListProperty<QObject> *propList, QObject *item) Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(2)); - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); PyTuple_SetItem(args, 0, Shiboken::Conversions::pointerToPython(qobjectType, propList->object)); PyTuple_SetItem(args, 1, @@ -162,8 +163,9 @@ qsizetype propListCount(QQmlListProperty<QObject> *propList) Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(1)); + auto *qobjType = PySide::qObjectType(); PyTuple_SetItem(args, 0, - Shiboken::Conversions::pointerToPython(qObjectType(), propList->object)); + Shiboken::Conversions::pointerToPython(qobjType, propList->object)); auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->count, args)); @@ -187,7 +189,7 @@ QObject *propListAt(QQmlListProperty<QObject> *propList, qsizetype index) Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(2)); - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); PyTuple_SetItem(args, 0, Shiboken::Conversions::pointerToPython(qobjectType, propList->object)); auto *converter = Shiboken::Conversions::PrimitiveTypeConverter<qsizetype>(); @@ -211,7 +213,7 @@ void propListClear(QQmlListProperty<QObject> * propList) Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(1)); - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); PyTuple_SetItem(args, 0, Shiboken::Conversions::pointerToPython(qobjectType, propList->object)); @@ -228,7 +230,7 @@ void propListReplace(QQmlListProperty<QObject> *propList, qsizetype index, QObje Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(3)); - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); PyTuple_SetItem(args, 0, Shiboken::Conversions::pointerToPython(qobjectType, propList->object)); auto *converter = Shiboken::Conversions::PrimitiveTypeConverter<qsizetype>(); @@ -250,7 +252,7 @@ void propListRemoveLast(QQmlListProperty<QObject> *propList) Shiboken::GilState state; Shiboken::AutoDecRef args(PyTuple_New(1)); - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); PyTuple_SetItem(args, 0, Shiboken::Conversions::pointerToPython(qobjectType, propList->object)); @@ -268,7 +270,7 @@ void QmlListPropertyPrivate::metaCall(PyObject *source, QMetaObject::Call call, return; QObject *qobj{}; - PyTypeObject *qobjectType = qObjectType(); + PyTypeObject *qobjectType = PySide::qObjectType(); Shiboken::Conversions::pythonToCppPointer(qobjectType, source, &qobj); QQmlListProperty<QObject> declProp( qobj, this, diff --git a/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp b/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp index 7e93fb11e..003e1e1f8 100644 --- a/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp +++ b/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp @@ -51,14 +51,6 @@ static void createInto(void *memory, void *type) PySide::setNextQObjectMemoryAddr(nullptr); } -PyTypeObject *qObjectType() -{ - static PyTypeObject *const result = - Shiboken::Conversions::getPythonTypeObject("QObject*"); - assert(result); - return result; -} - static PyTypeObject *qQmlEngineType() { static PyTypeObject *const result = @@ -403,13 +395,14 @@ QObject *SingletonQObjectCreationBase::handleReturnValue(PyObject *retVal) PyErr_Format(PyExc_TypeError, "Callback returns 0 value."); return nullptr; } - if (isPythonToCppPointerConvertible(qObjectType(), retVal) == nullptr) { + auto *qobjType = PySide::qObjectType(); + if (isPythonToCppPointerConvertible(qobjType, retVal) == nullptr) { PyErr_Format(PyExc_TypeError, "Callback returns invalid value (%S).", retVal); return nullptr; } QObject *obj = nullptr; - Shiboken::Conversions::pythonToCppPointer(qObjectType(), retVal, &obj); + Shiboken::Conversions::pythonToCppPointer(qobjType, retVal, &obj); return obj; } diff --git a/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h b/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h index 1f26d9c56..8545da931 100644 --- a/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h +++ b/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h @@ -8,9 +8,6 @@ #include <QtCore/qbytearray.h> -PyTypeObject *qObjectType(); - - namespace PySide::Qml { PyObject *qmlNamedElementMacro(PyObject *pyObj, const QByteArray &typeName); diff --git a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp index d0b2bfb96..30ea9a6d1 100644 --- a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp +++ b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp @@ -51,16 +51,9 @@ PyObject *propertiesAttr() struct SourceDefs { - static PyTypeObject *getSbkType() - { - static PyTypeObject *sbkType = - Shiboken::Conversions::getPythonTypeObject("QObject"); - return sbkType; - } - static PyObject *getBases() { - static PyObject *bases = PyTuple_Pack(1, getSbkType()); + static PyObject *bases = PyTuple_Pack(1, PySide::qObjectType()); return bases; } @@ -71,8 +64,8 @@ struct SourceDefs static int tp_init(PyObject *self, PyObject *args, PyObject *kwds) { - static initproc initFunc = reinterpret_cast<initproc>(PyType_GetSlot(getSbkType(), - Py_tp_init)); + static initproc initFunc = + reinterpret_cast<initproc>(PyType_GetSlot(PySide::qObjectType(), Py_tp_init)); int res = initFunc(self, args, kwds); if (res < 0) { PyErr_Print(); |
