mirror of https://github.com/python/cpython
Use a static and interned string for __subclasscheck__ and __instancecheck__ as suggested by Thomas Heller in #2115
This commit is contained in:
parent
e7fb0c5114
commit
e247f0037f
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue