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

Guido van Rossum gvanrossum@users.sourceforge.net
Mon, 15 Oct 2001 14:05:12 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv7710/Objects

Modified Files:
	typeobject.c 
Log Message:
Completely get rid of __dynamic__ and the corresponding
Py_TPFLAGS_DYNAMICTYPE bit.  There is no longer a performance benefit,
and I don't really see the use case any more.


Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.103
retrieving revision 2.104
diff -C2 -d -r2.103 -r2.104
*** typeobject.c	2001/10/15 19:44:24	2.103
--- typeobject.c	2001/10/15 21:05:10	2.104
***************
*** 57,61 ****
  type_set_module(PyTypeObject *type, PyObject *value, void *context)
  {
! 	if (!(type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) ||
  	    strrchr(type->tp_name, '.')) {
  		PyErr_Format(PyExc_TypeError,
--- 57,61 ----
  type_set_module(PyTypeObject *type, PyObject *value, void *context)
  {
! 	if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
  	    strrchr(type->tp_name, '.')) {
  		PyErr_Format(PyExc_TypeError,
***************
*** 78,85 ****
  		return Py_None;
  	}
-  	if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
- 		Py_INCREF(type->tp_dict);
- 		return type->tp_dict;
- 	}
  	return PyDictProxy_New(type->tp_dict);
  }
--- 78,81 ----
***************
*** 92,112 ****
  		return Py_None;
  	}
- 	if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
- 		Py_INCREF(type->tp_defined);
- 		return type->tp_defined;
- 	}
  	return PyDictProxy_New(type->tp_defined);
  }
  
- static PyObject *
- type_dynamic(PyTypeObject *type, void *context)
- {
- 	PyObject *res;
- 
- 	res = (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) ? Py_True : Py_False;
- 	Py_INCREF(res);
- 	return res;
- }
- 
  PyGetSetDef type_getsets[] = {
  	{"__name__", (getter)type_name, NULL, NULL},
--- 88,94 ----
***************
*** 114,118 ****
  	{"__dict__",  (getter)type_dict,  NULL, NULL},
  	{"__defined__",  (getter)type_defined,  NULL, NULL},
- 	{"__dynamic__", (getter)type_dynamic, NULL, NULL},
  	{0}
  };
--- 96,99 ----
***************
*** 712,716 ****
  	etype *et;
  	PyMemberDef *mp;
! 	int i, nbases, nslots, slotoffset, dynamic, add_dict, add_weak;
  
  	/* Special case: type(x) should return x->ob_type */
--- 693,697 ----
  	etype *et;
  	PyMemberDef *mp;
! 	int i, nbases, nslots, slotoffset, add_dict, add_weak;
  
  	/* Special case: type(x) should return x->ob_type */
***************
*** 778,813 ****
  	}
  
- 	/* Should this be a dynamic class (i.e. modifiable __dict__)?
- 	   Look in two places for a variable named __dynamic__:
- 	   1) in the class dict
- 	   2) in the module dict (globals)
- 	   The first variable that is an int >= 0 is used.
- 	   Otherwise, the default is dynamic. */
- 	dynamic = -1; /* Not yet determined */
- 	/* Look in the class */
- 	tmp = PyDict_GetItemString(dict, "__dynamic__");
- 	if (tmp != NULL) {
- 		dynamic = PyInt_AsLong(tmp);
- 		if (dynamic < 0)
- 			PyErr_Clear();
- 	}
- 	if (dynamic < 0) {
- 		/* Look in the module globals */
- 		tmp = PyEval_GetGlobals();
- 		if (tmp != NULL) {
- 			tmp = PyDict_GetItemString(tmp, "__dynamic__");
- 			if (tmp != NULL) {
- 				dynamic = PyInt_AsLong(tmp);
- 				if (dynamic < 0)
- 					PyErr_Clear();
- 			}
- 		}
- 	}
- 	if (dynamic < 0) {
- 		/* Default to dynamic */
- 		dynamic = 1;
- 
- 	}
- 
  	/* Check for a __slots__ sequence variable in dict, and count it */
  	slots = PyDict_GetItemString(dict, "__slots__");
--- 759,762 ----
***************
*** 869,874 ****
  	type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
  		Py_TPFLAGS_BASETYPE;
- 	if (dynamic)
- 		type->tp_flags |= Py_TPFLAGS_DYNAMICTYPE;
  	if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
  		type->tp_flags |= Py_TPFLAGS_HAVE_GC;
--- 818,821 ----
***************
*** 1026,1038 ****
  	int i, n;
  	PyObject *mro, *res, *dict;
- 
- 	/* For static types, look in tp_dict */
- 	if (!(type->tp_flags & Py_TPFLAGS_DYNAMICTYPE)) {
- 		dict = type->tp_dict;
- 		assert(dict && PyDict_Check(dict));
- 		return PyDict_GetItem(dict, name);
- 	}
  
! 	/* For dynamic types, look in tp_defined of types in MRO */
  	mro = type->tp_mro;
  	assert(PyTuple_Check(mro));
--- 973,978 ----
  	int i, n;
  	PyObject *mro, *res, *dict;
  
! 	/* Look in tp_defined of types in MRO */
  	mro = type->tp_mro;
  	assert(PyTuple_Check(mro));
***************
*** 1105,1115 ****
  type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
  {
! 	if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
! 		if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
! 			return -1;
! 		return update_slot(type, name);
  	}
! 	PyErr_SetString(PyExc_TypeError, "can't set static type attributes");
! 	return -1;
  }
  
--- 1045,1058 ----
  type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
  {
! 	if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
! 		PyErr_Format(
! 			PyExc_TypeError,
! 			"can't set attributes of built-in/extension type '%s'",
! 			type->tp_name);
! 		return -1;
  	}
! 	if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
! 		return -1;
! 	return update_slot(type, name);
  }
  
***************
*** 1795,1799 ****
  PyType_Ready(PyTypeObject *type)
  {
! 	PyObject *dict, *bases, *x;
  	PyTypeObject *base;
  	int i, n;
--- 1738,1742 ----
  PyType_Ready(PyTypeObject *type)
  {
! 	PyObject *dict, *bases;
  	PyTypeObject *base;
  	int i, n;
***************
*** 1872,1906 ****
  
  	/* Initialize tp_dict properly */
! 	if (!PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE)) {
! 		/* For a static type, tp_dict is the consolidation
! 		   of the tp_defined of its bases in MRO. */
! 		Py_DECREF(type->tp_dict);
! 		type->tp_dict = PyDict_Copy(type->tp_defined);
! 		if (type->tp_dict == NULL)
! 			goto error;
! 		bases = type->tp_mro;
! 		assert(bases != NULL);
! 		assert(PyTuple_Check(bases));
! 		n = PyTuple_GET_SIZE(bases);
! 		for (i = 1; i < n; i++) {
! 			base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
! 			assert(PyType_Check(base));
! 			x = base->tp_defined;
! 			if (x != NULL && PyDict_Merge(type->tp_dict, x, 0) < 0)
! 				goto error;
! 			inherit_slots(type, base);
! 		}
! 	}
! 	else {
! 		/* For a dynamic type, we simply inherit the base slots. */
! 		bases = type->tp_mro;
! 		assert(bases != NULL);
! 		assert(PyTuple_Check(bases));
! 		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);
! 		}
  	}
  
--- 1815,1826 ----
  
  	/* Initialize tp_dict properly */
! 	bases = type->tp_mro;
! 	assert(bases != NULL);
! 	assert(PyTuple_Check(bases));
! 	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);
  	}