call_function_tail() uses fast call

Issue #27128: Modify call_function_tail() to use _PyObject_FastCall() when args
is not a tuple to avoid the creation of a temporary tuple.

call_function_tail() is used by:

* PyObject_CallFunction()
* PyObject_CallMethod()
* _PyObject_CallMethodId()
This commit is contained in:
Victor Stinner 2016-08-19 16:44:19 +02:00
parent 3f745bf1d9
commit 8880708f81
1 changed files with 6 additions and 13 deletions

View File

@ -2272,27 +2272,20 @@ exit:
static PyObject*
call_function_tail(PyObject *callable, PyObject *args)
{
PyObject *retval;
PyObject *result;
if (args == NULL)
return NULL;
if (!PyTuple_Check(args)) {
PyObject *a;
a = PyTuple_New(1);
if (a == NULL) {
Py_DECREF(args);
return NULL;
}
PyTuple_SET_ITEM(a, 0, args);
args = a;
result = _PyObject_FastCall(callable, &args, 1, NULL);
}
else {
result = PyObject_Call(callable, args, NULL);
}
retval = PyObject_Call(callable, args, NULL);
Py_DECREF(args);
return retval;
return result;
}
PyObject *