]> granicus.if.org Git - python/commitdiff
typeobject.c, slot_tp_gettattr_hook(): fix the speedup hack -- the
authorGuido van Rossum <guido@python.org>
Wed, 3 Oct 2001 13:58:35 +0000 (13:58 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 3 Oct 2001 13:58:35 +0000 (13:58 +0000)
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.

Objects/typeobject.c

index d9769455d962e07c86b305944ed049c4fb928008..c50b4465faabc1510e449514efaea1f834001406 100644 (file)
@@ -3296,8 +3296,20 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name)
        }
        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);