Kaydet (Commit) 72b8a80e authored tarafından Georg Brandl's avatar Georg Brandl

Closes #22540: speed up PyObject_IsInstance and PyObject_IsSubclass in the…

Closes #22540: speed up PyObject_IsInstance and PyObject_IsSubclass in the common case that the second argument has metaclass "type".
üst f3559430
......@@ -10,6 +10,9 @@ Release date: TBA
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`
but accepting a `va_list` argument.
......
......@@ -2538,6 +2538,11 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
if (Py_TYPE(inst) == (PyTypeObject *)cls)
return 1;
/* We know what type's __instancecheck__ does. */
if (PyType_CheckExact(cls)) {
return recursive_isinstance(inst, cls);
}
if (PyTuple_Check(cls)) {
Py_ssize_t i;
Py_ssize_t n;
......@@ -2576,6 +2581,7 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
}
else if (PyErr_Occurred())
return -1;
/* Probably never reached anymore. */
return recursive_isinstance(inst, cls);
}
......@@ -2603,6 +2609,14 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
_Py_IDENTIFIER(__subclasscheck__);
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)) {
Py_ssize_t i;
Py_ssize_t n;
......@@ -2641,6 +2655,7 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
}
else if (PyErr_Occurred())
return -1;
/* Probably never reached anymore. */
return recursive_issubclass(derived, cls);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment