changeset: 102759:34af2edface9 user: Victor Stinner date: Fri Aug 19 16:50:49 2016 +0200 files: Objects/abstract.c description: Cleanup call_function_tail() Make call_function_tail() less weird: don't decrement args reference counter, the caller is now responsible to do that. The caller now also checks if args is NULL. Issue #27128. diff -r 7cd479573de9 -r 34af2edface9 Objects/abstract.c --- a/Objects/abstract.c Fri Aug 19 16:44:19 2016 +0200 +++ b/Objects/abstract.c Fri Aug 19 16:50:49 2016 +0200 @@ -2274,8 +2274,7 @@ { PyObject *result; - if (args == NULL) - return NULL; + assert(args != NULL); if (!PyTuple_Check(args)) { result = _PyObject_FastCall(callable, &args, 1, NULL); @@ -2284,7 +2283,6 @@ result = PyObject_Call(callable, args, NULL); } - Py_DECREF(args); return result; } @@ -2292,7 +2290,7 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...) { va_list va; - PyObject *args; + PyObject *args, *result; if (callable == NULL) return null_error(); @@ -2302,19 +2300,23 @@ args = Py_VaBuildValue(format, va); va_end(va); } - else + else { args = PyTuple_New(0); - if (args == NULL) + } + if (args == NULL) { return NULL; - - return call_function_tail(callable, args); + } + + result = call_function_tail(callable, args); + Py_DECREF(args); + return result; } PyObject * _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) { va_list va; - PyObject *args; + PyObject *args, *result; if (callable == NULL) return null_error(); @@ -2324,21 +2326,27 @@ args = _Py_VaBuildValue_SizeT(format, va); va_end(va); } - else + else { args = PyTuple_New(0); - - return call_function_tail(callable, args); + } + if (args == NULL) { + return NULL; + } + + result = call_function_tail(callable, args); + Py_DECREF(args); + return result; } static PyObject* callmethod(PyObject* func, const char *format, va_list va, int is_size_t) { - PyObject *retval = NULL; - PyObject *args; + PyObject *args, *result; if (!PyCallable_Check(func)) { type_error("attribute of type '%.200s' is not callable", func); - goto exit; + Py_XDECREF(func); + return NULL; } if (format && *format) { @@ -2347,16 +2355,17 @@ else args = Py_VaBuildValue(format, va); } - else + else { args = PyTuple_New(0); - - retval = call_function_tail(func, args); - - exit: - /* args gets consumed in call_function_tail */ + } + if (args == NULL) { + return NULL; + } + + result = call_function_tail(func, args); Py_XDECREF(func); - - return retval; + Py_DECREF(args); + return result; } PyObject *