mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
Fix the fix for issue #12149: it was incorrect, although it had the side
effect of appearing to resolve the issue. Thanks to Mark Shannon for noticing.
This commit is contained in:
commit
d73a9acb63
2 changed files with 14 additions and 8 deletions
|
@ -999,8 +999,6 @@ subtype_dealloc(PyObject *self)
|
|||
assert(basedealloc);
|
||||
basedealloc(self);
|
||||
|
||||
PyType_Modified(type);
|
||||
|
||||
/* Can't reference self beyond this point */
|
||||
Py_DECREF(type);
|
||||
|
||||
|
@ -2776,15 +2774,16 @@ type_clear(PyTypeObject *type)
|
|||
for heaptypes. */
|
||||
assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
||||
|
||||
/* The only field we need to clear is tp_mro, which is part of a
|
||||
hard cycle (its first element is the class itself) that won't
|
||||
be broken otherwise (it's a tuple and tuples don't have a
|
||||
/* We need to invalidate the method cache carefully before clearing
|
||||
the dict, so that other objects caught in a reference cycle
|
||||
don't start calling destroyed methods.
|
||||
|
||||
Otherwise, the only field we need to clear is tp_mro, which is
|
||||
part of a hard cycle (its first element is the class itself) that
|
||||
won't be broken otherwise (it's a tuple and tuples don't have a
|
||||
tp_clear handler). None of the other fields need to be
|
||||
cleared, and here's why:
|
||||
|
||||
tp_dict:
|
||||
It is a dict, so the collector will call its tp_clear.
|
||||
|
||||
tp_cache:
|
||||
Not used; if it were, it would be a dict.
|
||||
|
||||
|
@ -2801,6 +2800,9 @@ type_clear(PyTypeObject *type)
|
|||
A tuple of strings can't be part of a cycle.
|
||||
*/
|
||||
|
||||
PyType_Modified(type);
|
||||
if (type->tp_dict)
|
||||
PyDict_Clear(type->tp_dict);
|
||||
Py_CLEAR(type->tp_mro);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue