[Python-checkins] CVS: python/dist/src/Objects object.c,2.124.4.9,2.124.4.10

Guido van Rossum gvanrossum@users.sourceforge.net
Fri, 11 May 2001 13:00:26 -0700


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

Modified Files:
      Tag: descr-branch
	object.c 
Log Message:
Make PyGeneric_{Get,Set}Attr honor the tp_dictoffset slot, if set.


Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.124.4.9
retrieving revision 2.124.4.10
diff -C2 -r2.124.4.9 -r2.124.4.10
*** object.c	2001/05/10 15:21:28	2.124.4.9
--- object.c	2001/05/11 20:00:24	2.124.4.10
***************
*** 1082,1085 ****
--- 1082,1086 ----
  	PyObject *descr;
  	descrgetfunc f;
+ 	int dictoffset;
  
  	if (tp->tp_dict == NULL) {
***************
*** 1087,1098 ****
  			return NULL;
  	}
  	descr = PyDict_GetItem(tp->tp_dict, name);
  	if (descr != NULL) {
  		f = descr->ob_type->tp_descr_get;
! 		if (f != NULL)
! 			return (*f)(descr, obj);
  		Py_INCREF(descr);
  		return descr;
  	}
  	PyErr_Format(PyExc_AttributeError,
  		     "'%.50s' object has no attribute '%.400s'",
--- 1088,1120 ----
  			return NULL;
  	}
+ 
  	descr = PyDict_GetItem(tp->tp_dict, name);
+ 	f = NULL;
  	if (descr != NULL) {
  		f = descr->ob_type->tp_descr_get;
! 		if (f != NULL && PyDescr_IsData(descr))
! 			return f(descr, obj);
! 	}
! 
! 	dictoffset = tp->tp_dictoffset;
! 	if (dictoffset != 0) {
! 		PyObject *dict = * (PyObject **) ((char *)obj + dictoffset);
! 		if (dict != NULL) {
! 			PyObject *res = PyDict_GetItem(dict, name);
! 			if (res != NULL) {
! 				Py_INCREF(res);
! 				return res;
! 			}
! 		}
! 	}
! 
! 	if (f != NULL)
! 		return f(descr, obj);
! 
! 	if (descr != NULL) {
  		Py_INCREF(descr);
  		return descr;
  	}
+ 
  	PyErr_Format(PyExc_AttributeError,
  		     "'%.50s' object has no attribute '%.400s'",
***************
*** 1107,1110 ****
--- 1129,1133 ----
  	PyObject *descr;
  	descrsetfunc f;
+ 	int dictoffset;
  
  	if (tp->tp_dict == NULL) {
***************
*** 1113,1116 ****
--- 1136,1171 ----
  	}
  	descr = PyDict_GetItem(tp->tp_dict, name);
+ 	f = NULL;
+ 	if (descr != NULL) {
+ 		f = descr->ob_type->tp_descr_set;
+ 		if (f != NULL && PyDescr_IsData(descr))
+ 			return f(descr, obj, value);
+ 	}
+ 
+ 	dictoffset = tp->tp_dictoffset;
+ 	if (dictoffset != 0) {
+ 		PyObject **dictptr = (PyObject **) ((char *)obj + dictoffset);
+ 		PyObject *dict = *dictptr;
+ 		if (dict == NULL && value != NULL) {
+ 			dict = PyDict_New();
+ 			if (dict == NULL)
+ 				return -1;
+ 			*dictptr = dict;
+ 		}
+ 		if (dict != NULL) {
+ 			int res;
+ 			if (value == NULL)
+ 				res = PyDict_DelItem(dict, name);
+ 			else
+ 				res = PyDict_SetItem(dict, name, value);
+ 			if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
+ 				PyErr_SetObject(PyExc_AttributeError, name);
+ 			return res;
+ 		}
+ 	}
+ 
+ 	if (f != NULL)
+ 		return f(descr, obj, value);
+ 
  	if (descr == NULL) {
  		PyErr_Format(PyExc_AttributeError,
***************
*** 1119,1124 ****
  		return -1;
  	}
! 	if ((f = descr->ob_type->tp_descr_set) != NULL)
! 		return (*f)(descr, obj, value);
  	PyErr_Format(PyExc_AttributeError,
  		     "'%.50s' object attribute '%.400s' is read-only",
--- 1174,1178 ----
  		return -1;
  	}
! 
  	PyErr_Format(PyExc_AttributeError,
  		     "'%.50s' object attribute '%.400s' is read-only",