diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-08-19 14:50:49 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-08-19 14:50:49 (GMT) |
commit | 64faad6e459c207cd1bce1db2fd9053b44b0a4ac (patch) | |
tree | 0421d0d3f067f9508f33bd4376937e7e15fbb925 /Objects | |
parent | 8880708f8149856b99abf480f913760a64203c39 (diff) | |
download | cpython-64faad6e459c207cd1bce1db2fd9053b44b0a4ac.zip cpython-64faad6e459c207cd1bce1db2fd9053b44b0a4ac.tar.gz cpython-64faad6e459c207cd1bce1db2fd9053b44b0a4ac.tar.bz2 |
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.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/abstract.c | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 1a63c6b..64b8e90 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2274,8 +2274,7 @@ call_function_tail(PyObject *callable, PyObject *args) { 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 @@ call_function_tail(PyObject *callable, PyObject *args) result = PyObject_Call(callable, args, NULL); } - Py_DECREF(args); return result; } @@ -2292,7 +2290,7 @@ PyObject * 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 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...) 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 @@ _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) args = _Py_VaBuildValue_SizeT(format, va); va_end(va); } - else + else { args = PyTuple_New(0); + } + if (args == NULL) { + return NULL; + } - return call_function_tail(callable, args); + 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 @@ callmethod(PyObject* func, const char *format, va_list va, int is_size_t) else args = Py_VaBuildValue(format, va); } - else + else { args = PyTuple_New(0); + } + if (args == NULL) { + return NULL; + } - retval = call_function_tail(func, args); - - exit: - /* args gets consumed in call_function_tail */ + result = call_function_tail(func, args); Py_XDECREF(func); - - return retval; + Py_DECREF(args); + return result; } PyObject * |