diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-09-26 09:31:47 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-09-30 10:12:07 +0200 |
| commit | 5d7bdfcd5c9e3748a041a9bd4069937adaf89129 (patch) | |
| tree | c875f5112c54721c8d36e9e3af99f39f336d8a01 /sources/pyside6/libpyside/signalmanager.cpp | |
| parent | 8464c8af6541d07dea3c9552071209585925985b (diff) | |
libpyside/signalmanager: Change metaObjectAttr to be an immortal string
Pick-to: 6.10
Task-number: PYSIDE-3155
Change-Id: I808bd38b57650bb5a4f6933fbc00aa3086279693
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/signalmanager.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index d08fb56bf..8fcb2aca7 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -38,7 +38,11 @@ using namespace Qt::StringLiterals; #error QSLOT_CODE and/or QSIGNAL_CODE changed! change the hardcoded stuff to the correct value! #endif -static PyObject *metaObjectAttr = nullptr; +PyObject *metaObjectAttr() +{ + static PyObject *const s = Shiboken::String::createStaticString("__METAOBJECT__"); + return s; +} static int pyObjectWrapperMetaTypeId = QMetaType::UnknownType; @@ -309,9 +313,6 @@ void SignalManager::init() Shiboken::Conversions::registerConverterName(converter, "object"); Shiboken::Conversions::registerConverterName(converter, "PyObjectWrapper"); Shiboken::Conversions::registerConverterName(converter, "PySide::PyObjectWrapper"); - - if (!metaObjectAttr) - metaObjectAttr = Shiboken::String::fromCString("__METAOBJECT__"); } void SignalManager::setQmlMetaCallErrorHandler(QmlMetaCallErrorHandler handler) @@ -620,13 +621,13 @@ static MetaObjectBuilder *metaBuilderFromDict(PyObject *dict) // no GIL. // Note that "SignalManager::registerMetaMethodGetIndex" has write actions // that might involve the interpreter, but in that context the GIL is held. - if (!dict || !PyDict_Contains(dict, metaObjectAttr)) + if (!dict || !PyDict_Contains(dict, metaObjectAttr())) return nullptr; // PYSIDE-813: The above assumption is not true in debug mode: // PyDict_GetItem would touch PyThreadState_GET and the global error state. // PyDict_GetItemWithError instead can work without GIL. - PyObject *pyBuilder = PyDict_GetItemWithError(dict, metaObjectAttr); + PyObject *pyBuilder = PyDict_GetItemWithError(dict, metaObjectAttr()); return reinterpret_cast<MetaObjectBuilder *>(PyCapsule_GetPointer(pyBuilder, nullptr)); } @@ -700,7 +701,7 @@ static int addMetaMethod(QObject *source, const QByteArray &signature, if (dmo == nullptr) { dmo = new MetaObjectBuilder(Py_TYPE(pySelf), metaObject); PyObject *pyDmo = PyCapsule_New(dmo, nullptr, destroyMetaObject); - PyObject_SetAttr(pySelf, metaObjectAttr, pyDmo); + PyObject_SetAttr(pySelf, metaObjectAttr(), pyDmo); Py_DECREF(pyDmo); } |
