mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Variation of patch # 1624059 to speed up checking if an object is a subclass
of some of the common builtin types. Use a bit in tp_flags for each common builtin type. Check the bit to determine if any instance is a subclass of these common types. The check avoids a function call and O(n) search of the base classes. The check is done in the various Py*_Check macros rather than calling PyType_IsSubtype(). All the bits are set in tp_flags when the type is declared in the Objects/*object.c files because PyType_Ready() is not called for all the types. Should PyType_Ready() be called for all types? If so and the change is made, the changes to the Objects/*object.c files can be reverted (remove setting the tp_flags). Objects/typeobject.c would also have to be modified to add conditions for Py*_CheckExact() in addition to each the PyType_IsSubtype check.
This commit is contained in:
		
							parent
							
								
									5a3e812444
								
							
						
					
					
						commit
						ee3a1b5244
					
				
					 18 changed files with 61 additions and 22 deletions
				
			
		|  | @ -2288,7 +2288,7 @@ PyTypeObject PyType_Type = { | |||
| 	(setattrofunc)type_setattro,		/* tp_setattro */ | ||||
| 	0,					/* tp_as_buffer */ | ||||
| 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | | ||||
| 		Py_TPFLAGS_BASETYPE,		/* tp_flags */ | ||||
| 		Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS,	/* tp_flags */ | ||||
| 	type_doc,				/* tp_doc */ | ||||
| 	(traverseproc)type_traverse,		/* tp_traverse */ | ||||
| 	(inquiry)type_clear,			/* tp_clear */ | ||||
|  | @ -2967,6 +2967,26 @@ inherit_special(PyTypeObject *type, PyTypeObject *base) | |||
| 	if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) { | ||||
| 		COPYVAL(tp_dictoffset); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Setup fast subclass flags */ | ||||
| 	if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyType_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyInt_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_INT_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyLong_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyString_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_STRING_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyUnicode_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyTuple_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyList_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS; | ||||
| 	else if (PyType_IsSubtype(base, &PyDict_Type)) | ||||
| 		type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neal Norwitz
						Neal Norwitz