Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.

Patch by Serhiy Storchaka.
This commit is contained in:
Antoine Pitrou 2012-08-15 23:18:25 +02:00
parent dd7c55250d
commit 6f430e4963
11 changed files with 87 additions and 39 deletions

View file

@ -340,11 +340,15 @@ type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context)
abc.ABCMeta.__new__, so this function doesn't do anything
special to update subclasses.
*/
int res;
int abstract, res;
if (value != NULL) {
abstract = PyObject_IsTrue(value);
if (abstract < 0)
return -1;
res = PyDict_SetItemString(type->tp_dict, "__abstractmethods__", value);
}
else {
abstract = 0;
res = PyDict_DelItemString(type->tp_dict, "__abstractmethods__");
if (res && PyErr_ExceptionMatches(PyExc_KeyError)) {
PyErr_SetString(PyExc_AttributeError, "__abstractmethods__");
@ -353,12 +357,10 @@ type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context)
}
if (res == 0) {
PyType_Modified(type);
if (value && PyObject_IsTrue(value)) {
if (abstract)
type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT;
}
else {
else
type->tp_flags &= ~Py_TPFLAGS_IS_ABSTRACT;
}
}
return res;
}