changeset: 102776:605a42a50496 user: Victor Stinner date: Fri Aug 19 18:26:05 2016 +0200 files: Objects/typeobject.c description: Issue #27128: Cleanup slot_nb_bool() Use an error label to reduce the level of indentation. diff -r 6eb586b85fa1 -r 605a42a50496 Objects/typeobject.c --- a/Objects/typeobject.c Fri Aug 19 18:19:42 2016 +0200 +++ b/Objects/typeobject.c Fri Aug 19 18:26:05 2016 +0200 @@ -5946,44 +5946,60 @@ static int slot_nb_bool(PyObject *self) { - PyObject *func, *args; - int result = -1; + PyObject *func, *args, *value; + int result; int using_len = 0; _Py_IDENTIFIER(__bool__); func = lookup_maybe(self, &PyId___bool__); if (func == NULL) { - if (PyErr_Occurred()) + if (PyErr_Occurred()) { return -1; + } + func = lookup_maybe(self, &PyId___len__); - if (func == NULL) - return PyErr_Occurred() ? -1 : 1; + if (func == NULL) { + if (PyErr_Occurred()) { + return -1; + } + return 1; + } using_len = 1; } + args = PyTuple_New(0); - if (args != NULL) { - PyObject *temp = PyObject_Call(func, args, NULL); - Py_DECREF(args); - if (temp != NULL) { - if (using_len) { - /* enforced by slot_nb_len */ - result = PyObject_IsTrue(temp); - } - else if (PyBool_Check(temp)) { - result = PyObject_IsTrue(temp); - } - else { - PyErr_Format(PyExc_TypeError, - "__bool__ should return " - "bool, returned %s", - Py_TYPE(temp)->tp_name); - result = -1; - } - Py_DECREF(temp); - } - } + if (args == NULL) { + goto error; + } + + value = PyObject_Call(func, args, NULL); + Py_DECREF(args); + if (value == NULL) { + goto error; + } + + if (using_len) { + /* bool type enforced by slot_nb_len */ + result = PyObject_IsTrue(value); + } + else if (PyBool_Check(value)) { + result = PyObject_IsTrue(value); + } + else { + PyErr_Format(PyExc_TypeError, + "__bool__ should return " + "bool, returned %s", + Py_TYPE(value)->tp_name); + result = -1; + } + + Py_DECREF(value); Py_DECREF(func); return result; + +error: + Py_DECREF(func); + return -1; }