Skip to content

Commit 6d48194

Browse files
miss-islingtonsobolevnvstinner
authored
[3.13] gh-132176: Fix crash on type() when tuple subclass passed as bases (GH-132212) (#132548)
gh-132176: Fix crash on `type()` when `tuple` subclass passed as `bases` (GH-132212) (cherry picked from commit b6c552f) Co-authored-by: sobolevn <[email protected]> Co-authored-by: Victor Stinner <[email protected]>
1 parent f218549 commit 6d48194

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
@@ -1778,6 +1778,15 @@ class Model(metaclass=ModelBase):
17781778
with self.assertRaises(RuntimeWarning):
17791779
type("SouthPonies", (Model,), {})
17801780

1781+
def test_tuple_subclass_as_bases(self):
1782+
# gh-132176: it used to crash on using
1783+
# tuple subclass for as base classes.
1784+
class TupleSubclass(tuple): pass
1785+
1786+
typ = type("typ", TupleSubclass((int, object)), {})
1787+
self.assertEqual(typ.__bases__, (int, object))
1788+
self.assertEqual(type(typ.__bases__), TupleSubclass)
1789+
17811790

17821791
class SimpleNamespaceTests(unittest.TestCase):
17831792

Diff for: Objects/typeobject.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,11 @@ _PyType_GetBases(PyTypeObject *self)
439439
static inline void
440440
set_tp_bases(PyTypeObject *self, PyObject *bases, int initial)
441441
{
442-
assert(PyTuple_CheckExact(bases));
442+
assert(PyTuple_Check(bases));
443443
if (self->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN) {
444444
// XXX tp_bases can probably be statically allocated for each
445445
// static builtin type.
446+
assert(PyTuple_CheckExact(bases));
446447
assert(initial);
447448
assert(self->tp_bases == NULL);
448449
if (PyTuple_GET_SIZE(bases) == 0) {

0 commit comments

Comments
 (0)