diff options
author | Christian Tismer <tismer@stackless.com> | 2018-10-26 16:58:09 +0200 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2018-10-29 08:35:21 +0000 |
commit | 6978325323208c395d135f19847a8ad0b13f93f9 (patch) | |
tree | 55f1e5bdbedd8b3fe77cdb7fe349fc6602fd8f7d /sources/shiboken2/libshiboken/basewrapper.h | |
parent | ae51319fa8a7c02642f5d35f5d613c22e9ce8ecb (diff) |
Fix Memory Leak Caused By Wrong Limited API Default
When a type has nullptr as tp_dealloc, there apply different defaults.
Static types had object_dealloc as default, while new heaptypes
created with type_new have subtype_dealloc as default.
A problem was now that PyType_FromSpec also has
subtype_dealloc as default. But that is wrong, because a type that
was written with the static type approach is already written with
object_dealloc in mind and takes somehow care about further issues
with that type.
When we now convert this type and suddenly use subtype_dealloc
instead of object_dealloc, things get pretty wrong.
Finding that out was pretty hard and took quite long to understand.
The fix was then very easy and is the best proof:
Replacing our former (wrong) solution of supplying an
SbkDummyDealloc with a function object_dealloc works perfectly,
and the leakage completely vanished.
The documentation now is also corrected.
Task-number: PYSIDE-832
Change-Id: Ifc20c28172eb5663cd5e60dac52e0a43acfb626c
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/shiboken2/libshiboken/basewrapper.h')
-rw-r--r-- | sources/shiboken2/libshiboken/basewrapper.h | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/sources/shiboken2/libshiboken/basewrapper.h b/sources/shiboken2/libshiboken/basewrapper.h index 06b17a151..134a3bc51 100644 --- a/sources/shiboken2/libshiboken/basewrapper.h +++ b/sources/shiboken2/libshiboken/basewrapper.h @@ -109,17 +109,15 @@ LIBSHIBOKEN_API PyObject* SbkObjectTpNew(PyTypeObject* subtype, PyObject*, PyObj LIBSHIBOKEN_API PyObject* SbkQAppTpNew(PyTypeObject *subtype, PyObject *args, PyObject *kwds); /** - * PYSIDE-595: Use a null deallocator instead of nullptr. + * PYSIDE-832: Use object_dealloc instead of nullptr. * * When moving to heaptypes, we were struck by a special default behavior of * PyType_FromSpecWithBases that inserts subtype_dealloc when tp_dealloc is - * nullptr. To prevent inserting this, we use a null deallocator that is there - * as a placeholder. - * - * The same holds for a null tp_new. We use one that raises the right error. + * nullptr. But the default before conversion to heaptypes was to assign + * object_dealloc. This seems to be a bug in the Limited API. */ -LIBSHIBOKEN_API void SbkDummyDealloc(PyObject*); -LIBSHIBOKEN_API PyObject *SbkDummyNew(PyTypeObject *type, PyObject*, PyObject*); +LIBSHIBOKEN_API void object_dealloc(PyObject *); +LIBSHIBOKEN_API PyObject *SbkDummyNew(PyTypeObject *type, PyObject *, PyObject *); } // extern "C" |