[Python-checkins] python/dist/src/Objects classobject.c,2.154.8.2,2.154.8.3

nnorwitz@users.sourceforge.net nnorwitz@users.sourceforge.net
Sun, 02 Feb 2003 11:37:53 -0800


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

Modified Files:
      Tag: release22-maint
	classobject.c 
Log Message:
backport:

revision 2.164
date: 2002/10/29 18:36:40;  author: gvanrossum;  state: Exp;  lines: +12 -13
Since properties are supported here, is possible that
instance_getattr2() raises an exception.  Fix all code that made this
assumption.



Index: classobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/classobject.c,v
retrieving revision 2.154.8.2
retrieving revision 2.154.8.3
diff -C2 -d -r2.154.8.2 -r2.154.8.3
*** classobject.c	18 Oct 2002 14:06:02 -0000	2.154.8.2
--- classobject.c	2 Feb 2003 19:37:32 -0000	2.154.8.3
***************
*** 544,547 ****
--- 544,551 ----
  	init = instance_getattr2(inst, initstr);
  	if (init == NULL) {
+ 		if (PyErr_Occurred()) {
+ 			Py_DECREF(inst);
+ 			return NULL;
+ 		}
  		if ((arg != NULL && (!PyTuple_Check(arg) ||
  				     PyTuple_Size(arg) != 0))
***************
*** 675,679 ****
  	}
  	v = instance_getattr2(inst, name);
! 	if (v == NULL) {
  		PyErr_Format(PyExc_AttributeError,
  			     "%.50s instance has no attribute '%.400s'",
--- 679,683 ----
  	}
  	v = instance_getattr2(inst, name);
! 	if (v == NULL && !PyErr_Occurred()) {
  		PyErr_Format(PyExc_AttributeError,
  			     "%.50s instance has no attribute '%.400s'",
***************
*** 1760,1782 ****
  	   instance_getattr2 directly because it will not set an
  	   exception on failure. */
! 	if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
! 		method = instance_getattr2((PyInstanceObject *)v, 
  					   name_op[op]);
! 		if (method == NULL) {
! 			assert(!PyErr_Occurred());
! 			res = Py_NotImplemented;
! 			Py_INCREF(res);
! 			return res;
! 		}
! 	} else {
  		method = PyObject_GetAttr(v, name_op[op]);
! 		if (method == NULL) {
  			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
  				return NULL;
  			PyErr_Clear();
- 			res = Py_NotImplemented;
- 			Py_INCREF(res);
- 			return res;
  		}
  	}
  
--- 1764,1781 ----
  	   instance_getattr2 directly because it will not set an
  	   exception on failure. */
! 	if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
! 		method = instance_getattr2((PyInstanceObject *)v,
  					   name_op[op]);
! 	else
  		method = PyObject_GetAttr(v, name_op[op]);
! 	if (method == NULL) {
! 		if (PyErr_Occurred()) {
  			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
  				return NULL;
  			PyErr_Clear();
  		}
+ 		res = Py_NotImplemented;
+ 		Py_INCREF(res);
+ 		return res;
  	}