mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
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.
This commit is contained in:
parent
ae3b1258e4
commit
1e1de1cf35
1 changed files with 12 additions and 0 deletions
|
|
@ -3296,8 +3296,20 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name)
|
||||||
}
|
}
|
||||||
getattr = _PyType_Lookup(tp, getattr_str);
|
getattr = _PyType_Lookup(tp, getattr_str);
|
||||||
getattribute = _PyType_Lookup(tp, getattribute_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) {
|
if (getattr == NULL && getattribute == NULL) {
|
||||||
/* Avoid further slowdowns */
|
/* 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)
|
if (tp->tp_getattro == slot_tp_getattr_hook)
|
||||||
tp->tp_getattro = PyObject_GenericGetAttr;
|
tp->tp_getattro = PyObject_GenericGetAttr;
|
||||||
return PyObject_GenericGetAttr(self, name);
|
return PyObject_GenericGetAttr(self, name);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue