Mercurial > cpython-lru_cache-weakref
diff Objects/typeobject.c @ 20231:464f9a09a910 legacy-trunk
typeobject.c, slot_tp_gettattr_hook(): fix the speedup hack -- the
test for getattribute==NULL was bogus because it always found
object.__getattribute__. Pick it apart using the trick we learned
from slot_sq_item, and if it's just a wrapper around
PyObject_GenericGetAttr, zap it. Also added a long XXX comment
explaining the consequences.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 03 Oct 2001 13:58:35 +0000 |
| parents | 8bad55edfdf3 |
| children | 2745c3dc24af |
line wrap: on
line diff
--- a/Objects/typeobject.c Wed Oct 03 12:21:23 2001 +0000 +++ b/Objects/typeobject.c Wed Oct 03 13:58:35 2001 +0000 @@ -3296,8 +3296,20 @@ } getattr = _PyType_Lookup(tp, getattr_str); getattribute = _PyType_Lookup(tp, getattribute_str); + if (getattribute != NULL && + getattribute->ob_type == &PyWrapperDescr_Type && + ((PyWrapperDescrObject *)getattribute)->d_wrapped == + PyObject_GenericGetAttr) + getattribute = NULL; if (getattr == NULL && getattribute == NULL) { /* Avoid further slowdowns */ + /* XXX This is questionable: it means that a class that + isn't born with __getattr__ or __getattribute__ cannot + acquire them in later life. But it's a relatively big + speedup, so I'm keeping it in for now. If this is + removed, you can also remove the "def __getattr__" from + class C (marked with another XXX comment) in dynamics() + in Lib/test/test_descr.py. */ if (tp->tp_getattro == slot_tp_getattr_hook) tp->tp_getattro = PyObject_GenericGetAttr; return PyObject_GenericGetAttr(self, name);
