[Python-checkins] CVS: python/dist/src/Objects typeobject.c,2.117,2.118

Tim Peters tim_one@users.sourceforge.net
2001年11月14日 15:32:35 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv8578/python/Objects
Modified Files:
	typeobject.c 
Log Message:
Changing diapers reminded Guido that he wanted to allow for some measure
of multiple inheritance from a mix of new- and classic-style classes.
This is his patch, plus a start at some test cases from me. Will check
in more, plus a NEWS blurb, later tonight.
Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.117
retrieving revision 2.118
diff -C2 -d -r2.117 -r2.118
*** typeobject.c	2001年10月29日 22:25:44	2.117
--- typeobject.c	2001年11月14日 23:32:33	2.118
***************
*** 578,582 ****
--- 578,623 ----
 }
 
+ static int
+ fill_classic_mro(PyObject *mro, PyObject *cls)
+ {
+ 	PyObject *bases, *base;
+ 	int i, n;
+ 
+ 	assert(PyList_Check(mro));
+ 	assert(PyClass_Check(cls));
+ 	i = PySequence_Contains(mro, cls);
+ 	if (i < 0)
+ 		return -1;
+ 	if (!i) {
+ 		if (PyList_Append(mro, cls) < 0)
+ 			return -1;
+ 	}
+ 	bases = ((PyClassObject *)cls)->cl_bases;
+ 	assert(bases && PyTuple_Check(bases));
+ 	n = PyTuple_GET_SIZE(bases);
+ 	for (i = 0; i < n; i++) {
+ 		base = PyTuple_GET_ITEM(bases, i);
+ 		if (fill_classic_mro(mro, base) < 0)
+ 			return -1;
+ 	}
+ 	return 0;
+ }
+ 
 static PyObject *
+ classic_mro(PyObject *cls)
+ {
+ 	PyObject *mro;
+ 
+ 	assert(PyClass_Check(cls));
+ 	mro = PyList_New(0);
+ 	if (mro != NULL) {
+ 		if (fill_classic_mro(mro, cls) == 0)
+ 			return mro;
+ 		Py_DECREF(mro);
+ 	}
+ 	return NULL;
+ }
+ 
+ static PyObject *
 mro_implementation(PyTypeObject *type)
 {
***************
*** 590,596 ****
 		return NULL;
 	for (i = 0; i < n; i++) {
! 		PyTypeObject *base =
! 			(PyTypeObject *) PyTuple_GET_ITEM(bases, i);
! 		PyObject *parentMRO = PySequence_List(base->tp_mro);
 		if (parentMRO == NULL) {
 			Py_DECREF(result);
--- 631,641 ----
 		return NULL;
 	for (i = 0; i < n; i++) {
! 		PyObject *base = PyTuple_GET_ITEM(bases, i);
! 		PyObject *parentMRO;
! 		if (PyType_Check(base))
! 			parentMRO = PySequence_List(
! 				((PyTypeObject*)base)->tp_mro);
! 		else
! 			parentMRO = classic_mro(base);
 		if (parentMRO == NULL) {
 			Py_DECREF(result);
***************
*** 652,664 ****
 	int i, n;
 	PyTypeObject *base, *winner, *candidate, *base_i;
 
 	assert(PyTuple_Check(bases));
 	n = PyTuple_GET_SIZE(bases);
 	assert(n > 0);
! 	base = (PyTypeObject *)PyTuple_GET_ITEM(bases, 0);
! 	winner = &PyBaseObject_Type;
 	for (i = 0; i < n; i++) {
! 		base_i = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
! 		if (!PyType_Check((PyObject *)base_i)) {
 			PyErr_SetString(
 				PyExc_TypeError,
--- 697,712 ----
 	int i, n;
 	PyTypeObject *base, *winner, *candidate, *base_i;
+ 	PyObject *base_proto;
 
 	assert(PyTuple_Check(bases));
 	n = PyTuple_GET_SIZE(bases);
 	assert(n > 0);
! 	base = NULL;
! 	winner = NULL;
 	for (i = 0; i < n; i++) {
! 		base_proto = PyTuple_GET_ITEM(bases, i);
! 		if (PyClass_Check(base_proto))
! 			continue;
! 		if (!PyType_Check(base_proto)) {
 			PyErr_SetString(
 				PyExc_TypeError,
***************
*** 666,669 ****
--- 714,718 ----
 			return NULL;
 		}
+ 		base_i = (PyTypeObject *)base_proto;
 		if (base_i->tp_dict == NULL) {
 			if (PyType_Ready(base_i) < 0)
***************
*** 671,675 ****
 		}
 		candidate = solid_base(base_i);
! 		if (PyType_IsSubtype(winner, candidate))
 			;
 		else if (PyType_IsSubtype(candidate, winner)) {
--- 720,728 ----
 		}
 		candidate = solid_base(base_i);
! 		if (winner == NULL) {
! 			winner = candidate;
! 			base = base_i;
! 		}
! 		else if (PyType_IsSubtype(winner, candidate))
 			;
 		else if (PyType_IsSubtype(candidate, winner)) {
***************
*** 828,831 ****
--- 881,886 ----
 		tmp = PyTuple_GET_ITEM(bases, i);
 		tmptype = tmp->ob_type;
+ 		if (tmptype == &PyClass_Type)
+ 			continue; /* Special case classic classes */
 		if (PyType_IsSubtype(winner, tmptype))
 			continue;
***************
*** 1080,1084 ****
 {
 	int i, n;
! 	PyObject *mro, *res, *dict;
 
 	/* Look in tp_dict of types in MRO */
--- 1135,1139 ----
 {
 	int i, n;
! 	PyObject *mro, *res, *base, *dict;
 
 	/* Look in tp_dict of types in MRO */
***************
*** 1087,1093 ****
 	n = PyTuple_GET_SIZE(mro);
 	for (i = 0; i < n; i++) {
! 		type = (PyTypeObject *) PyTuple_GET_ITEM(mro, i);
! 		assert(PyType_Check(type));
! 		dict = type->tp_dict;
 		assert(dict && PyDict_Check(dict));
 		res = PyDict_GetItem(dict, name);
--- 1142,1152 ----
 	n = PyTuple_GET_SIZE(mro);
 	for (i = 0; i < n; i++) {
! 		base = PyTuple_GET_ITEM(mro, i);
! 		if (PyClass_Check(base))
! 			dict = ((PyClassObject *)base)->cl_dict;
! 		else {
! 			assert(PyType_Check(base));
! 			dict = ((PyTypeObject *)base)->tp_dict;
! 		}
 		assert(dict && PyDict_Check(dict));
 		res = PyDict_GetItem(dict, name);
***************
*** 1921,1927 ****
 	n = PyTuple_GET_SIZE(bases);
 	for (i = 1; i < n; i++) {
! 		base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
! 		assert(PyType_Check(base));
! 		inherit_slots(type, base);
 	}
 
--- 1980,1986 ----
 	n = PyTuple_GET_SIZE(bases);
 	for (i = 1; i < n; i++) {
! 		PyObject *b = PyTuple_GET_ITEM(bases, i);
! 		if (PyType_Check(b))
! 			inherit_slots(type, (PyTypeObject *)b);
 	}
 
***************
*** 1941,1946 ****
 	n = PyTuple_GET_SIZE(bases);
 	for (i = 0; i < n; i++) {
! 		base = (PyTypeObject *) PyTuple_GET_ITEM(bases, i);
! 		if (add_subclass((PyTypeObject *)base, type) < 0)
 			goto error;
 	}
--- 2000,2006 ----
 	n = PyTuple_GET_SIZE(bases);
 	for (i = 0; i < n; i++) {
! 		PyObject *b = PyTuple_GET_ITEM(bases, i);
! 		if (PyType_Check(b) &&
! 		 add_subclass((PyTypeObject *)b, type) < 0)
 			goto error;
 	}
***************
*** 3666,3670 ****
 	slotdef *p;
 	PyObject *mro, *descr;
- 	PyTypeObject *base;
 	PyWrapperDescrObject *d;
 	int i, n, offset;
--- 3726,3729 ----
***************
*** 3691,3701 ****
 			descr = NULL;
 			for (i = 0; i < n; i++) {
! 				base = (PyTypeObject *)
! 					PyTuple_GET_ITEM(mro, i);
! 				assert(PyType_Check(base));
! 				descr = PyDict_GetItem(
! 					base->tp_dict, p->name_strobj);
! 				if (descr != NULL)
! 					break;
 			}
 			if (descr == NULL)
--- 3750,3765 ----
 			descr = NULL;
 			for (i = 0; i < n; i++) {
! 				PyObject *b = PyTuple_GET_ITEM(mro, i);
! 				PyObject *dict = NULL;
! 				if (PyType_Check(b))
! 					dict = ((PyTypeObject *)b)->tp_dict;
! 				else if (PyClass_Check(b))
! 					dict = ((PyClassObject *)b)->cl_dict;
! 				if (dict != NULL) {
! 					descr = PyDict_GetItem(
! 						dict, p->name_strobj);
! 					if (descr != NULL)
! 						break;
! 				}
 			}
 			if (descr == NULL)
***************
*** 3826,3830 ****
 
 	if (su->obj != NULL) {
! 		PyObject *mro, *res, *tmp;
 		descrgetfunc f;
 		int i, n;
--- 3890,3894 ----
 
 	if (su->obj != NULL) {
! 		PyObject *mro, *res, *tmp, *dict;
 		descrgetfunc f;
 		int i, n;
***************
*** 3859,3865 ****
 		for (; i < n; i++) {
 			tmp = PyTuple_GET_ITEM(mro, i);
! 			assert(PyType_Check(tmp));
! 			res = PyDict_GetItem(
! 				((PyTypeObject *)tmp)->tp_dict, name);
 			if (res != NULL) {
 				Py_INCREF(res);
--- 3923,3933 ----
 		for (; i < n; i++) {
 			tmp = PyTuple_GET_ITEM(mro, i);
! 			if (PyType_Check(tmp))
! 				dict = ((PyTypeObject *)tmp)->tp_dict;
! 			else if (PyClass_Check(tmp))
! 				dict = ((PyClassObject *)tmp)->cl_dict;
! 			else
! 				continue;
! 			res = PyDict_GetItem(dict, name);
 			if (res != NULL) {
 				Py_INCREF(res);

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