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.
# check here that E's gets restored.
E_mro_before = E.__mro__
+ D_mro_before = D.__mro__
try:
D.__bases__ = (C2,)
except RuntimeError:
vereq(E.__mro__, E_mro_before)
+ vereq(D.__mro__, D_mro_before)
else:
raise TestFailed, "exception not propagated"
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);
Py_INCREF(cls->tp_mro);
}
Py_DECREF(temp);
- return r;
+ goto bail;
}
Py_DECREF(temp);
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 *