[Python-Dev] Re: [Python-checkins] CVS: python/dist/src/Objects object.c,2.124.4.11,2.124.4.12

Greg Stein gstein@lyra.org
Mon, 11 Jun 2001 04:31:59 -0700


On Wed, Jun 06, 2001 at 07:34:15AM -0700, Guido van Rossum wrote:
> Update of /cvsroot/python/python/dist/src/Objects
> In directory usw-pr-cvs1:/tmp/cvs-serv17474
> 
> Modified Files:
>       Tag: descr-branch
> 	object.c 
> Log Message:
> Add _PyObject_GetDictPtr() -- an internal API to get a pointer to
> where __dict__ is stored in an object.  The simplest case is to add
> tp_dictoffset to the start of the object, but there are comlications:
> tp_flags may tell us that tp_dictoffset is not defined, or the offset
> may be negative: indexing from the end of the object, where
> tp_itemsize may have to be taken into account.

Why would you ever have a negative size in there? That seems like an
unnecessary "feature". The offsets are easily set up by the compiler as
positive values. (not even sure how you'd come up with a proper/valid
negative value)

Cheers,
-g

> 
> 
> Index: object.c
> ===================================================================
> RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
> retrieving revision 2.124.4.11
> retrieving revision 2.124.4.12
> diff -C2 -r2.124.4.11 -r2.124.4.12
> *** object.c	2001/06/06 14:27:54	2.124.4.11
> --- object.c	2001/06/06 14:34:13	2.124.4.12
> ***************
> *** 1074,1077 ****
> --- 1074,1111 ----
>   }
>   
> + /* Helper to get a pointer to an object's __dict__ slot, if any */
> + 
> + PyObject **
> + _PyObject_GetDictPtr(PyObject *obj)
> + {
> + #define PTRSIZE (sizeof(PyObject *))
> + 
> + 	long dictoffset;
> + 	PyTypeObject *tp = obj->ob_type;
> + 
> + 	if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS))
> + 		return NULL;
> + 	dictoffset = tp->tp_dictoffset;
> + 	if (dictoffset == 0)
> + 		return NULL;
> + 	if (dictoffset < 0) {
> + 		dictoffset += tp->tp_basicsize;
> + 		assert(dictoffset > 0); /* Sanity check */
> + 		if (tp->tp_itemsize > 0) {
> + 			int n = ((PyVarObject *)obj)->ob_size;
> + 			if (n > 0) {
> + 				dictoffset += tp->tp_itemsize * n;
> + 				/* Round up, if necessary */
> + 				if (tp->tp_itemsize % PTRSIZE != 0) {
> + 					dictoffset += PTRSIZE - 1;
> + 					dictoffset /= PTRSIZE;
> + 					dictoffset *= PTRSIZE;
> + 				}
> + 			}
> + 		}
> + 	}
> + 	return (PyObject **) ((char *)obj + dictoffset);
> + }
> + 
>   /* Generic GetAttr functions - put these in your tp_[gs]etattro slot */
>   
> ***************
> *** 1082,1086 ****
>   	PyObject *descr;
>   	descrgetfunc f;
> ! 	int dictoffset;
>   
>   	if (tp->tp_dict == NULL) {
> --- 1116,1120 ----
>   	PyObject *descr;
>   	descrgetfunc f;
> ! 	PyObject **dictptr;
>   
>   	if (tp->tp_dict == NULL) {
> ***************
> *** 1097,1103 ****
>   	}
>   
> ! 	dictoffset = tp->tp_dictoffset;
> ! 	if (dictoffset != 0) {
> ! 		PyObject *dict = * (PyObject **) ((char *)obj + dictoffset);
>   		if (dict != NULL) {
>   			PyObject *res = PyDict_GetItem(dict, name);
> --- 1131,1137 ----
>   	}
>   
> ! 	dictptr = _PyObject_GetDictPtr(obj);
> ! 	if (dictptr != NULL) {
> ! 		PyObject *dict = *dictptr;
>   		if (dict != NULL) {
>   			PyObject *res = PyDict_GetItem(dict, name);
> ***************
> *** 1129,1133 ****
>   	PyObject *descr;
>   	descrsetfunc f;
> ! 	int dictoffset;
>   
>   	if (tp->tp_dict == NULL) {
> --- 1163,1167 ----
>   	PyObject *descr;
>   	descrsetfunc f;
> ! 	PyObject **dictptr;
>   
>   	if (tp->tp_dict == NULL) {
> ***************
> *** 1143,1149 ****
>   	}
>   
> ! 	dictoffset = tp->tp_dictoffset;
> ! 	if (dictoffset != 0) {
> ! 		PyObject **dictptr = (PyObject **) ((char *)obj + dictoffset);
>   		PyObject *dict = *dictptr;
>   		if (dict == NULL && value != NULL) {
> --- 1177,1182 ----
>   	}
>   
> ! 	dictptr = _PyObject_GetDictPtr(obj);
> ! 	if (dictptr != NULL) {
>   		PyObject *dict = *dictptr;
>   		if (dict == NULL && value != NULL) {
> 
> 
> _______________________________________________
> Python-checkins mailing list
> Python-checkins@python.org
> http://mail.python.org/mailman/listinfo/python-checkins

-- 
Greg Stein, http://www.lyra.org/