diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index e7e4a8f2bb8..faa9d89bdc8 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -3019,7 +3019,23 @@ class MyStr(str): except: raise TestFailed, "string subclass allowed as exception" +def do_this_first(): + if verbose: + print "Testing SF bug 551412 ..." + # This dumps core when SF bug 551412 isn't fixed -- + # but only when test_descr.py is run separately. + # (That can't be helped -- as soon as PyType_Ready() + # is called for PyLong_Type, the bug is gone.) + class UserLong(object): + def __pow__(self, *args): + pass + try: + pow(0L, UserLong(), 0L) + except: + pass + def test_main(): + do_this_first() class_docstrings() lists() dicts() diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 61cbeae3777..af133eadc2f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1221,6 +1221,12 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) /* Look in tp_dict of types in MRO */ mro = type->tp_mro; + if (mro == NULL) { + if (PyType_Ready(type) < 0) + return NULL; + mro = type->tp_mro; + assert(mro != NULL); + } assert(PyTuple_Check(mro)); n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) {