[Python-checkins] CVS: python/dist/src/Objects classobject.c,2.86,2.87 dictobject.c,2.52,2.53 funcobject.c,2.20,2.21 listobject.c,2.73,2.74 tupleobject.c,2.36,2.37

Jeremy Hylton python-dev@python.org
2000年6月23日 07:18:13 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory slayer.i.sourceforge.net:/tmp/cvs-serv2798/Objects
Modified Files:
	classobject.c dictobject.c funcobject.c listobject.c 
	tupleobject.c 
Log Message:
Round 1 of Neil Schemenauer's GC patches:
This patch adds the type methods traverse and clear necessary for GC
implementation.
Index: classobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/classobject.c,v
retrieving revision 2.86
retrieving revision 2.87
diff -C2 -r2.86 -r2.87
*** classobject.c	2000年05月03日 23:44:34	2.86
--- classobject.c	2000年06月23日 14:18:11	2.87
***************
*** 388,391 ****
--- 388,428 ----
 }
 
+ static int
+ class_traverse(PyClassObject *o, visitproc visit, void *arg)
+ {
+ 	int err;
+ 	if (o->cl_bases) {
+ 		err = visit(o->cl_bases, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (o->cl_dict) {
+ 		err = visit(o->cl_dict, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (o->cl_name) {
+ 		err = visit(o->cl_name, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (o->cl_getattr) {
+ 		err = visit(o->cl_getattr, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (o->cl_setattr) {
+ 		err = visit(o->cl_setattr, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (o->cl_delattr) {
+ 		err = visit(o->cl_delattr, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	return 0;
+ }
+ 
 PyTypeObject PyClass_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 408,411 ****
--- 445,452 ----
 	(getattrofunc)class_getattr, /*tp_getattro*/
 	(setattrofunc)class_setattr, /*tp_setattro*/
+ 	0,		/* tp_as_buffer */
+ 	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 	0,		/* tp_doc */
+ 	(traverseproc)class_traverse,	/* tp_traverse */
 };
 
***************
*** 850,853 ****
--- 891,911 ----
 }
 
+ static int
+ instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
+ {
+ 	int err;
+ 	if (o->in_class) {
+ 		err = visit((PyObject *)(o->in_class), arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (o->in_dict) {
+ 		err = visit(o->in_dict, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	return 1;
+ }
+ 
 static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
 
***************
*** 1473,1477 ****
 	(setattrofunc)instance_setattr, /*tp_setattro*/
 0, /* tp_as_buffer */
! 	Py_TPFLAGS_DEFAULT, /*tp_flags */
 };
 
--- 1531,1537 ----
 	(setattrofunc)instance_setattr, /*tp_setattro*/
 0, /* tp_as_buffer */
! 	Py_TPFLAGS_DEFAULT, /*tp_flags*/
! 	0,		/* tp_doc */
! 	(traverseproc)instance_traverse,	/* tp_traverse */
 };
 
***************
*** 1663,1666 ****
--- 1723,1748 ----
 }
 
+ static int
+ instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
+ {
+ 	int err;
+ 	if (im->im_func) {
+ 		err = visit(im->im_func, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (im->im_self) {
+ 		err = visit(im->im_self, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (im->im_class) {
+ 		err = visit(im->im_class, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	return 1;
+ }
+ 
 PyTypeObject PyMethod_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 1683,1686 ****
--- 1765,1772 ----
 	(getattrofunc)instancemethod_getattr, /*tp_getattro*/
 	0,			/*tp_setattro*/
+ 	0,			/* tp_as_buffer */
+ 	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 	0,			/* tp_doc */
+ 	(traverseproc)instancemethod_traverse,	/* tp_traverse */
 };
 
Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.52
retrieving revision 2.53
diff -C2 -r2.52 -r2.53
*** dictobject.c	2000年05月03日 23:44:34	2.52
--- dictobject.c	2000年06月23日 14:18:11	2.53
***************
*** 1039,1042 ****
--- 1039,1067 ----
 }
 
+ static int
+ dict_traverse(PyObject *op, visitproc visit, void *arg)
+ {
+ 	int i = 0, err;
+ 	PyObject *pk;
+ 	PyObject *pv;
+ 
+ 	while (PyDict_Next(op, &i, &pk, &pv)) {
+ 		err = visit(pk, arg);
+ 		if (err)
+ 			return err;
+ 		err = visit(pv, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	return 0;
+ }
+ 
+ static int
+ dict_tp_clear(PyObject *op)
+ {
+ 	PyDict_Clear(op);
+ 	return 0;
+ }
+ 
 static PyMethodDef mapp_methods[] = {
 	{"has_key",	(PyCFunction)dict_has_key, METH_VARARGS},
***************
*** 1074,1077 ****
--- 1099,1112 ----
 	0,			/*tp_as_sequence*/
 	&dict_as_mapping,	/*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, /*tp_flags*/
+ 	0,		/* tp_doc */
+ 	(traverseproc)dict_traverse,	/* tp_traverse */
+ 	(inquiry)dict_tp_clear,		/* tp_clear */
 };
 
Index: funcobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v
retrieving revision 2.20
retrieving revision 2.21
diff -C2 -r2.20 -r2.21
*** funcobject.c	2000年05月03日 23:44:35	2.20
--- funcobject.c	2000年06月23日 14:18:11	2.21
***************
*** 240,243 ****
--- 240,275 ----
 }
 
+ static int
+ func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
+ {
+ 	int err;
+ 	if (f->func_code) {
+ 		err = visit(f->func_code, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (f->func_globals) {
+ 		err = visit(f->func_globals, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (f->func_defaults) {
+ 		err = visit(f->func_defaults, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (f->func_doc) {
+ 		err = visit(f->func_doc, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	if (f->func_name) {
+ 		err = visit(f->func_name, arg);
+ 		if (err)
+ 			return err;
+ 	}
+ 	return 0;
+ }
+ 
 PyTypeObject PyFunction_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 256,258 ****
--- 288,298 ----
 	0,		/*tp_as_mapping*/
 	(hashfunc)func_hash, /*tp_hash*/
+ 	0,		/*tp_call*/
+ 	0,		/*tp_str*/
+ 	0,		/*tp_getattro*/
+ 	0,		/*tp_setattro*/
+ 	0,		/* tp_as_buffer */
+ 	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 	0,		/* tp_doc */
+ 	(traverseproc)func_traverse,	/* tp_traverse */
 };
Index: listobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v
retrieving revision 2.73
retrieving revision 2.74
diff -C2 -r2.73 -r2.74
*** listobject.c	2000年06月18日 18:43:14	2.73
--- listobject.c	2000年06月23日 14:18:11	2.74
***************
*** 1419,1422 ****
--- 1419,1446 ----
 }
 
+ static int
+ list_traverse(PyListObject *o, visitproc visit, void *arg)
+ {
+ 	int i, err;
+ 	PyObject *x;
+ 
+ 	for (i = o->ob_size; --i >= 0; ) {
+ 		x = o->ob_item[i];
+ 		if (x != NULL) {
+ 			err = visit(x, arg);
+ 			if (err)
+ 				return err;
+ 		}
+ 	}
+ 	return 0;
+ }
+ 
+ static int
+ list_clear(PyListObject *lp)
+ {
+ 	(void) PyList_SetSlice((PyObject *)lp, 0, lp->ob_size, 0);
+ 	return 0;
+ }
+ 
 static char append_doc[] =
 "L.append(object) -- append object to end";
***************
*** 1492,1495 ****
--- 1516,1522 ----
 	0,		/*tp_as_buffer*/
 	Py_TPFLAGS_DEFAULT,	/*tp_flags*/
+ 	0,		/* tp_doc */
+ 	(traverseproc)list_traverse,	/* tp_traverse */
+ 	(inquiry)list_clear,	/* tp_clear */
 };
 
***************
*** 1568,1571 ****
--- 1595,1600 ----
 	0,		/*tp_as_buffer*/
 	Py_TPFLAGS_DEFAULT,	/*tp_flags*/
+ 	0,		/* tp_doc */
+ 	(traverseproc)list_traverse,	/* tp_traverse */
 };
 
Index: tupleobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/tupleobject.c,v
retrieving revision 2.36
retrieving revision 2.37
diff -C2 -r2.36 -r2.37
*** tupleobject.c	2000年06月16日 17:05:57	2.36
--- tupleobject.c	2000年06月23日 14:18:11	2.37
***************
*** 421,424 ****
--- 421,441 ----
 }
 
+ static int
+ tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
+ {
+ 	int i, err;
+ 	PyObject *x;
+ 
+ 	for (i = o->ob_size; --i >= 0; ) {
+ 		x = o->ob_item[i];
+ 		if (x != NULL) {
+ 			err = visit(x, arg);
+ 			if (err)
+ 				return err;
+ 		}
+ 	}
+ 	return 0;
+ }
+ 
 static PySequenceMethods tuple_as_sequence = {
 	(inquiry)tuplelength, /*sq_length*/
***************
*** 454,457 ****
--- 471,476 ----
 	0,		/*tp_as_buffer*/
 	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 	0, /*tp_doc*/
+ 	(traverseproc)tupletraverse,	/* tp_traverse */
 };
 

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