[Python-checkins] CVS: python/dist/src/Python structmember.c,2.22,2.23

Guido van Rossum gvanrossum@users.sourceforge.net
Tue, 04 Dec 2001 08:23:45 -0800


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

Modified Files:
	structmember.c 
Log Message:
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.

There's now a new structmember code, T_OBJECT_EX, which is used for
all __slot__ variables (except __weakref__, which has special behavior
anyway).  This new code raises AttributeError when the variable is
NULL rather than converting NULL to None.



Index: structmember.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/structmember.c,v
retrieving revision 2.22
retrieving revision 2.23
diff -C2 -d -r2.22 -r2.23
*** structmember.c	2001/10/16 16:51:56	2.22
--- structmember.c	2001/12/04 16:23:42	2.23
***************
*** 130,133 ****
--- 130,139 ----
  		Py_INCREF(v);
  		break;
+ 	case T_OBJECT_EX:
+ 		v = *(PyObject **)addr;
+ 		if (v == NULL)
+ 			PyErr_SetString(PyExc_AttributeError, l->name);
+ 		Py_XINCREF(v);
+ 		break;
  	default:
  		PyErr_SetString(PyExc_SystemError, "bad memberdescr type");
***************
*** 176,180 ****
  		return -1;
  	}
! 	if (v == NULL && l->type != T_OBJECT) {
  		PyErr_SetString(PyExc_TypeError,
  				"can't delete numeric/char attribute");
--- 182,186 ----
  		return -1;
  	}
! 	if (v == NULL && l->type != T_OBJECT_EX && l->type != T_OBJECT) {
  		PyErr_SetString(PyExc_TypeError,
  				"can't delete numeric/char attribute");
***************
*** 247,250 ****
--- 253,257 ----
  		break;
  	case T_OBJECT:
+ 	case T_OBJECT_EX:
  		Py_XINCREF(v);
  		oldv = *(PyObject **)addr;