aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp')
-rw-r--r--sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp28
1 files changed, 12 insertions, 16 deletions
diff --git a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
index 30ea9a6d1..17ba5a3a3 100644
--- a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
+++ b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
@@ -9,6 +9,7 @@
#include "pysidecapsulemethod_p.h"
#include "pysiderephandler_p.h"
+#include <autodecref.h>
#include <basewrapper.h>
#include <sbkpep.h>
#include <sbkconverter.h>
@@ -407,16 +408,14 @@ PyTypeObject *createDynamicClassImpl(QMetaObject *meta)
METH_VARARGS,
nullptr
};
+
+ auto *obType = reinterpret_cast<PyObject *>(type);
for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) {
// Create a PropertyCapsule for each property to store the info needed for
// the handler. Assign the __get__ and (if needed) __set__ attributes to a
// PySideProperty which becomes the attribute set on the new type.
auto metaProperty = meta->property(i);
- PyObject *kwds = PyDict_New();
auto metaType = metaProperty.metaType();
- auto *pyPropertyType = PyUnicode_FromString(metaType.name());
- PyDict_SetItemString(kwds, "type", pyPropertyType);
- Py_DECREF(pyPropertyType);
method.ml_name = metaProperty.name();
auto *pc = new PropertyCapsule{metaProperty.name(), i, i - meta->propertyOffset()};
@@ -425,25 +424,22 @@ PyTypeObject *createDynamicClassImpl(QMetaObject *meta)
});
auto capsulePropObject = make_capsule_property(&method, capsule,
metaProperty.isWritable());
- PyObject *fget = PyObject_GetAttrString(capsulePropObject, "__get__");
- PyDict_SetItemString(kwds, "fget", fget);
+ Shiboken::AutoDecRef fget(PyObject_GetAttrString(capsulePropObject, "__get__"));
+ Shiboken::AutoDecRef fset;
+ Shiboken::AutoDecRef notifySignature;
if (metaProperty.isWritable()) {
- PyObject *fset = PyObject_GetAttrString(capsulePropObject, "__set__");
- PyDict_SetItemString(kwds, "fset", fset);
+ fset.reset(PyObject_GetAttrString(capsulePropObject, "__set__"));
if (metaProperty.hasNotifySignal()) {
auto nameString = metaProperty.notifySignal().name();
- auto *notify = PyObject_GetAttrString(reinterpret_cast<PyObject *>(type),
- nameString.constData());
- PyDict_SetItemString(kwds, "notify", notify);
+ notifySignature.reset(PyObject_GetAttrString(obType, nameString.constData()));
}
}
- PyObject *pyProperty = PyObject_Call(reinterpret_cast<PyObject *>(PySideProperty_TypeF()),
- PyTuple_New(0), kwds);
- if (PyObject_SetAttrString(reinterpret_cast<PyObject *>(type),
- metaProperty.name(), pyProperty) < 0) {
+ Shiboken::AutoDecRef pyProperty(PySide::Property::create(metaType.name(), fget, fset, notifySignature));
+ if (pyProperty.isNull()
+ || PyObject_SetAttrString(obType, metaProperty.name(), pyProperty.object()) < 0) {
+ PyErr_Print();
return nullptr;
}
- Py_DECREF(pyProperty);
}
for (int i = meta->methodOffset(); i < meta->methodCount(); ++i) {
// Create a CapsuleMethod for each Slot method to store the info needed