I don't know why staring at the email to python-checkins made me

see problems with my code that I didn't see before the checkin, but:

When a subtype .mro() fails, we need to reset the type whose __bases__
are being changed, too.  Fix + test.
This commit is contained in:
Michael W. Hudson 2002-11-27 15:40:09 +00:00
parent 586da8fddd
commit 7e7c00db0c
2 changed files with 16 additions and 9 deletions

View file

@ -242,17 +242,12 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context)
type->tp_base = new_base;
if (mro_internal(type) < 0) {
type->tp_bases = old_bases;
type->tp_base = old_base;
type->tp_mro = old_mro;
Py_DECREF(value);
Py_DECREF(new_base);
return -1;
goto bail;
}
temp = PyList_New(0);
if (!temp)
goto bail;
r = mro_subclasses(type, temp);
@ -267,7 +262,7 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context)
Py_INCREF(cls->tp_mro);
}
Py_DECREF(temp);
return r;
goto bail;
}
Py_DECREF(temp);
@ -303,6 +298,16 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context)
Py_DECREF(old_mro);
return r;
bail:
type->tp_bases = old_bases;
type->tp_base = old_base;
type->tp_mro = old_mro;
Py_DECREF(value);
Py_DECREF(new_base);
return -1;
}
static PyObject *