Kaydet (Commit) 1e1de1cf authored tarafından Guido van Rossum's avatar Guido van Rossum

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.
üst ae3b1258
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment