[Python-checkins] bpo-44116: Add GC support to _csv heap types (GH-26074)

pablogsal webhook-mailer at python.org
Wed May 12 14:19:13 EDT 2021


https://github.com/python/cpython/commit/e5ba1fe995d4b4f3f6a089a7ec4dd186dd573830
commit: e5ba1fe995d4b4f3f6a089a7ec4dd186dd573830
branch: main
author: Erlend Egeberg Aasland <erlend.aasland at innova.no>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-05-12T19:18:58+01:00
summary:

bpo-44116: Add GC support to _csv heap types (GH-26074)

files:
M Modules/_csv.c

diff --git a/Modules/_csv.c b/Modules/_csv.c
index bdb67fdb4876f..a213734f50806 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -316,17 +316,12 @@ static void
 Dialect_dealloc(DialectObj *self)
 {
     PyTypeObject *tp = Py_TYPE(self);
-    Py_CLEAR(self->lineterminator);
-    tp->tp_free((PyObject *)self);
+    PyObject_GC_UnTrack(self);
+    tp->tp_clear((PyObject *)self);
+    PyObject_GC_Del(self);
     Py_DECREF(tp);
 }
 
-static void
-Dialect_finalize(DialectObj *self)
-{
-    Py_CLEAR(self->lineterminator);
-}
-
 static char *dialect_kws[] = {
     "dialect",
     "delimiter",
@@ -512,21 +507,37 @@ PyDoc_STRVAR(Dialect_Type_doc,
 "\n"
 "The Dialect type records CSV parsing and generation options.\n");
 
+static int
+Dialect_clear(DialectObj *self)
+{
+    Py_CLEAR(self->lineterminator);
+    return 0;
+}
+
+static int
+Dialect_traverse(DialectObj *self, visitproc visit, void *arg)
+{
+    Py_VISIT(self->lineterminator);
+    Py_VISIT(Py_TYPE(self));
+    return 0;
+}
+
 static PyType_Slot Dialect_Type_slots[] = {
     {Py_tp_doc, (char*)Dialect_Type_doc},
     {Py_tp_members, Dialect_memberlist},
     {Py_tp_getset, Dialect_getsetlist},
     {Py_tp_new, dialect_new},
     {Py_tp_methods, dialect_methods},
-    {Py_tp_finalize, Dialect_finalize},
     {Py_tp_dealloc, Dialect_dealloc},
+    {Py_tp_clear, Dialect_clear},
+    {Py_tp_traverse, Dialect_traverse},
     {0, NULL}
 };
 
 PyType_Spec Dialect_Type_spec = {
     .name = "_csv.Dialect",
     .basicsize = sizeof(DialectObj),
-    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
     .slots = Dialect_Type_slots,
 };
 
@@ -885,9 +896,7 @@ Reader_dealloc(ReaderObj *self)
 {
     PyTypeObject *tp = Py_TYPE(self);
     PyObject_GC_UnTrack(self);
-    Py_CLEAR(self->dialect);
-    Py_CLEAR(self->input_iter);
-    Py_CLEAR(self->fields);
+    tp->tp_clear((PyObject *)self);
     if (self->field != NULL) {
         PyMem_Free(self->field);
         self->field = NULL;
@@ -896,24 +905,13 @@ Reader_dealloc(ReaderObj *self)
     Py_DECREF(tp);
 }
 
-static void
-Reader_finalize(ReaderObj *self)
-{
-    Py_CLEAR(self->dialect);
-    Py_CLEAR(self->input_iter);
-    Py_CLEAR(self->fields);
-    if (self->field != NULL) {
-        PyMem_Free(self->field);
-        self->field = NULL;
-    }
-}
-
 static int
 Reader_traverse(ReaderObj *self, visitproc visit, void *arg)
 {
     Py_VISIT(self->dialect);
     Py_VISIT(self->input_iter);
     Py_VISIT(self->fields);
+    Py_VISIT(Py_TYPE(self));
     return 0;
 }
 
@@ -948,12 +946,11 @@ static struct PyMemberDef Reader_memberlist[] = {
 static PyType_Slot Reader_Type_slots[] = {
     {Py_tp_doc, (char*)Reader_Type_doc},
     {Py_tp_traverse, Reader_traverse},
-    {Py_tp_clear, Reader_clear},
     {Py_tp_iter, PyObject_SelfIter},
     {Py_tp_iternext, Reader_iternext},
     {Py_tp_methods, Reader_methods},
     {Py_tp_members, Reader_memberlist},
-    {Py_tp_finalize, Reader_finalize},
+    {Py_tp_clear, Reader_clear},
     {Py_tp_dealloc, Reader_dealloc},
     {0, NULL}
 };
@@ -1339,6 +1336,7 @@ Writer_traverse(WriterObj *self, visitproc visit, void *arg)
     Py_VISIT(self->dialect);
     Py_VISIT(self->write);
     Py_VISIT(self->error_obj);
+    Py_VISIT(Py_TYPE(self));
     return 0;
 }
 
@@ -1352,12 +1350,16 @@ Writer_clear(WriterObj *self)
 }
 
 static void
-Writer_finalize(WriterObj *self)
+Writer_dealloc(WriterObj *self)
 {
-    Writer_clear(self);
+    PyTypeObject *tp = Py_TYPE(self);
+    PyObject_GC_UnTrack(self);
+    tp->tp_clear((PyObject *)self);
     if (self->rec != NULL) {
         PyMem_Free(self->rec);
     }
+    PyObject_GC_Del(self);
+    Py_DECREF(tp);
 }
 
 PyDoc_STRVAR(Writer_Type_doc,
@@ -1368,10 +1370,10 @@ PyDoc_STRVAR(Writer_Type_doc,
 );
 
 static PyType_Slot Writer_Type_slots[] = {
-    {Py_tp_finalize, Writer_finalize},
     {Py_tp_doc, (char*)Writer_Type_doc},
     {Py_tp_traverse, Writer_traverse},
     {Py_tp_clear, Writer_clear},
+    {Py_tp_dealloc, Writer_dealloc},
     {Py_tp_methods, Writer_methods},
     {Py_tp_members, Writer_memberlist},
     {0, NULL}



More information about the Python-checkins mailing list