[Python-checkins] cpython (3.2): Fix the fix for issue #12149: it was incorrect, although it had the side

antoine.pitrou python-checkins at python.org
Thu Dec 15 14:21:39 CET 2011


http://hg.python.org/cpython/rev/b196bcd7c34f
changeset: 73978:b196bcd7c34f
branch: 3.2
parent: 73975:541f215a31f7
user: Antoine Pitrou <solipsis at pitrou.net>
date: Thu Dec 15 14:15:31 2011 +0100
summary:
 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.
files:
 Misc/NEWS | 4 ++++
 Objects/typeobject.c | 18 ++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@
 Core and Builtins
 -----------------
 
+- 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.
+
 - Issue #13505: Pickle bytes objects in a way that is compatible with
 Python 2 when using protocols <= 2.
 
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -967,8 +967,6 @@
 assert(basedealloc);
 basedealloc(self);
 
- PyType_Modified(type);
-
 /* Can't reference self beyond this point */
 Py_DECREF(type);
 
@@ -2645,15 +2643,16 @@
 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.
 
@@ -2670,6 +2669,9 @@
 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;
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /