[Python-checkins] CVS: python/dist/src/Python traceback.c,2.33,2.34

Jeremy Hylton jhylton@users.sourceforge.net
2001年10月22日 15:17:43 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv28124
Modified Files:
	traceback.c 
Log Message:
Make traceback objects collectable.
This should eliminate the traceback returned by sys.exc_info() as a
common source of memory leaks.
Index: traceback.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/traceback.c,v
retrieving revision 2.33
retrieving revision 2.34
diff -C2 -d -r2.33 -r2.34
*** traceback.c	2001年10月22日 19:34:09	2.33
--- traceback.c	2001年10月22日 22:17:41	2.34
***************
*** 37,46 ****
 {
 	Py_TRASHCAN_SAFE_BEGIN(tb)
 	Py_XDECREF(tb->tb_next);
 	Py_XDECREF(tb->tb_frame);
! 	PyObject_DEL(tb);
 	Py_TRASHCAN_SAFE_END(tb)
 }
 
 PyTypeObject PyTraceBack_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
--- 37,70 ----
 {
 	Py_TRASHCAN_SAFE_BEGIN(tb)
+ 	_PyObject_GC_UNTRACK(tb);
 	Py_XDECREF(tb->tb_next);
 	Py_XDECREF(tb->tb_frame);
! 	PyObject_GC_Del(tb);
 	Py_TRASHCAN_SAFE_END(tb)
 }
 
+ static int
+ tb_traverse(tracebackobject *tb, visitproc visit, void *arg)
+ {
+ 	int err = 0;
+ 	if (tb->tb_next) {
+ 		err = visit((PyObject *)tb->tb_next, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (tb->tb_frame) 
+ 		err = visit((PyObject *)tb->tb_frame, arg);
+ 	return err;
+ }
+ 
+ static void
+ tb_clear(tracebackobject *tb)
+ {
+ 	Py_XDECREF(tb->tb_next);
+ 	Py_XDECREF(tb->tb_frame);
+ 	tb->tb_next = NULL;
+ 	tb->tb_frame = NULL;
+ }
+ 
 PyTypeObject PyTraceBack_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 58,61 ****
--- 82,104 ----
 	0,		/*tp_as_sequence*/
 	0,		/*tp_as_mapping*/
+ 	0,		/* tp_hash */
+ 	0,		/* tp_call */
+ 	0,		/* tp_str */
+ 	0,		/* tp_getattro */
+ 	0,		/* tp_setattro */
+ 	0,					/* tp_as_buffer */
+ 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
+ 	0, 				/* tp_doc */
+ 	(traverseproc)tb_traverse,		/* tp_traverse */
+ 	(inquiry)tb_clear,			/* tp_clear */
+ 	0,					/* tp_richcompare */
+ 	0,					/* tp_weaklistoffset */
+ 	0,					/* tp_iter */
+ 	0,					/* tp_iternext */
+ 	0,					/* tp_methods */
+ 	0,			/* tp_members */
+ 	0,			/* tp_getset */
+ 	0,					/* tp_base */
+ 	0,					/* tp_dict */
 };
 
***************
*** 70,74 ****
 		return NULL;
 	}
! 	tb = PyObject_NEW(tracebackobject, &PyTraceBack_Type);
 	if (tb != NULL) {
 		Py_XINCREF(next);
--- 113,117 ----
 		return NULL;
 	}
! 	tb = PyObject_GC_New(tracebackobject, &PyTraceBack_Type);
 	if (tb != NULL) {
 		Py_XINCREF(next);
***************
*** 78,81 ****
--- 121,125 ----
 		tb->tb_lasti = lasti;
 		tb->tb_lineno = lineno;
+ 		_PyObject_GC_TRACK(tb);
 	}
 	return tb;

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