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

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
2003年4月08日 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;

AltStyle によって変換されたページ (->オリジナル) /