mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-45107: Make LOAD_METHOD_CLASS safer and faster, clean up comments (GH-28177)
* Improve comments * Check cls is a type, remove dict calculation
This commit is contained in:
parent
b0a6ede3d0
commit
70bed6f993
2 changed files with 9 additions and 15 deletions
|
@ -974,20 +974,19 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
|
|||
// Fall through.
|
||||
} // Else owner is maybe a builtin with no dict, or __slots__. Doesn't matter.
|
||||
|
||||
/* `descr` is borrowed. Just check tp_version_tag before accessing in case
|
||||
* it's deleted. This is safe for methods (even inherited ones from super
|
||||
* classes!) as long as tp_version_tag is validated for two main reasons:
|
||||
/* `descr` is borrowed. This is safe for methods (even inherited ones from
|
||||
* super classes!) as long as tp_version_tag is validated for two main reasons:
|
||||
*
|
||||
* 1. The class will always hold a reference to the method so it will
|
||||
* usually not be GC-ed. Should it be deleted in Python, e.g.
|
||||
* `del obj.meth`, tp_version_tag will be invalidated, because of reason 2.
|
||||
*
|
||||
* 2. The pre-existing type method cache (MCACHE) uses the same principles
|
||||
* of caching a borrowed descriptor. It does all the heavy lifting for us.
|
||||
* E.g. it invalidates on any MRO modification, on any type object
|
||||
* change along said MRO, etc. (see PyType_Modified usages in typeobject.c).
|
||||
* The type method cache has been working since Python 2.6 and it's
|
||||
* battle-tested.
|
||||
* of caching a borrowed descriptor. The MCACHE infrastructure does all the
|
||||
* heavy lifting for us. E.g. it invalidates tp_version_tag on any MRO
|
||||
* modification, on any type object change along said MRO, etc. (see
|
||||
* PyType_Modified usages in typeobject.c). The MCACHE has been
|
||||
* working since Python 2.6 and it's battle-tested.
|
||||
*/
|
||||
cache2->obj = descr;
|
||||
cache1->dk_version_or_hint = keys_version;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue