mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +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