summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-08-19 14:50:49 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-08-19 14:50:49 (GMT)
commit64faad6e459c207cd1bce1db2fd9053b44b0a4ac (patch)
tree0421d0d3f067f9508f33bd4376937e7e15fbb925 /Objects
parent8880708f8149856b99abf480f913760a64203c39 (diff)
downloadcpython-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.c49
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 *