Use a static and interned string for __subclasscheck__ and __instancecheck__ as suggested by Thomas Heller in #2115

This commit is contained in:
Christian Heimes 2008-02-14 22:40:11 +00:00
parent e7fb0c5114
commit e247f0037f
1 changed files with 16 additions and 2 deletions

View File

@ -2401,10 +2401,17 @@ recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
int
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
static PyObject *name = NULL;
PyObject *t, *v, *tb;
PyObject *checker;
PyErr_Fetch(&t, &v, &tb);
checker = PyObject_GetAttrString(cls, "__instancecheck__");
if (name == NULL) {
name = PyString_InternFromString("__instancecheck__");
if (name == NULL)
return -1;
}
checker = PyObject_GetAttr(cls, name);
PyErr_Restore(t, v, tb);
if (checker != NULL) {
PyObject *res;
@ -2477,10 +2484,17 @@ recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
int
PyObject_IsSubclass(PyObject *derived, PyObject *cls)
{
static PyObject *name = NULL;
PyObject *t, *v, *tb;
PyObject *checker;
PyErr_Fetch(&t, &v, &tb);
checker = PyObject_GetAttrString(cls, "__subclasscheck__");
if (name == NULL) {
name = PyString_InternFromString("__subclasscheck__");
if (name == NULL)
return -1;
}
checker = PyObject_GetAttr(cls, name);
PyErr_Restore(t, v, tb);
if (checker != NULL) {
PyObject *res;