Mailing List Archive

CVS: python/dist/src/Objects object.c,2.124.4.9,2.124.4.10
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",