[Python-checkins] CVS: python/dist/src/Python bltinmodule.c,2.194,2.195

Guido van Rossum gvanrossum@users.sourceforge.net
Wed, 21 Mar 2001 10:41:00 -0800


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

Modified Files:
	bltinmodule.c 
Log Message:
Move the code implementing isinstance() and issubclass() to new C
APIs, PyObject_IsInstance() and PyObject_IsSubclass() -- both
returning an int, or -1 for errors.



Index: bltinmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/bltinmodule.c,v
retrieving revision 2.194
retrieving revision 2.195
diff -C2 -r2.194 -r2.195
*** bltinmodule.c	2001/01/19 21:36:19	2.194
--- bltinmodule.c	2001/03/21 18:40:58	2.195
***************
*** 2006,2057 ****
  With an argument, equivalent to object.__dict__.";
  
- static int
- abstract_issubclass(PyObject *derived, PyObject *cls, int first)
- {
- 	static PyObject *__bases__ = NULL;
- 	PyObject *bases;
- 	int i, n;
- 	int r = 0;
- 
- 	if (__bases__ == NULL) {
- 		__bases__ = PyString_FromString("__bases__");
- 		if (__bases__ == NULL)
- 			return -1;
- 	}
- 
- 	if (first) {
- 		bases = PyObject_GetAttr(cls, __bases__);
- 		if (bases == NULL || !PyTuple_Check(bases)) {
- 			Py_XDECREF(bases);
- 			PyErr_SetString(PyExc_TypeError,
- 					"issubclass() arg 2 must be a class");
- 			return -1;
- 		}
- 		Py_DECREF(bases);
- 	}
- 
- 	if (derived == cls)
- 		return 1;
- 
- 	bases = PyObject_GetAttr(derived, __bases__);
- 	if (bases == NULL || !PyTuple_Check(bases)) {
- 	        Py_XDECREF(bases);
- 		PyErr_SetString(PyExc_TypeError,
- 				"issubclass() arg 1 must be a class");
- 		return -1;
- 	}
- 
- 	n = PyTuple_GET_SIZE(bases);
- 	for (i = 0; i < n; i++) {
- 		r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
- 		if (r != 0)
- 			break;
- 	}
- 
- 	Py_DECREF(bases);
- 
- 	return r;
- }
- 
  static PyObject *
  builtin_isinstance(PyObject *self, PyObject *args)
--- 2006,2009 ----
***************
*** 2059,2104 ****
  	PyObject *inst;
  	PyObject *cls;
! 	PyObject *icls;
! 	static PyObject *__class__ = NULL;
! 	int retval = 0;
  
  	if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
  		return NULL;
  
!         if (PyClass_Check(cls)) {
! 		if (PyInstance_Check(inst)) {
! 			PyObject *inclass =
! 				(PyObject*)((PyInstanceObject*)inst)->in_class;
! 			retval = PyClass_IsSubclass(inclass, cls);
! 		}
! 	}
! 	else if (PyType_Check(cls)) {
! 		retval = ((PyObject *)(inst->ob_type) == cls);
! 	}
! 	else if (!PyInstance_Check(inst)) {
! 		if (__class__ == NULL) {
! 			__class__ = PyString_FromString("__class__");
! 			if (__class__ == NULL)
! 				return NULL;
! 		}
! 		icls = PyObject_GetAttr(inst, __class__);
! 		if (icls != NULL) {
! 			retval = abstract_issubclass(icls, cls, 1);
! 			Py_DECREF(icls);
! 			if (retval < 0 &&
! 			    !PyErr_ExceptionMatches(PyExc_TypeError))
! 				return NULL;
! 		}
! 		else
! 			retval = -1;
! 	}
! 	else
! 		retval = -1;
! 
! 	if (retval < 0) {
! 		PyErr_SetString(PyExc_TypeError,
! 				"isinstance() arg 2 must be a class or type");
  		return NULL;
- 	}
  	return PyInt_FromLong(retval);
  }
--- 2011,2022 ----
  	PyObject *inst;
  	PyObject *cls;
! 	int retval;
  
  	if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
  		return NULL;
  
! 	retval = PyObject_IsInstance(inst, cls);
! 	if (retval < 0)
  		return NULL;
  	return PyInt_FromLong(retval);
  }
***************
*** 2121,2135 ****
  		return NULL;
  
! 	if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
! 		retval = abstract_issubclass(derived, cls, 1);
! 		if (retval < 0)
! 			return NULL;
! 	}
! 	else {
! 		/* shortcut */
! 	  	if (!(retval = (derived == cls)))
! 			retval = PyClass_IsSubclass(derived, cls);
! 	}
! 
  	return PyInt_FromLong(retval);
  }
--- 2039,2045 ----
  		return NULL;
  
! 	retval = PyObject_IsSubclass(derived, cls);
! 	if (retval < 0)
! 		return NULL;
  	return PyInt_FromLong(retval);
  }