]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-132176: Fix crash on `type()` when `tuple` subclass passed as `bases` ...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 15 Apr 2025 11:38:20 +0000 (13:38 +0200)
committerGitHub <noreply@github.com>
Tue, 15 Apr 2025 11:38:20 +0000 (11:38 +0000)
gh-132176: Fix crash on `type()` when `tuple` subclass passed as `bases` (GH-132212)
(cherry picked from commit b6c552f9e614bab4acf21584baed997f57e74114)

Co-authored-by: sobolevn <mail@sobolevn.me>
Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/test_types.py
Objects/typeobject.c

index 5e870e5545e48cfaf4f926d5885bc58d90c93267..332f0479c3732e1837708ba75b4a3e606571eff1 100644 (file)
@@ -1778,6 +1778,15 @@ class ClassCreationTests(unittest.TestCase):
         with self.assertRaises(RuntimeWarning):
             type("SouthPonies", (Model,), {})
 
+    def test_tuple_subclass_as_bases(self):
+        # gh-132176: it used to crash on using
+        # tuple subclass for as base classes.
+        class TupleSubclass(tuple): pass
+
+        typ = type("typ", TupleSubclass((int, object)), {})
+        self.assertEqual(typ.__bases__, (int, object))
+        self.assertEqual(type(typ.__bases__), TupleSubclass)
+
 
 class SimpleNamespaceTests(unittest.TestCase):
 
index 6e8064540e51795eb2eeadf894b72b98edb347e8..362ed1772e24f0ba16500fccc8864e76356b9351 100644 (file)
@@ -439,10 +439,11 @@ _PyType_GetBases(PyTypeObject *self)
 static inline void
 set_tp_bases(PyTypeObject *self, PyObject *bases, int initial)
 {
-    assert(PyTuple_CheckExact(bases));
+    assert(PyTuple_Check(bases));
     if (self->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN) {
         // XXX tp_bases can probably be statically allocated for each
         // static builtin type.
+        assert(PyTuple_CheckExact(bases));
         assert(initial);
         assert(self->tp_bases == NULL);
         if (PyTuple_GET_SIZE(bases) == 0) {