Skip to content

Commit

Permalink
Issue #26906: Resolving special methods of uninitialized type now causes
Browse files Browse the repository at this point in the history
implicit initialization of the type instead of a fail.
  • Loading branch information
serhiy-storchaka committed Oct 8, 2016
1 parent 1c1130f commit 8ef3460
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins
-----------------

- Issue #26906: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

- Issue #18287: PyType_Ready() now checks that tp_name is not NULL.
Original patch by Niklas Koep.

Expand Down
24 changes: 19 additions & 5 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -2869,11 +2869,25 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
/* Look in tp_dict of types in MRO */
mro = type->tp_mro;

/* If mro is NULL, the type is either not yet initialized
by PyType_Ready(), or already cleared by type_clear().
Either way the safest thing to do is to return NULL. */
if (mro == NULL)
return NULL;
if (mro == NULL) {
if ((type->tp_flags & Py_TPFLAGS_READYING) == 0 &&
PyType_Ready(type) < 0) {
/* It's not ideal to clear the error condition,
but this function is documented as not setting
an exception, and I don't want to change that.
When PyType_Ready() can't proceed, it won't
set the "ready" flag, so future attempts to ready
the same type will call it again -- hopefully
in a context that propagates the exception out.
*/
PyErr_Clear();
return NULL;
}
mro = type->tp_mro;
if (mro == NULL) {
return NULL;
}
}

res = NULL;
/* keep a strong reference to mro because type->tp_mro can be replaced
Expand Down

0 comments on commit 8ef3460

Please sign in to comment.