call_method() now uses _PyObject_FastCall()

Issue #29233: Replace the inefficient _PyObject_VaCallFunctionObjArgs() with
_PyObject_FastCall() in call_method() and call_maybe().

Only a few functions call call_method() and call it with a fixed number of
arguments. Avoid the complex and expensive _PyObject_VaCallFunctionObjArgs()
function, replace it with an array allocated on the stack with the exact number
of argumlents.

It reduces the stack consumption, bytes per call, before => after:

test_python_call: 1168 => 1152 (-16 B)
test_python_getitem: 1344 => 1008 (-336 B)
test_python_iterator: 1568 => 1232 (-336 B)

Remove the _PyObject_VaCallFunctionObjArgs() function which became useless.
Rename it to object_vacall() and make it private.
This commit is contained in:
Victor Stinner 2017-01-11 00:07:40 +01:00
parent dbdfecebd2
commit 434723f94c
3 changed files with 66 additions and 52 deletions

View file

@ -323,14 +323,6 @@ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj,
PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable,
...);
#ifndef Py_LIMITED_API
/* Similar PyObject_CallFunctionObjArgs(), but pass positional arguments
as a va_list: list of PyObject* object. */
PyAPI_FUNC(PyObject *) _PyObject_VaCallFunctionObjArgs(
PyObject *callable,
va_list vargs);
#endif
/* Call the method named 'name' of object 'obj' with a variable number of
C arguments. The C arguments are provided as PyObject* values, terminated
by NULL.