]> granicus.if.org Git - python/commitdiff
Remove "referents" structure (it's not needed). Check return value
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>
Fri, 10 Aug 2001 14:46:47 +0000 (14:46 +0000)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>
Fri, 10 Aug 2001 14:46:47 +0000 (14:46 +0000)
of PyList_Append.

Modules/gcmodule.c

index 98a0ee5943c7488e8c83297891b15ed7cc4392fc..dcf0128acead3482ec8b56a638bdf6dd35ac5e74 100644 (file)
@@ -677,51 +677,48 @@ gc_get_thresh(PyObject *self, PyObject *args)
        return Py_BuildValue("(iii)", threshold0, threshold1, threshold2);
 }
 
-struct referents{
-       PyObject *objs;
-       int seen;
-};
-
 static int
-referentsvisit(PyObject* obj, struct referents* refs)
+referentsvisit(PyObject* obj, PyObject *objs)
 {
-       if (PySequence_Contains (refs->objs, obj)) {
-               refs->seen = 1;
+       if (PySequence_Contains(objs, obj)) {
                return 1;
        }
        return 0;
 }
 
-static void
+static int
 gc_referents_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
 {
        PyGC_Head *gc;
        PyObject *obj;
        traverseproc traverse;
-       struct referents refs = {objs, 0};
-       for (gc = list->gc_next; gc != list; gc = gc->gc_next){
-         obj = PyObject_FROM_GC(gc);
+       for (gc = list->gc_next; gc != list; gc = gc->gc_next) {
+               obj = PyObject_FROM_GC(gc);
                traverse = obj->ob_type->tp_traverse;
                if (obj == objs || obj == resultlist)
                        continue;
-               if (traverse(obj, (visitproc)referentsvisit, &refs)) {
-                       PyList_Append(resultlist, obj);
-                       refs.seen = 0;
+               if (traverse(obj, (visitproc)referentsvisit, objs)) {
+                       if (PyList_Append(resultlist, obj) < 0)
+                               return 0; /* error */
                }
        }
+       return 1; /* no error */
 }
 
 static char gc_get_referents__doc__[]=
 "get_referents(*objs) -> list\n\
 Return the list of objects that directly refer to any of objs.";
 
-static PyObject*
-gc_get_referents(PyObject *self, PyObjectargs)
+static PyObject *
+gc_get_referents(PyObject *self, PyObject *args)
 {
        PyObject *result = PyList_New(0);
-       gc_referents_for(args, &generation0, result);
-       gc_referents_for(args, &generation1, result);
-       gc_referents_for(args, &generation2, result);
+       if (!(gc_referents_for(args, &generation0, result) &&
+             gc_referents_for(args, &generation1, result) &&
+             gc_referents_for(args, &generation2, result))) {
+               Py_DECREF(result);
+               return NULL;
+       }
        return result;
 }