Skip to content

Commit b6c552f

Browse files
sobolevnvstinner
andauthored
gh-132176: Fix crash on type() when tuple subclass passed as bases (#132212)
Co-authored-by: Victor Stinner <[email protected]>
1 parent e10fe81 commit b6c552f

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

Diff for: Lib/test/test_types.py

+9
Original file line numberDiff line numberDiff line change
@@ -1838,6 +1838,15 @@ class Model(metaclass=ModelBase):
18381838
with self.assertRaises(RuntimeWarning):
18391839
type("SouthPonies", (Model,), {})
18401840

1841+
def test_tuple_subclass_as_bases(self):
1842+
# gh-132176: it used to crash on using
1843+
# tuple subclass for as base classes.
1844+
class TupleSubclass(tuple): pass
1845+
1846+
typ = type("typ", TupleSubclass((int, object)), {})
1847+
self.assertEqual(typ.__bases__, (int, object))
1848+
self.assertEqual(type(typ.__bases__), TupleSubclass)
1849+
18411850

18421851
class SimpleNamespaceTests(unittest.TestCase):
18431852

Diff for: Objects/typeobject.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -497,10 +497,11 @@ _PyType_GetBases(PyTypeObject *self)
497497
static inline void
498498
set_tp_bases(PyTypeObject *self, PyObject *bases, int initial)
499499
{
500-
assert(PyTuple_CheckExact(bases));
500+
assert(PyTuple_Check(bases));
501501
if (self->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN) {
502502
// XXX tp_bases can probably be statically allocated for each
503503
// static builtin type.
504+
assert(PyTuple_CheckExact(bases));
504505
assert(initial);
505506
assert(self->tp_bases == NULL);
506507
if (PyTuple_GET_SIZE(bases) == 0) {

0 commit comments

Comments
 (0)