[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;