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

Jeremy Hylton jhylton@users.sourceforge.net
Mon, 22 Oct 2001 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;