diff options
author | Christian Tismer <tismer@stackless.com> | 2023-06-01 20:14:45 +0200 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2023-06-06 10:12:25 +0200 |
commit | 30a684904419922d7bd9857d889addc6ac444efd (patch) | |
tree | 3cdb41c02176e0b4c641357d76e5fff30ef49573 /sources/shiboken6/libshiboken/basewrapper.cpp | |
parent | 0bf8ce7022f55dd816f5f0c3e8209f515e411c76 (diff) |
Shiboken: Remove an old patch that is no longer necessary
An old refcounting problem from 2019 was fixed by a crude
patch to class creation in basewrapper.cpp .
This patch now creates an assertion error in debug mode
when running the test for issue PYSIDE-2354.
The problem was actually a CPython bug and does only exist
in Python 3.8 until Python 3.9.12, for all other versions
it works fine.
See https://github.com/python/cpython/issues/92112
[ChangeLog][shiboken6] An old patch for a Python 3.8-3.9.13 error was
timed out and removed from current versions.
Task-number: PYSIDE-939
Task-number: PYSIDE-2354
Change-Id: I6c077294dc61491b47b6e75e95fd669144fa0471
Pick-to: 6.5
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
Diffstat (limited to 'sources/shiboken6/libshiboken/basewrapper.cpp')
-rw-r--r-- | sources/shiboken6/libshiboken/basewrapper.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/sources/shiboken6/libshiboken/basewrapper.cpp b/sources/shiboken6/libshiboken/basewrapper.cpp index 4a5b54d23..b01d01685 100644 --- a/sources/shiboken6/libshiboken/basewrapper.cpp +++ b/sources/shiboken6/libshiboken/basewrapper.cpp @@ -490,16 +490,20 @@ static PyTypeObject *SbkObjectType_tp_new(PyTypeObject *metatype, PyObject *args } } - // PYSIDE-939: This is a temporary patch that circumvents the problem - // with Py_TPFLAGS_METHOD_DESCRIPTOR until this is finally solved. - // PyType_Ready uses mro(). We need to temporarily remove the flag from it's type. - // We cannot use PyMethodDescr_Type since it is not exported by Python 2.7 . - static PyTypeObject *PyMethodDescr_TypePtr = Py_TYPE( - PyObject_GetAttr(reinterpret_cast<PyObject *>(&PyType_Type), Shiboken::PyName::mro())); - auto hold = PyMethodDescr_TypePtr->tp_flags; - PyMethodDescr_TypePtr->tp_flags &= ~Py_TPFLAGS_METHOD_DESCRIPTOR; - auto *newType = PepType_Type_tp_new(metatype, args, kwds); - PyMethodDescr_TypePtr->tp_flags = hold; + // PYSIDE-939: This is still a temporary patch that circumvents the problem + // with Py_TPFLAGS_METHOD_DESCRIPTOR. The problem exists in Python 3.8 + // until 3.9.12, only. We check the runtime and hope for this version valishing. + // https://github.com/python/cpython/issues/92112 will not be fixed for 3.8 :/ + PyTypeObject *newType{}; + static auto triplet = _PepRuntimeVersion(); + if (triplet >= (3 << 16 | 8 << 8 | 0) && triplet < (3 << 16 | 9 << 8 | 13)) { + auto hold = PyMethodDescr_Type.tp_flags; + PyMethodDescr_Type.tp_flags &= ~Py_TPFLAGS_METHOD_DESCRIPTOR; + newType = PepType_Type_tp_new(metatype, args, kwds); + PyMethodDescr_Type.tp_flags = hold; + } else { + newType = PepType_Type_tp_new(metatype, args, kwds); + } if (!newType) return nullptr; |