[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);
}