// Compute tp_mro for this type and all of its subclasses. This
// is called after __bases__ is assigned to an existing type.
static int
-mro_hierarchy(PyTypeObject *type, PyObject *temp)
+mro_hierarchy_for_complete_type(PyTypeObject *type, PyObject *temp)
{
ASSERT_TYPE_LOCK_HELD();
return res;
}
PyObject *new_mro = lookup_tp_mro(type);
+ assert(new_mro != NULL);
PyObject *tuple;
if (old_mro != NULL) {
Py_ssize_t n = PyList_GET_SIZE(subclasses);
for (Py_ssize_t i = 0; i < n; i++) {
PyTypeObject *subclass = _PyType_CAST(PyList_GET_ITEM(subclasses, i));
- res = mro_hierarchy(subclass, temp);
+ res = mro_hierarchy_for_complete_type(subclass, temp);
if (res < 0) {
break;
}
if (temp == NULL) {
goto bail;
}
- if (mro_hierarchy(type, temp) < 0) {
+ if (mro_hierarchy_for_complete_type(type, temp) < 0) {
goto undo;
}
Py_DECREF(temp);
*/
PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, 0));
PyObject *base_mro = lookup_tp_mro(base);
+ assert(base_mro != NULL);
Py_ssize_t k = PyTuple_GET_SIZE(base_mro);
PyObject *result = PyTuple_New(k + 1);
if (result == NULL) {
return NULL;
}
+ PyObject *mro_to_merge;
for (Py_ssize_t i = 0; i < n; i++) {
PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, i));
- to_merge[i] = lookup_tp_mro(base);
+ mro_to_merge = lookup_tp_mro(base);
+ assert(mro_to_merge != NULL);
+ to_merge[i] = mro_to_merge;
}
to_merge[n] = bases;
// Inherit slots
PyObject *mro = lookup_tp_mro(type);
+ assert(mro != NULL);
Py_ssize_t n = PyTuple_GET_SIZE(mro);
for (Py_ssize_t i = 1; i < n; i++) {
PyObject *b = PyTuple_GET_ITEM(mro, i);