[Python-checkins] python/dist/src/Modules gcmodule.c,2.68,2.69

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Tue, 08 Apr 2003 09:39:52 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1:/tmp/cvs-serv2197/python/Modules

Modified Files:
	gcmodule.c 
Log Message:
Finished implementing gc.get_referrents():  dealt with error and end
cases, wrote docs, added a test.


Index: gcmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/gcmodule.c,v
retrieving revision 2.68
retrieving revision 2.69
diff -C2 -d -r2.68 -r2.69
*** gcmodule.c	7 Apr 2003 22:41:24 -0000	2.68
--- gcmodule.c	8 Apr 2003 16:39:48 -0000	2.69
***************
*** 858,867 ****
  }
  
  static int
  referrentsvisit(PyObject *obj, PyObject *list)
  {
! 	if (PyList_Append(list, obj) < 0)
! 		return 1;
! 	return 0;
  }
  
--- 858,866 ----
  }
  
+ /* Append obj to list; return true if error (out of memory), false if OK. */
  static int
  referrentsvisit(PyObject *obj, PyObject *list)
  {
! 	return PyList_Append(list, obj) < 0;
  }
  
***************
*** 875,885 ****
  	int i;
  	PyObject *result = PyList_New(0);
  	for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
  		PyObject *obj = PyTuple_GET_ITEM(args, i);
! 		traverseproc traverse = obj->ob_type->tp_traverse;
! 		if (!traverse)
  			continue;
! 		if (traverse(obj, (visitproc)referrentsvisit, result))
  			return NULL;
  	}
  	return result;
--- 874,894 ----
  	int i;
  	PyObject *result = PyList_New(0);
+ 
+ 	if (result == NULL)
+ 		return NULL;
+ 
  	for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
+ 		traverseproc traverse;
  		PyObject *obj = PyTuple_GET_ITEM(args, i);
! 
! 		if (! PyObject_IS_GC(obj))
  			continue;
! 		traverse = obj->ob_type->tp_traverse;
! 		if (! traverse)
! 			continue;
! 		if (traverse(obj, (visitproc)referrentsvisit, result)) {
! 			Py_DECREF(result);
  			return NULL;
+ 		}
  	}
  	return result;