mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
Variation of patch # 1624059 to speed up checking if an object is a subclass
of some of the common builtin types. Use a bit in tp_flags for each common builtin type. Check the bit to determine if any instance is a subclass of these common types. The check avoids a function call and O(n) search of the base classes. The check is done in the various Py*_Check macros rather than calling PyType_IsSubtype(). All the bits are set in tp_flags when the type is declared in the Objects/*object.c files because PyType_Ready() is not called for all the types. Should PyType_Ready() be called for all types? If so and the change is made, the changes to the Objects/*object.c files can be reverted (remove setting the tp_flags). Objects/typeobject.c would also have to be modified to add conditions for Py*_CheckExact() in addition to each the PyType_IsSubtype check.
This commit is contained in:
parent
5a3e812444
commit
ee3a1b5244
18 changed files with 61 additions and 22 deletions
|
@ -2288,7 +2288,7 @@ PyTypeObject PyType_Type = {
|
|||
(setattrofunc)type_setattro, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
||||
Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||
Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */
|
||||
type_doc, /* tp_doc */
|
||||
(traverseproc)type_traverse, /* tp_traverse */
|
||||
(inquiry)type_clear, /* tp_clear */
|
||||
|
@ -2967,6 +2967,26 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
|
|||
if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
|
||||
COPYVAL(tp_dictoffset);
|
||||
}
|
||||
|
||||
/* Setup fast subclass flags */
|
||||
if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException))
|
||||
type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyType_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyInt_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_INT_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyLong_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyString_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_STRING_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyUnicode_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyTuple_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyList_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
|
||||
else if (PyType_IsSubtype(base, &PyDict_Type))
|
||||
type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue