[3.9] bpo-30570: Use Py_EnterRecursiveCall() in issubclass() (GH-29048) by miss-islington · Pull Request #29178 · python/cpython
def test_infinite_recursion_via_bases_tuple(self): """Regression test for bpo-30570.""" class Failure(object): def __getattr__(self, attr): return (self, None)
with self.assertRaises(RecursionError): issubclass(Failure(), int)
def test_infinite_cycle_in_bases(self): """Regression test for bpo-30570.""" class X: @property def __bases__(self): return (self, self, self) self.assertRaises(RecursionError, issubclass, X(), int)
def test_infinitely_many_bases(self): """Regression test for bpo-30570.""" class X: def __getattr__(self, attr): self.assertEqual(attr, "__bases__") class A: pass class B: pass A.__getattr__ = B.__getattr__ = X.__getattr__ return (A(), B()) self.assertRaises(RecursionError, issubclass, X(), int)
def blowstack(fxn, arg, compare_to): # Make sure that calling isinstance with a deeply nested tuple for its