]> granicus.if.org Git - python/commitdiff
Use Py_CLEAR instead of in-place DECREF/XDECREF or custom macros, for
authorThomas Wouters <thomas@python.org>
Sat, 15 Apr 2006 17:28:34 +0000 (17:28 +0000)
committerThomas Wouters <thomas@python.org>
Sat, 15 Apr 2006 17:28:34 +0000 (17:28 +0000)
tp_clear methods.

Modules/_csv.c
Modules/cPickle.c
Modules/collectionsmodule.c
Modules/pyexpat.c
Objects/cellobject.c
Objects/funcobject.c
Objects/typeobject.c
Python/traceback.c

index 902ea9e4827f6b67bdc90eb71dc1e69ce3248a6a..88c72481d8901af566b0ad7bf79d9cb8123a8b90 100644 (file)
@@ -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;
 }
 
index 69e15e2eb695383eb60e1dbe59f533a88ebf8b37..1d99fcb76a48fe811fcbd689a76031a015d1fc8e 100644 (file)
@@ -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;
 }
 
index 5bccc7c45426bc8a18df9e58c2af44b03e78b8f4..c7e2c8551089e21ecf0bfa3ff803532bab4f918f 100644 (file)
@@ -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);
 }
 
index b6e927d32cd583621a795769890c4e8caa995479..fbef4e14ca81f9cbaaf5fdd61c64bfe937f84177 100644 (file)
@@ -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
index 97044032fcc73c95ff5ce03df22a5c8429fd6dfc..e617e5e5f3c9dc0878da8b7bab311056cfc5313d 100644 (file)
@@ -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;
 }
 
index 00ae2ebe8aeedc8c7c3b8b66d11f0c14db80f7e6..b86319cad839cb572ef2dc7f9271fbf653ef4c64 100644 (file)
@@ -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;
 }
 
index 1c74322d871b89eb695744570ae960e2fb95ffd0..a0af2c9b420bb17d438602f466921e13479745d6 100644 (file)
@@ -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;
 }
index 567f23d99032a13ea10f079e2d4a62fec7b46c62..cdbec2b4703696624ff0cf8dc9c8649077317796 100644 (file)
@@ -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 = {