summaryrefslogtreecommitdiffstats
path: root/Doc/extending
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2021-10-28 19:22:57 (GMT)
committerGitHub <noreply@github.com>2021-10-28 19:22:57 (GMT)
commit9e0012116ac9e8d26bf19ef8741deeecf2b6f72b (patch)
tree95dc6fd9733e9fabaa60572d66f1bd9cae7ed181 /Doc/extending
parent54579087c69f95531cbe7a97401c67f104a3e52f (diff)
downloadcpython-9e0012116ac9e8d26bf19ef8741deeecf2b6f72b.zip
cpython-9e0012116ac9e8d26bf19ef8741deeecf2b6f72b.tar.gz
cpython-9e0012116ac9e8d26bf19ef8741deeecf2b6f72b.tar.bz2
[3.10] bpo-28737: Document when tp_dealloc should call PyObject_GC_UnTrack() (GH-29246) (GH-29249)
Objects that support garbage collection ("container" objects) should call PyObject_GC_UnTrack() from their destructors before clearing any fields which may point to other "container" objects. (cherry picked from commit 35e1ff38ee67ee543d9fcb268c3552c5397f9b3f) Co-authored-by: Sam Gross <colesbury@gmail.com>
Diffstat (limited to 'Doc/extending')
-rw-r--r--Doc/extending/newtypes.rst14
1 files changed, 13 insertions, 1 deletions
diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst
index 6e17897..23ec8bc 100644
--- a/Doc/extending/newtypes.rst
+++ b/Doc/extending/newtypes.rst
@@ -73,7 +73,19 @@ function::
newdatatype_dealloc(newdatatypeobject *obj)
{
free(obj->obj_UnderlyingDatatypePtr);
- Py_TYPE(obj)->tp_free(obj);
+ Py_TYPE(obj)->tp_free((PyObject *)obj);
+ }
+
+If your type supports garbage collection, the destructor should call
+:c:func:`PyObject_GC_UnTrack` before clearing any member fields::
+
+ static void
+ newdatatype_dealloc(newdatatypeobject *obj)
+ {
+ PyObject_GC_UnTrack(obj);
+ Py_CLEAR(obj->other_obj);
+ ...
+ Py_TYPE(obj)->tp_free((PyObject *)obj);
}
.. index::