Mercurial > cpython-lru_cache-weakref
diff Include/pyerrors.h @ 40908:d01bd37bf5ce legacy-trunk
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.
| author | Neal Norwitz <nnorwitz@gmail.com> |
|---|---|
| date | Sun, 25 Feb 2007 19:44:48 +0000 |
| parents | 635b09b1f542 |
| children | 37189e375ec7 |
line wrap: on
line diff
--- a/Include/pyerrors.h Sun Feb 25 17:56:27 2007 +0000 +++ b/Include/pyerrors.h Sun Feb 25 19:44:48 2007 +0000 @@ -95,14 +95,12 @@ /* */ #define PyExceptionClass_Check(x) \ - (PyClass_Check((x)) \ - || (PyType_Check((x)) && PyType_IsSubtype( \ - (PyTypeObject*)(x), (PyTypeObject*)PyExc_BaseException))) - + (PyClass_Check((x)) || (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))) #define PyExceptionInstance_Check(x) \ (PyInstance_Check((x)) || \ - (PyType_IsSubtype((x)->ob_type, (PyTypeObject*)PyExc_BaseException))) + PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)) #define PyExceptionClass_Name(x) \ (PyClass_Check((x)) \
