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))					   \