mirror of https://github.com/python/cpython
Closes #22540: speed up PyObject_IsInstance and PyObject_IsSubclass in the common case that the second argument has metaclass "type".
This commit is contained in:
parent
f355943002
commit
72b8a80e59
|
@ -10,6 +10,9 @@ Release date: TBA
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #22540: speed up `PyObject_IsInstance` and `PyObject_IsSubclass` in the
|
||||||
|
common case that the second argument has metaclass `type`.
|
||||||
|
|
||||||
- Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format`
|
- Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format`
|
||||||
but accepting a `va_list` argument.
|
but accepting a `va_list` argument.
|
||||||
|
|
||||||
|
|
|
@ -2538,6 +2538,11 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
|
||||||
if (Py_TYPE(inst) == (PyTypeObject *)cls)
|
if (Py_TYPE(inst) == (PyTypeObject *)cls)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* We know what type's __instancecheck__ does. */
|
||||||
|
if (PyType_CheckExact(cls)) {
|
||||||
|
return recursive_isinstance(inst, cls);
|
||||||
|
}
|
||||||
|
|
||||||
if (PyTuple_Check(cls)) {
|
if (PyTuple_Check(cls)) {
|
||||||
Py_ssize_t i;
|
Py_ssize_t i;
|
||||||
Py_ssize_t n;
|
Py_ssize_t n;
|
||||||
|
@ -2576,6 +2581,7 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
|
||||||
}
|
}
|
||||||
else if (PyErr_Occurred())
|
else if (PyErr_Occurred())
|
||||||
return -1;
|
return -1;
|
||||||
|
/* Probably never reached anymore. */
|
||||||
return recursive_isinstance(inst, cls);
|
return recursive_isinstance(inst, cls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2603,6 +2609,14 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
|
||||||
_Py_IDENTIFIER(__subclasscheck__);
|
_Py_IDENTIFIER(__subclasscheck__);
|
||||||
PyObject *checker;
|
PyObject *checker;
|
||||||
|
|
||||||
|
/* We know what type's __subclasscheck__ does. */
|
||||||
|
if (PyType_CheckExact(cls)) {
|
||||||
|
/* Quick test for an exact match */
|
||||||
|
if (derived == cls)
|
||||||
|
return 1;
|
||||||
|
return recursive_issubclass(derived, cls);
|
||||||
|
}
|
||||||
|
|
||||||
if (PyTuple_Check(cls)) {
|
if (PyTuple_Check(cls)) {
|
||||||
Py_ssize_t i;
|
Py_ssize_t i;
|
||||||
Py_ssize_t n;
|
Py_ssize_t n;
|
||||||
|
@ -2641,6 +2655,7 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
|
||||||
}
|
}
|
||||||
else if (PyErr_Occurred())
|
else if (PyErr_Occurred())
|
||||||
return -1;
|
return -1;
|
||||||
|
/* Probably never reached anymore. */
|
||||||
return recursive_issubclass(derived, cls);
|
return recursive_issubclass(derived, cls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue