]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #23726: Don't enable GC for user subclasses of non-GC types that don't add...
authorAntoine Pitrou <solipsis@pitrou.net>
Mon, 13 Apr 2015 18:10:06 +0000 (20:10 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Mon, 13 Apr 2015 18:10:06 +0000 (20:10 +0200)
Patch by Eugene Toder.

Lib/test/test_descr.py
Lib/test/test_gc.py
Misc/NEWS
Objects/typeobject.c

index cdaae0ac697f5f7df378cb3dd063578e0130459a..9f3d34d1e49d6ffb334f5ac75ef39ab412e6ef7f 100644 (file)
@@ -3020,8 +3020,6 @@ order (MRO) for bases """
         cant(object(), list)
         cant(list(), object)
         class Int(int): __slots__ = []
-        cant(2, Int)
-        cant(Int(), int)
         cant(True, int)
         cant(2, bool)
         o = object()
index 2ac1d4bb64259d6a15d49723454e0140e2e9a7c1..254f64b2b828f49226470ece28633d10e49ba3a1 100644 (file)
@@ -546,11 +546,31 @@ class GCTests(unittest.TestCase):
 
         class UserClass:
             pass
+
+        class UserInt(int):
+            pass
+
+        # Base class is object; no extra fields.
+        class UserClassSlots:
+            __slots__ = ()
+
+        # Base class is fixed size larger than object; no extra fields.
+        class UserFloatSlots(float):
+            __slots__ = ()
+
+        # Base class is variable size; no extra fields.
+        class UserIntSlots(int):
+            __slots__ = ()
+
         self.assertTrue(gc.is_tracked(gc))
         self.assertTrue(gc.is_tracked(UserClass))
         self.assertTrue(gc.is_tracked(UserClass()))
+        self.assertTrue(gc.is_tracked(UserInt()))
         self.assertTrue(gc.is_tracked([]))
         self.assertTrue(gc.is_tracked(set()))
+        self.assertFalse(gc.is_tracked(UserClassSlots()))
+        self.assertFalse(gc.is_tracked(UserFloatSlots()))
+        self.assertFalse(gc.is_tracked(UserIntSlots()))
 
     def test_bug1055820b(self):
         # Corresponds to temp2b.py in the bug report.
index 3254a70d102c753958d7ce91acaa722e4d5517ac..242cfcd1d3661959514d6ac3a193b0040253142d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: XXX
 Core and Builtins
 -----------------
 
+- Issue #23726: Don't enable GC for user subclasses of non-GC types that
+  don't add any new fields.  Patch by Eugene Toder.
+
 - Issue #23309: Avoid a deadlock at shutdown if a daemon thread is aborted
   while it is holding a lock to a buffered I/O object, and the main thread
   tries to use the same I/O object (typically stdout or stderr).  A fatal
index 030dc1f836171bd7101c42a0290335196ea1999a..0e54fe60b0f4e628f7c9acf22f69d1764d936c03 100644 (file)
@@ -2645,9 +2645,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
     }
     type->tp_dealloc = subtype_dealloc;
 
-    /* Enable GC unless there are really no instance variables possible */
-    if (!(type->tp_basicsize == sizeof(PyObject) &&
-          type->tp_itemsize == 0))
+    /* Enable GC unless this class is not adding new instance variables and
+       the base class did not use GC. */
+    if ((base->tp_flags & Py_TPFLAGS_HAVE_GC) ||
+        type->tp_basicsize > base->tp_basicsize)
         type->tp_flags |= Py_TPFLAGS_HAVE_GC;
 
     /* Always override allocation strategy to use regular heap */