PyEval_CallObjectWithKeywords() uses fast call with kwargs

Issue #27809. _PyObject_FastCallDict() now supports keyword arguments, and so
the args==NULL fast-path can also be used when kwargs is not NULL.
This commit is contained in:
Victor Stinner 2016-08-22 23:26:00 +02:00
parent 2990fa11bc
commit 155ea65e5c
1 changed files with 4 additions and 12 deletions

View File

@ -4590,30 +4590,22 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *args, PyObject *kwargs)
#endif
if (args == NULL) {
if (kwargs == NULL) {
return _PyObject_CallNoArg(func);
}
args = PyTuple_New(0);
if (args == NULL)
return NULL;
return _PyObject_FastCallDict(func, NULL, 0, kwargs);
}
else if (!PyTuple_Check(args)) {
if (!PyTuple_Check(args)) {
PyErr_SetString(PyExc_TypeError,
"argument list must be a tuple");
return NULL;
}
else {
Py_INCREF(args);
}
if (kwargs != NULL && !PyDict_Check(kwargs)) {
PyErr_SetString(PyExc_TypeError,
"keyword list must be a dictionary");
Py_DECREF(args);
return NULL;
}
Py_INCREF(args);
result = PyObject_Call(func, args, kwargs);
Py_DECREF(args);