[Python-checkins] CVS: python/dist/src/Objects frameobject.c,2.52,2.53
Neil Schemenauer
nascheme@users.sourceforge.net
Thu, 12 Jul 2001 06:27:13 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv1503/Objects
Modified Files:
frameobject.c
Log Message:
GC for frame objects.
Index: frameobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/frameobject.c,v
retrieving revision 2.52
retrieving revision 2.53
diff -C2 -r2.52 -r2.53
*** frameobject.c 2001/06/23 05:26:56 2.52
--- frameobject.c 2001/07/12 13:27:11 2.53
***************
*** 71,74 ****
--- 71,75 ----
Py_TRASHCAN_SAFE_BEGIN(f)
+ PyObject_GC_Fini(f);
/* Kill all local variables */
slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
***************
*** 98,116 ****
}
PyTypeObject PyFrame_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"frame",
! sizeof(PyFrameObject),
0,
! (destructor)frame_dealloc, /*tp_dealloc*/
! 0, /*tp_print*/
! (getattrfunc)frame_getattr, /*tp_getattr*/
! (setattrfunc)frame_setattr, /*tp_setattr*/
! 0, /*tp_compare*/
! 0, /*tp_repr*/
! 0, /*tp_as_number*/
! 0, /*tp_as_sequence*/
! 0, /*tp_as_mapping*/
};
--- 99,198 ----
}
+ static int
+ frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
+ {
+ PyObject **fastlocals, **p;
+ int i, err, slots;
+ #define VISIT(o) if (o) {if ((err = visit((PyObject *)(o), arg))) return err;}
+
+ VISIT(f->f_back);
+ VISIT(f->f_code);
+ VISIT(f->f_builtins);
+ VISIT(f->f_globals);
+ VISIT(f->f_locals);
+ VISIT(f->f_trace);
+ VISIT(f->f_exc_type);
+ VISIT(f->f_exc_value);
+ VISIT(f->f_exc_traceback);
+
+ /* locals */
+ slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
+ fastlocals = f->f_localsplus;
+ for (i = slots; --i >= 0; ++fastlocals) {
+ VISIT(*fastlocals);
+ }
+
+ /* stack */
+ if (f->f_stacktop != NULL) {
+ for (p = f->f_valuestack; p < f->f_stacktop; p++)
+ VISIT(*p);
+ }
+
+ return 0;
+ }
+
+ static void
+ frame_clear(PyFrameObject *f)
+ {
+ PyObject **fastlocals, **p;
+ int i, slots;
+
+ Py_XDECREF(f->f_exc_type);
+ f->f_exc_type = NULL;
+
+ Py_XDECREF(f->f_exc_value);
+ f->f_exc_value = NULL;
+
+ Py_XDECREF(f->f_exc_traceback);
+ f->f_exc_traceback = NULL;
+
+ Py_XDECREF(f->f_trace);
+ f->f_trace = NULL;
+
+ /* locals */
+ slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
+ fastlocals = f->f_localsplus;
+ for (i = slots; --i >= 0; ++fastlocals) {
+ if (*fastlocals != NULL) {
+ Py_XDECREF(*fastlocals);
+ *fastlocals = NULL;
+ }
+ }
+
+ /* stack */
+ if (f->f_stacktop != NULL) {
+ for (p = f->f_valuestack; p < f->f_stacktop; p++) {
+ Py_XDECREF(*p);
+ *p = NULL;
+ }
+ }
+ }
+
+
PyTypeObject PyFrame_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"frame",
! sizeof(PyFrameObject) + PyGC_HEAD_SIZE,
0,
! (destructor)frame_dealloc, /* tp_dealloc */
! 0, /* tp_print */
! (getattrfunc)frame_getattr, /* tp_getattr */
! (setattrfunc)frame_setattr, /* tp_setattr */
! 0, /* tp_compare */
! 0, /* tp_repr */
! 0, /* tp_as_number */
! 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_GC, /* tp_flags */
! 0, /* tp_doc */
! (traverseproc)frame_traverse, /* tp_traverse */
! (inquiry)frame_clear, /* tp_clear */
};
***************
*** 156,162 ****
f = (PyFrameObject *)
PyObject_MALLOC(sizeof(PyFrameObject) +
! extras*sizeof(PyObject *));
if (f == NULL)
return (PyFrameObject *)PyErr_NoMemory();
PyObject_INIT(f, &PyFrame_Type);
f->f_size = extras;
--- 238,246 ----
f = (PyFrameObject *)
PyObject_MALLOC(sizeof(PyFrameObject) +
! extras*sizeof(PyObject *) +
! PyGC_HEAD_SIZE);
if (f == NULL)
return (PyFrameObject *)PyErr_NoMemory();
+ f = (PyFrameObject *) PyObject_FROM_GC(f);
PyObject_INIT(f, &PyFrame_Type);
f->f_size = extras;
***************
*** 166,174 ****
free_list = free_list->f_back;
if (f->f_size < extras) {
f = (PyFrameObject *)
PyObject_REALLOC(f, sizeof(PyFrameObject) +
! extras*sizeof(PyObject *));
if (f == NULL)
return (PyFrameObject *)PyErr_NoMemory();
f->f_size = extras;
}
--- 250,261 ----
free_list = free_list->f_back;
if (f->f_size < extras) {
+ f = (PyFrameObject *) PyObject_AS_GC(f);
f = (PyFrameObject *)
PyObject_REALLOC(f, sizeof(PyFrameObject) +
! extras*sizeof(PyObject *) +
! PyGC_HEAD_SIZE);
if (f == NULL)
return (PyFrameObject *)PyErr_NoMemory();
+ f = (PyFrameObject *) PyObject_FROM_GC(f);
f->f_size = extras;
}
***************
*** 231,234 ****
--- 318,322 ----
f->f_stacktop = f->f_valuestack;
+ PyObject_GC_Init(f);
return f;
}
***************
*** 392,395 ****
--- 480,484 ----
PyFrameObject *f = free_list;
free_list = free_list->f_back;
+ f = (PyFrameObject *) PyObject_AS_GC(f);
PyObject_DEL(f);
}