Use Py_CLEAR instead of in-place DECREF/XDECREF or custom macros, for
tp_clear methods.
This commit is contained in:
parent
ed8f783126
commit
edf17d8798
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Reference in New Issue