From edf17d8798e65c10c970ef86f7374f6c1b51027a Mon Sep 17 00:00:00 2001 From: Thomas Wouters Date: Sat, 15 Apr 2006 17:28:34 +0000 Subject: Use Py_CLEAR instead of in-place DECREF/XDECREF or custom macros, for tp_clear methods. --- Modules/_csv.c | 15 +++++---------- Modules/cPickle.c | 38 +++++++++++++++++--------------------- Modules/collectionsmodule.c | 5 +---- Modules/pyexpat.c | 3 +-- Objects/cellobject.c | 3 +-- Objects/funcobject.c | 4 +--- Objects/typeobject.c | 13 ++----------- Python/traceback.c | 6 ++---- 8 files changed, 30 insertions(+), 57 deletions(-) diff --git a/Modules/_csv.c b/Modules/_csv.c index 902ea9e..88c7248 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -828,12 +828,9 @@ Reader_traverse(ReaderObj *self, visitproc visit, void *arg) static int Reader_clear(ReaderObj *self) { - Py_XDECREF(self->dialect); - Py_XDECREF(self->input_iter); - Py_XDECREF(self->fields); - self->dialect = NULL; - self->input_iter = NULL; - self->fields = NULL; + Py_CLEAR(self->dialect); + Py_CLEAR(self->input_iter); + Py_CLEAR(self->fields); return 0; } @@ -1260,10 +1257,8 @@ Writer_traverse(WriterObj *self, visitproc visit, void *arg) static int Writer_clear(WriterObj *self) { - Py_XDECREF(self->dialect); - Py_XDECREF(self->writeline); - self->dialect = NULL; - self->writeline = NULL; + Py_CLEAR(self->dialect); + Py_CLEAR(self->writeline); return 0; } diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 69e15e2..1d99fcb 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -2931,16 +2931,14 @@ Pickler_traverse(Picklerobject *self, visitproc visit, void *arg) static int Pickler_clear(Picklerobject *self) { -#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL; - CLEAR(self->write); - CLEAR(self->memo); - CLEAR(self->fast_memo); - CLEAR(self->arg); - CLEAR(self->file); - CLEAR(self->pers_func); - CLEAR(self->inst_pers_func); - CLEAR(self->dispatch_table); -#undef CLEAR + Py_CLEAR(self->write); + Py_CLEAR(self->memo); + Py_CLEAR(self->fast_memo); + Py_CLEAR(self->arg); + Py_CLEAR(self->file); + Py_CLEAR(self->pers_func); + Py_CLEAR(self->inst_pers_func); + Py_CLEAR(self->dispatch_table); return 0; } @@ -5284,17 +5282,15 @@ Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg) static int Unpickler_clear(Unpicklerobject *self) { -#define CLEAR(SLOT) Py_XDECREF(SLOT); SLOT = NULL - CLEAR(self->readline); - CLEAR(self->read); - CLEAR(self->file); - CLEAR(self->memo); - CLEAR(self->stack); - CLEAR(self->pers_func); - CLEAR(self->arg); - CLEAR(self->last_string); - CLEAR(self->find_class); -#undef CLEAR + Py_CLEAR(self->readline); + Py_CLEAR(self->read); + Py_CLEAR(self->file); + Py_CLEAR(self->memo); + Py_CLEAR(self->stack); + Py_CLEAR(self->pers_func); + Py_CLEAR(self->arg); + Py_CLEAR(self->last_string); + Py_CLEAR(self->find_class); return 0; } diff --git a/Modules/collectionsmodule.c b/Modules/collectionsmodule.c index 5bccc7c..c7e2c85 100644 --- a/Modules/collectionsmodule.c +++ b/Modules/collectionsmodule.c @@ -1236,10 +1236,7 @@ defdict_traverse(PyObject *self, visitproc visit, void *arg) static int defdict_tp_clear(defdictobject *dd) { - if (dd->default_factory != NULL) { - Py_DECREF(dd->default_factory); - dd->default_factory = NULL; - } + Py_CLEAR(dd->default_factory); return PyDict_Type.tp_clear((PyObject *)dd); } diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index b6e927d..fbef4e1 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1669,8 +1669,7 @@ static int xmlparse_clear(xmlparseobject *op) { clear_handlers(op, 0); - Py_XDECREF(op->intern); - op->intern = 0; + Py_CLEAR(op->intern); return 0; } #endif diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 9704403..e617e5e 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -81,8 +81,7 @@ cell_traverse(PyCellObject *op, visitproc visit, void *arg) static int cell_clear(PyCellObject *op) { - Py_XDECREF(op->ob_ref); - op->ob_ref = NULL; + Py_CLEAR(op->ob_ref); return 0; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 00ae2eb..b86319c 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -655,9 +655,7 @@ cm_traverse(classmethod *cm, visitproc visit, void *arg) static int cm_clear(classmethod *cm) { - Py_XDECREF(cm->cm_callable); - cm->cm_callable = NULL; - + Py_CLEAR(cm->cm_callable); return 0; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1c74322..a0af2c9 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -559,8 +559,8 @@ clear_slots(PyTypeObject *type, PyObject *self) char *addr = (char *)self + mp->offset; PyObject *obj = *(PyObject **)addr; if (obj != NULL) { - Py_DECREF(obj); *(PyObject **)addr = NULL; + Py_DECREF(obj); } } } @@ -2236,13 +2236,6 @@ type_clear(PyTypeObject *type) for heaptypes. */ assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE); -#define CLEAR(SLOT) \ - if (SLOT) { \ - tmp = (PyObject *)(SLOT); \ - SLOT = NULL; \ - Py_DECREF(tmp); \ - } - /* The only field we need to clear is tp_mro, which is part of a hard cycle (its first element is the class itself) that won't be broken otherwise (it's a tuple and tuples don't have a @@ -2268,9 +2261,7 @@ type_clear(PyTypeObject *type) A tuple of strings can't be part of a cycle. */ - CLEAR(type->tp_mro); - -#undef CLEAR + Py_CLEAR(type->tp_mro); return 0; } diff --git a/Python/traceback.c b/Python/traceback.c index 567f23d..cdbec2b 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -53,10 +53,8 @@ tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg) static void tb_clear(PyTracebackObject *tb) { - Py_XDECREF(tb->tb_next); - Py_XDECREF(tb->tb_frame); - tb->tb_next = NULL; - tb->tb_frame = NULL; + Py_CLEAR(tb->tb_next); + Py_CLEAR(tb->tb_frame); } PyTypeObject PyTraceBack_Type = { -- cgit v0.12