diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2007-02-25 19:44:48 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2007-02-25 19:44:48 (GMT) |
commit | ee3a1b5244e60566c5d5c8f6a1ea4b381de99f1c (patch) | |
tree | ad52a17fc77530870a575107a7cea9c27de17606 /Objects/exceptions.c | |
parent | 5a3e812444609329b30be837a08c11269d917b72 (diff) | |
download | cpython-ee3a1b5244e60566c5d5c8f6a1ea4b381de99f1c.zip cpython-ee3a1b5244e60566c5d5c8f6a1ea4b381de99f1c.tar.gz cpython-ee3a1b5244e60566c5d5c8f6a1ea4b381de99f1c.tar.bz2 |
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.
Diffstat (limited to 'Objects/exceptions.c')
-rw-r--r-- | Objects/exceptions.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 0cd819c..c6ea6a4 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -300,7 +300,8 @@ static PyTypeObject _PyExc_BaseException = { PyObject_GenericGetAttr, /*tp_getattro*/ PyObject_GenericSetAttr, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/ PyDoc_STR("Common base class for all exceptions"), /* tp_doc */ (traverseproc)BaseException_traverse, /* tp_traverse */ (inquiry)BaseException_clear, /* tp_clear */ |