[Python-checkins] python/dist/src/Objects abstract.c,2.115,2.116

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Tue, 11 Feb 2003 19:30:36 -0800


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

Modified Files:
	abstract.c 
Log Message:
SF #532767: isinstance(x, X) should work when x is a proxy for an X
instance, as long as x.__class__ is X or a subclass thereof.
Did a little cleanup of PyObject_IsInstance() too.


Index: abstract.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/abstract.c,v
retrieving revision 2.115
retrieving revision 2.116
diff -C2 -d -r2.115 -r2.116
*** abstract.c	10 Feb 2003 16:05:43 -0000	2.115
--- abstract.c	12 Feb 2003 03:30:34 -0000	2.116
***************
*** 2041,2044 ****
--- 2041,2050 ----
  	int retval = 0;
  
+ 	if (__class__ == NULL) {
+ 		__class__ = PyString_FromString("__class__");
+ 		if (__class__ == NULL)
+ 			return -1;
+ 	}
+ 
  	if (PyClass_Check(cls) && PyInstance_Check(inst)) {
  		PyObject *inclass =
***************
*** 2048,2051 ****
--- 2054,2070 ----
  	else if (PyType_Check(cls)) {
  		retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
+ 		if (retval == 0) {
+ 			PyObject *c = PyObject_GetAttr(inst, __class__);
+ 			if (c == NULL) {
+ 				PyErr_Clear();
+ 			}
+ 			else {
+ 				if (c != inst->ob_type && PyType_Check(c))
+ 					retval = PyType_IsSubtype(
+ 						(PyTypeObject *)c,
+ 						(PyTypeObject *)cls);
+ 				Py_DECREF(c);
+ 			}
+ 		}
  	}
  	else if (PyTuple_Check(cls)) {
***************
*** 2061,2065 ****
  				break;
  		}
- 		return retval;
  	}
  	else {
--- 2080,2083 ----
***************
*** 2068,2076 ****
  			" or tuple of classes and types"))
  			return -1;
- 		if (__class__ == NULL) {
- 			__class__ = PyString_FromString("__class__");
- 			if (__class__ == NULL)
- 				return -1;
- 		}
  		icls = PyObject_GetAttr(inst, __class__);
  		if (icls == NULL) {
--- 2086,2089 ----