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